嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 |8 Q. D4 r0 g; ]2 j" W+ W
3 y& w9 `' c5 O! Q7 R6 u! hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# B# {$ v# Y5 S8 h# ]#include <unistd.h>
7 @5 \+ M. _) T* A  A#include <sys/mman.h>
" D% j3 T& V! d7 ^% \$ H5 @#include <sys/types.h>
& O( b0 z5 f3 Y' W  [* i  z#include <fcntl.h>
- M! X2 s3 }; u( k" S7 ^
' v% s; a7 d, c  A; U4 W& `; X" B( N#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) U8 p2 e5 f2 C8 g6 K) g' s% D3 c

6 u, V* {, f5 }! U& \3 D+ ztypedef struct0 O( Z; p3 j" E+ `9 C3 n
{
4 |' m. n+ F. A, {. \        unsigned int a;
4 d" ]/ I& ]  x( x        unsigned int b;
" [0 l+ i# J% l" e- q& @        unsigned int packet_cout;* I- e3 k* x2 g5 c) z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: g' b0 x0 i3 W7 M) j. y3 `* N
6 o! ]: L! M3 P/ X# Y+ S) hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' `3 ?: K( b8 r7 m  W# _
unsigned int count_copy = 0;" Z9 y+ O4 j) m4 ^6 {6 M

, f3 c/ j4 g/ Q0 C/ v7 _; R: O
) r3 `+ s/ m8 h' P% rint main()
' K- ~7 p) J# ]- {3 {{
7 r8 q! m' T2 N3 D- `        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 g+ T0 b/ F6 D/ \' y. |3 u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 Y& U! G2 N8 B8 ^; s

8 Y# t6 e) M2 Y! t! e& z8 j        while(1)' r. {# p6 J9 w. _/ }+ U
        {
2 j5 x( t- V6 B1 h& E6 R+ d. i                read_MSG_buffer(pshreRAM);% O1 ?% K$ V" p8 ?
        }               
( {0 ]2 u- q- X6 X}
' n2 v/ _8 u% M; h1 @
; h9 L% G# a% v" n5 vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( w) x! r5 x8 H: u
{3 s: {, s, B9 X3 g: D. |; C* A
        RX_MSG_PROTOCOL buf;% H! |  X9 f! F$ t8 l
        
+ d% D9 p3 ~" j9 d, {5 }- x        buf.a = pshreRAM->a;
: F- F9 S! e% S% T5 I        buf.b = pshreRAM->b;$ Y* t) C6 _0 z  d/ A; x" J
        buf.packet_cout = pshreRAM->packet_cout;
# U8 y' c7 D: q, X+ U4 c4 l        - _8 h* P7 z4 b! I$ p
        if(buf.packet_cout != count_copy)! O) S( l+ g! U+ ]$ N1 @
        {
7 r4 H7 C, q$ [                printf("a is %d\n", buf.a);5 K* R2 ~. y8 {
                printf("b is %d\n", buf.b);! T3 L; g6 r9 {9 Y: i5 g
                printf("count is %d\n", buf.packet_cout);5 `- P" r  s4 ]) P, S
                count_copy = buf.packet_cout;
0 M: G/ Q; e8 j* t; w        }/ x: S8 z6 @! D; P. i) r
        else
1 g( D6 z: [6 x& \9 L        {
* v0 n' }1 w! G9 X; ~& V% g. `                printf("No effective message!");
$ Y; K6 V' A0 ]        }5 X: @8 ^2 l4 V
}
& \/ _6 l, J$ s. V, Y# \0 d0 m, _, i5 E. S  A
2 A* W& v/ i* d& `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" \" S7 @' E. ]& o* u0 \
使用下面代码,对内存使用了mmap函数后:
, Q. h7 M' I- L& [/ H# M#include <stdio.h>
6 L9 I# T. C% z. m) ?& ]#include <unistd.h>' g+ I/ M# l: W2 [& T1 v
#include <sys/mman.h>, Y- r9 n1 W5 r, D! b1 s; }9 H
#include <sys/types.h>
9 z8 ^; n& f% C0 w5 m4 r$ _#include <fcntl.h>
! T" W. o$ d% t6 R* V$ D  N- U3 @( [% `' x1 v/ x0 c
#define SHAER_RAM_BASE_ADDR    (0x80000000)( c9 ~7 f5 {/ g+ n. }
#define SHAER_RAM_SIZE         (0x20000)   / H% e+ \/ y8 P0 z! N
6 N# k# L3 o# e; g
typedef struct; u% u0 T0 f' h5 b% c
{
. S7 |; {( }; ^1 c' r        unsigned int a;9 V. L3 @) F9 O& R- _
        unsigned int b;
( O/ w% X8 K3 v# L7 o' x        unsigned int packet_cout;
4 R1 S4 C. u$ ]  C5 A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 q7 K7 W/ c! d$ @/ Y" _: d

# V# A% v0 @, D; _2 F# Y. H; Ovoid read_MSG_buffer(int *baseaddr);
3 U8 P% E) m% F  K* Eunsigned int count_copy = 0;
, `8 d1 L; v1 ]4 g7 _
* g# f5 Y3 Z; n' u7 l( }! h/ gint main()  p% y6 w2 T3 E. T4 n' w0 n
{
0 `& p7 w% f% ]; Z        int fd;* I) E7 a  r' b2 G% r2 q; h& T
        int *mem = NULL;
! L( `$ U$ ^8 o( t3 P2 e
8 B, f; }: B# r7 v8 D& L        if((fd = open("/dev/mem", O_RDWR)) <0)
( }* B" n" x6 @0 G) f3 {        {, L/ R. W0 N* \% V2 v6 @/ t0 @
                perror("open error");  [" M* c; G" g' m" y* I* d0 Q
                return -1;% Y6 N- V7 c) K- m  V# r, M" L
        }; ~6 ^2 E9 I* D7 O/ H: O: Q
        ! p% _$ g( m' S; V% u6 X! N' ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 D% |: ~  P+ G
$ T7 R. q. X# @& [: x3 L6 a  ~        while(1)
) ?8 B9 S* A# V4 q7 \3 v. j        {: |4 c4 ^1 n% m. k* n1 A
                read_MSG_buffer(mem);7 z+ |. a7 L& h7 s7 U
        }                $ M( t9 H* J1 _  ]+ _7 l' G( w' ?( d
}
: \3 q; D( e6 ]. D/ v
; z7 x; q, V* q9 J3 R3 J+ cvoid read_MSG_buffer(int *baseaddr)
1 s! I8 t9 o* F9 {4 v3 T{
) R0 h! D4 K& P5 Z" U        pRX_MSG_PROTOCOL pshreRAM = NULL;
& c- G! D8 J/ q2 @: ]/ F" a; ~8 O6 v
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! c- u# ?7 u! e2 T$ h0 z0 e, z
2 V& M& G# z# U0 N9 R4 n: [        if(pshreRAM->packet_cout != count_copy)
, Q/ Y( ~" F& g/ U6 P        {
$ I& P$ B& l) ]& W* H0 C3 ~+ I4 g% j( u                printf("a is %d\n", pshreRAM->a);" _7 r% S6 d- `# H" E
                printf("b is %d\n", pshreRAM->b);
% k: O5 ^: F2 C9 P/ I1 B' h) T                printf("count is %d\n", pshreRAM->packet_cout);) y2 Y* P! H2 |( R( ?
                count_copy = pshreRAM->packet_cout;% E! G# p/ T* u" ~
        }
2 h- u0 E7 Q6 D9 X, {1 ?        else
3 H# ~" e( R  Y( \& p  u        {
8 V( t; X( t: W                printf("No effective message!\n");$ T( F0 R+ C" z" U* n& D' T1 e& U
        }
  k* f& Q$ s( ~* r" `; i( J0 f}
+ s0 a3 U- ~1 c  l6 f8 g1 U/ ]5 l) w7 [% ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' E: B5 d+ t# x: R( x
) o# s. N) O5 I" I5 v2 a- r' J
0 W! {- n  }$ m
# P# ?5 s: F3 E7 D. `! V' J- e* F! U5 I% H! ^! E+ |





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