嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- e& \. }4 y! M& z% V" I3 Z/ \& X5 f" |) I) o  [6 B6 x- N2 w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( d% _: c6 z6 M5 K#include <unistd.h>
( Y# B& Y' G. R: Z7 m3 ?: ~#include <sys/mman.h>
3 l) R$ C& c4 J6 n% M4 Y3 S' s#include <sys/types.h>
, }5 Z+ D! f# n8 b5 V# R#include <fcntl.h>
$ k7 u6 Y3 c" z
8 G/ u. @* \" K/ x, e5 x3 O8 o#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# l9 ^+ C' N7 p/ c% U7 i& }! N1 S5 x5 P7 W
typedef struct
$ n5 A0 e5 j9 H& D{
. W; [' N; B' i' _- m- R4 V        unsigned int a;
; p3 @; v/ ^  a, F; H5 ^* M3 C        unsigned int b;4 l; U. Q/ y; G2 K( q! c7 E
        unsigned int packet_cout;
5 P( a% C' ?3 l# Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) }& a, S) r: q$ g% ?9 z# B
* q6 |5 F0 ?, N7 i3 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 y9 J* H) \- W( q2 Tunsigned int count_copy = 0;$ I& N4 l  B/ h' q2 Z  M% f1 F

9 H7 `: Y( T' `, ?0 V' e/ [& z( r9 f
int main()( |0 ]' t$ ~& {% n6 j
{: C" r. o5 P6 j8 H/ z9 c& J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; t0 f1 b6 G# J. j+ F& G/ P+ a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 h( z$ \! W, S; x3 n
  e' a1 O0 b+ j& ?0 A
        while(1)
7 q  g, F  S# j* f        {9 b8 A( P$ {# V! F$ M
                read_MSG_buffer(pshreRAM);3 k! l; W# n, Z- M0 K8 k
        }               
$ j; }. J# ]4 M  ]3 T) n}
) ?' G- O( w: K7 ]
1 g+ a: y$ s( z1 j2 M0 P! M2 [$ i) Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 _' [, w& J7 n/ m& f8 n" f{
8 Q( w" p8 N6 s  t        RX_MSG_PROTOCOL buf;
' J5 `# s& u7 }; _0 B        
; K: ~- O% A, s0 f) D: s        buf.a = pshreRAM->a;
8 e2 q+ w7 x: G  x  d2 H        buf.b = pshreRAM->b;7 O0 L( ?: [' S& m+ a. X; }
        buf.packet_cout = pshreRAM->packet_cout;0 l4 B$ {1 v8 x
        : x5 T' J# e9 p. v4 w! n; }$ C6 U
        if(buf.packet_cout != count_copy)
+ a/ r, H: Z" W& J        {
0 d2 c+ w* I7 C8 m+ y7 w4 O                printf("a is %d\n", buf.a);
1 b6 I# P: _9 ?- K# B  f) b0 A- t3 B                printf("b is %d\n", buf.b);0 Y0 h* ]1 @3 s# J
                printf("count is %d\n", buf.packet_cout);
; n5 @/ I+ U! q3 B7 i                count_copy = buf.packet_cout;" y" Z) o1 W( Q, N1 ?4 S
        }0 \, D: B+ M6 Y( Y. V) t* i5 O6 P( ?( ?
        else
( @) r) Y  g8 Y6 z5 L: j8 H# [7 J+ C        {6 i6 S" B( Z; O
                printf("No effective message!");
9 U; h0 W, b$ H9 l- L( @4 S        }+ }( q+ [" O0 X$ D1 |9 M: @/ b
}
+ i4 k% j4 G' d2 |4 X( a$ _& W% T5 s: d8 f' C9 C- f
4 l5 C( V' B/ R9 ~, G% v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! o) q4 m& m# B+ `
使用下面代码,对内存使用了mmap函数后:8 g8 e9 N6 ~3 r! |
#include <stdio.h>
$ ~* X: L& N. k1 W#include <unistd.h>  Z$ p* `. X5 y6 w+ k% [% z- ~
#include <sys/mman.h>/ u, m1 P: t2 h# j7 q2 R9 Q) V! k
#include <sys/types.h>
; b. z, V( u* Q#include <fcntl.h>
% {6 b  N4 ]. l5 i( M1 D, V: |, z* ~+ N* b$ h8 K3 J
#define SHAER_RAM_BASE_ADDR    (0x80000000)% |# b$ @, U7 p' t/ w
#define SHAER_RAM_SIZE         (0x20000)   
# N0 Y- h; o# I7 [4 S: D; `
9 \9 ~9 E) e0 T5 J! j" Ltypedef struct
: h( x* q$ P2 t9 q* h* U* H9 @{
4 `# X% T# {2 D- \- X* z- P        unsigned int a;
/ P* ]- V8 b; J6 O+ U" F        unsigned int b;: U0 J6 \; C+ g# x; \
        unsigned int packet_cout;
- I. p* }% [8 n' `; P5 J- r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 Z; W! O2 T. n" p9 ?

' J' ^1 k  g3 V: l4 |% U' W* ?void read_MSG_buffer(int *baseaddr);
# ^6 E3 i' ~, B* d/ h) B2 }( G" g2 C% {unsigned int count_copy = 0;
7 \$ T( c% R5 @8 _+ K# g+ q3 Y: K
int main()1 G: d4 `( `& [/ X! f6 R; G" g
{
$ O; G) G/ H8 W2 n! \$ n        int fd;
3 s0 W8 N; I7 ~5 W! L        int *mem = NULL;
7 m: h+ W  D& P. l
- {# f7 {: y) z* s& M( {5 i        if((fd = open("/dev/mem", O_RDWR)) <0)' q. e; N* ~  R) M
        {
. T5 G! J: v% t9 L) C- O                perror("open error");
# U; K4 j. N/ r- G/ {, j( l                return -1;
. s/ v4 ?& p$ T  E5 x& d        }. _5 i6 `, N0 f5 w4 N7 v
        ' i1 ^% }' K4 n) H& A2 x5 o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 {8 I+ u3 |! W; l- f) J
7 ^8 D4 C$ E; }# o2 {# V2 A        while(1)
4 o+ I/ Z% |; A+ |* _6 Q, W        {! o+ ]. Q5 w" M  `/ \4 v" S' a; g2 a, k7 F
                read_MSG_buffer(mem);# p1 j6 g8 R8 c! G- |/ z
        }               
8 T- g8 R6 j% {# r1 E1 o; ^* }  }}
, f' H% q0 U* ?8 I+ b4 `: {+ n
. S, k& {0 k! x3 F9 lvoid read_MSG_buffer(int *baseaddr)) M2 B5 G7 }9 Z" ~2 H
{
( C1 M1 N* F3 u        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 b7 b' r' Z, y4 x  o) z; q. }" J9 i( [8 t& A+ h' \  N( P& Q  g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- d! S- D0 ^. x+ {9 i  n
; ]  h! J9 K8 [        if(pshreRAM->packet_cout != count_copy)3 R9 r5 R$ W" K
        {
0 \+ R* M/ E% X# o: N0 W6 u# L5 i                printf("a is %d\n", pshreRAM->a);/ c4 f( u) b, V$ Q) p7 a- N! d' M
                printf("b is %d\n", pshreRAM->b);
, m) M  g; p& `; x& H4 z                printf("count is %d\n", pshreRAM->packet_cout);# v1 m& b* |. s
                count_copy = pshreRAM->packet_cout;& Z; X8 f& ~3 W2 X' z: z: j
        }
! D4 f! `- I( q9 e        else, \/ }  Y. s4 o, S2 j
        {2 _, _. V. F; z8 U* ~
                printf("No effective message!\n");
% w/ L" d8 p& H8 k3 ~" L        }. |3 O. a* F5 P3 G
}
) N3 l3 }( x5 d5 N0 K4 [0 f
  Q$ {; \1 p5 q% G6 f0 L( G. K" @% P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' W# B6 `% N# X# H% @7 q: F" ]
8 o- E0 F9 s4 |! b! i: m4 m" E; L  [& k
" l" g' t0 g% `/ O" R) c4 |5 u; w

8 z! Z- H, ^; i6 }* w) f, Y
( K# L5 }! W- J' Y+ x& T




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4