OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5987|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / p9 H8 M: g1 ~& V6 Z
9 T* N+ A$ p" P$ x; R1 y) c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( ~# B* K! r: `# j
#include <unistd.h>3 C" y5 l8 H3 {2 ^3 k4 l
#include <sys/mman.h>6 B) r- m8 N# z( d- |8 c% i' ?; y
#include <sys/types.h>
: ?5 P5 J- Q& N0 K* j#include <fcntl.h>
$ ^/ R8 O* H9 `% J: m8 G+ s2 Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 Q4 ^* b6 d( K8 q$ T: ~  T5 _
4 J' b" `* a2 Y6 ?typedef struct
2 J8 S2 L! i* E3 c8 c! {; T5 l6 }{
8 q2 r1 r& T9 c3 v# V4 z        unsigned int a;
+ ?8 C/ @5 C3 `7 e( G/ N        unsigned int b;
/ T: F2 [: b/ ?        unsigned int packet_cout;7 t% }, ?: ~( x; M1 X) E' r+ K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! a/ }* [3 F8 j- X. M" K* W' `' }8 s
! j% H5 r% T* {3 F3 |5 O$ P! W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- L+ P( }  ~+ vunsigned int count_copy = 0;
( W( Y2 M; s; P) X. V2 S2 S6 H: v. E5 J! }

, X" i* ]6 ^# Q9 ^( wint main()- N2 e9 L; c0 f# S4 Z/ {
{
+ d% Q$ {& y: m/ o        pRX_MSG_PROTOCOL pshreRAM = NULL;3 \, Z8 W8 ]2 U! `2 S; F* p6 S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 j- }, J( b" |, I2 `0 P$ T! q/ ?+ }& l/ T
        while(1)
2 @% Q: [( H% l! K3 d& |* b& e        {! H  d0 F$ x* F- \2 O# \/ C
                read_MSG_buffer(pshreRAM);+ F, C2 D" T( D/ a
        }               
( ^0 J# n# C7 o) w}/ |5 ~# M# v. u- a" {8 u1 ~
7 [! w- V' O' }0 A: m" `" ~% ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! B1 l6 Y/ v2 L4 J
{
1 a/ [. h0 S# o" A( {7 X        RX_MSG_PROTOCOL buf;; X; b$ u8 l  A. X5 h3 L
        
9 W" o2 C3 L# V* M2 i! r. W: O& d        buf.a = pshreRAM->a;( L0 U( W( E' u6 r/ U5 |
        buf.b = pshreRAM->b;7 T' F& Y( G$ B) {2 ]
        buf.packet_cout = pshreRAM->packet_cout;
) o- X. j$ `9 r        
0 S: X4 ?' a! F& I        if(buf.packet_cout != count_copy)7 t9 M, a" G3 f8 I
        {6 i. b5 a1 M, N
                printf("a is %d\n", buf.a);
/ [5 m$ B- _3 O( }                printf("b is %d\n", buf.b);
+ C' S$ K* R: C" O8 V                printf("count is %d\n", buf.packet_cout);
/ s9 N7 g5 P# h/ M                count_copy = buf.packet_cout;2 {, F9 @7 I+ g" W; j, |
        }- L7 \% `% q3 Q8 t& k
        else9 u$ y* M2 I2 a% g4 Q
        {% j* _( L2 a  z) T* @
                printf("No effective message!");# D2 j% T* {1 \$ E
        }4 U. d  l* B' e6 J$ a  g+ l% B" |4 _
}) m  @  ~6 @3 m7 F
/ G) j( V- P, K3 f+ Q4 \, ~# g
4 @( M( X) v& s: h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( |' n+ m, z8 L2 A使用下面代码,对内存使用了mmap函数后:" M0 a3 O! }; z. P6 x. o
#include <stdio.h>
5 L1 d( l8 l& F4 ^#include <unistd.h>4 V8 P# K$ [5 w# @, i
#include <sys/mman.h>0 n% N+ r% C& B  u. v  l
#include <sys/types.h>
  }; X: A( P$ c. ~% d( k. F3 a#include <fcntl.h>* \& O- ]; t5 B  T# k5 G

1 i  b4 t0 H' ^+ v' j- v+ \#define SHAER_RAM_BASE_ADDR    (0x80000000)$ ^  r) T. o. p) v2 U
#define SHAER_RAM_SIZE         (0x20000)   # F/ K( M( N) C3 `: C% b

$ S# }' I4 h, Vtypedef struct
, s2 [$ r' b$ H$ e+ R- ~{
- V# ^/ M3 b6 e) W4 s        unsigned int a;
( D1 G" ~- H* W        unsigned int b;
! P7 f# t' H# D  f& d" ~        unsigned int packet_cout;
3 b* j& w' Z" R0 C! K, n6 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ^* q* g/ _# y  E* W$ V
2 H/ C0 G. C* R( C5 y" Lvoid read_MSG_buffer(int *baseaddr);
; q, X1 B0 i0 B" A& aunsigned int count_copy = 0;
2 z/ T# K0 f  U7 u' l
, J& K+ O/ n2 C0 ~# ?int main()
& w. {8 C5 g1 n- q8 d{
; ~9 f! o' @0 `5 X9 H( B5 J        int fd;
+ n0 _$ L3 b5 r) E4 N        int *mem = NULL;
# p8 o2 r  ?1 q, `: G+ Y4 |; V1 s3 Q( g) u0 N8 d, f# Z
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 U( h) t. i. m( h4 W        {
  {4 V- D2 Y; p/ a9 h                perror("open error");% H, q- g5 Z0 e- N" |
                return -1;
: G# a- M: S; U4 G0 o: v        }$ Z/ I( ]5 |" ~% x7 ?
        
+ I0 Y1 b) r0 A! d, [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, u1 J" W6 a& u5 R
8 g# N7 o2 b6 v. r1 _1 v        while(1)
% V/ t* @- p" s; j3 ]. g9 s        {' G3 x7 b, D5 R! n, t+ u
                read_MSG_buffer(mem);' V, E4 ]8 B' q: T
        }               
$ k8 u+ e( y2 B}
9 K( Y& m& V8 S5 K
: O- y" c$ O: c4 \- }4 mvoid read_MSG_buffer(int *baseaddr)
3 W9 D' a/ _9 g" Q3 O8 A- S{  X: ~5 c8 ?- w9 {
        pRX_MSG_PROTOCOL pshreRAM = NULL;. q: j- K6 x3 @3 F

/ T+ v& m+ K9 _% p0 G) U+ X        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ w8 x' P( X  N/ n* A6 Y  h  B
% G* P1 [8 \/ U/ u        if(pshreRAM->packet_cout != count_copy)
1 ~. l0 z% v  I! z        {
) k0 ^0 L/ t3 y- ^9 l                printf("a is %d\n", pshreRAM->a);3 m! R: [  e. g! U& w9 T: w- J- T4 t
                printf("b is %d\n", pshreRAM->b);+ l* I* R8 e0 t( Y
                printf("count is %d\n", pshreRAM->packet_cout);
9 L0 y- K& b: w# t) @: L3 B                count_copy = pshreRAM->packet_cout;" U; E! y! d9 F  D% Y
        }
2 v8 t  h( i8 K        else
6 E0 v1 w9 {9 H/ B7 {0 Z& ]8 n2 Y        {/ ?, Y$ k# ]. H/ P! s' h
                printf("No effective message!\n");4 l) ^: F3 Z* N% c# p' i% v/ a
        }$ Q, J: c) G4 p' L" }# g
}
: v2 c; i( f" A& b# T& f, b1 T, T+ D" D3 E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- C% Z* v! l# ^5 c9 A9 ?$ k1 @9 H/ Z+ D+ c

8 w8 h7 |) W. M. ]4 [& Z+ V$ N  ^
- n8 w- ~3 p! V( q; G- K  L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-25 19:43 , Processed in 0.040358 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表