嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( b( e5 M* F' D) U) F* k) j6 W2 K/ h; t3 `4 ?( B8 N0 ~8 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& Y# \' V7 S! O#include <unistd.h>) S5 Q/ b/ R' k
#include <sys/mman.h>; N: k6 |: O' w& p- |
#include <sys/types.h>3 E5 F. A+ h( {; o3 h
#include <fcntl.h>9 n6 l+ d0 A3 s+ ]! v1 T: v  P
$ C* N* h& a' Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( v! L/ y( `" W& Z( \+ l$ G1 ^9 P# Z* j$ _; Z6 ~' T) P; }
typedef struct
" r% s; b+ n; m" A: K* V( Q{
- T! g# z, [" t. [* w" Q8 @5 e        unsigned int a;: w" ]+ A" @/ C* e
        unsigned int b;
3 ^$ C+ q' `; b7 ?  |0 x+ e! `) @        unsigned int packet_cout;
! ]; s6 P: L) Q8 }" J3 |8 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ }- v  r/ S6 [7 ]# N" p2 r
' K; t1 w! S6 ?) u( Z7 a) fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" b% Q" P7 n3 junsigned int count_copy = 0;$ Y+ _; V$ E2 x+ l7 d" R

2 b+ x8 m" m  P. g4 ^
! G. ^" b. X- [7 Zint main()
  W; {, H& k& n* U6 E& c0 e; |{2 O1 k0 [- I0 q% c( h
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 T/ \5 _) ^; M2 [' |  A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 O" ^6 ?# ^( O4 n& N3 `5 W% n: f
7 Z! [$ f+ ?9 ~, r        while(1)7 r7 J, z9 I1 b% {3 _( g, j
        {6 {: P% o' c1 C8 S  z6 p
                read_MSG_buffer(pshreRAM);
8 r0 [% h  i5 z4 W        }               
& d/ J: C: U" r}
3 q; V, O& s% S6 Q9 H- q8 Z0 ?
+ t3 g6 M" j1 l1 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: ]* I9 S  t4 w: X1 z) M4 }{+ T- v% K4 D+ u5 h! s: F+ X6 `
        RX_MSG_PROTOCOL buf;9 x/ i4 O7 C0 g. ?% |0 a' z+ I+ x
        
: q+ F/ L$ j. B2 s6 I2 S- q        buf.a = pshreRAM->a;
. x; q( d; w8 R8 O  M$ Q8 _# {        buf.b = pshreRAM->b;
9 C. H$ r( X2 I$ S        buf.packet_cout = pshreRAM->packet_cout;
$ E# z4 Z' y+ ]( v2 Z        / h  T! d' l! C; {) S
        if(buf.packet_cout != count_copy)
1 [! Y; L9 ~' u, b3 R8 f        {
* t+ E. ?' m0 a- C                printf("a is %d\n", buf.a);) ?$ P1 [+ V( N: K4 j( e6 t3 i
                printf("b is %d\n", buf.b);2 i" t  `* L2 K$ S& l) h- R
                printf("count is %d\n", buf.packet_cout);. e1 B, v6 |. W; I" u- [" \$ N. O
                count_copy = buf.packet_cout;
5 t8 b2 y% z& m( G7 z' d! A        }
7 H. c  |% m6 ]' G0 v4 M! t( b" C        else& V" ~2 W1 }8 ]0 U4 d
        {
1 D0 E# Y) U% k. |                printf("No effective message!");& S2 J0 L' ^5 y- e8 f
        }
2 A! f: ?2 ~0 n}* }3 B3 y0 x+ a1 k; \
& |/ i1 ]3 ?4 h( t+ b
5 P* x7 w, C( b5 o7 {1 O  O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) x' c2 S; t% p3 G  U+ P( Q
使用下面代码,对内存使用了mmap函数后:
: O  @& ]' ]) Y# \& F#include <stdio.h>' k* s  I/ ]) Q5 {. Z6 [8 X. ?5 A
#include <unistd.h>
' c6 {$ l" a: I! O" v8 i#include <sys/mman.h>' U; _1 r6 e& b2 m# x
#include <sys/types.h>- |5 J! @2 L! s" i4 S* E
#include <fcntl.h>1 |+ P9 A8 h! D' ]* M5 E

; o7 h, e  x* X" h  @#define SHAER_RAM_BASE_ADDR    (0x80000000); y5 u( c* I8 Q* K; v: C' v
#define SHAER_RAM_SIZE         (0x20000)   " `9 p: y& A5 b  D

6 p; w/ ~) Y  X% W; itypedef struct
% j2 y6 g+ }, I{
8 k) D. _% [& L, `7 P        unsigned int a;6 D& e/ @7 _* L& u: e6 A
        unsigned int b;
1 g0 i7 x5 N/ H; y6 W) J        unsigned int packet_cout;
2 R" N! R6 Z7 V6 t' P* R/ n3 y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. f: h4 |* Q9 O! @, ~4 n/ q1 W3 t/ t
void read_MSG_buffer(int *baseaddr);4 M2 m( @7 u  V( l  Y
unsigned int count_copy = 0;
. ]$ M: h0 v, J5 Q) [( u
) [2 C9 [+ \* t/ F8 d+ B, j- gint main()3 M. O0 w! l$ j* P) F; `/ u
{
6 ~) `1 B3 }) Q7 O' @+ M        int fd;) e* B" D: k* Q- p4 I2 S4 e! y
        int *mem = NULL;
3 K: a+ f  e4 {/ }8 ?* I" J! V# ]& {) L! ~- w
        if((fd = open("/dev/mem", O_RDWR)) <0)3 R! Q, t5 d1 F2 Z- q1 J
        {
) h- q2 n" ^6 M3 r7 f- b                perror("open error");
: F* c( M5 f4 j7 R                return -1;
* t! r$ n5 n* ?' i6 B% q3 w        }/ v! o' b5 T4 N
        + ?- E" F- k& v# O
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 g* y, Y, t- k6 }! ~& }8 _
7 O) z, {$ p8 A# Z1 O
        while(1); ?* F. F) d4 a6 q. f# o8 b
        {" ?; H/ I( Q6 C/ T/ K2 q( O' E4 k
                read_MSG_buffer(mem);. L2 ]/ W: y! q- Y7 a0 E3 {1 a4 |9 O9 B
        }               
6 c" f8 l1 D' R! t}
# e2 y  p* X5 u" Q+ d
8 q" z* C0 L% J: G: ]- j) r& Lvoid read_MSG_buffer(int *baseaddr)
- ~: S# Q2 `8 l" i/ @{- ~; ]" o! ?' b' G3 N  g+ x9 B/ r5 U
        pRX_MSG_PROTOCOL pshreRAM = NULL;# I, d5 v) I6 }' R' W" e* o: c
; H6 T! e, |. f! q3 r( B- D8 d, S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  }6 L3 j/ E- W% B# r6 N7 z, X
; H$ _& W: C; s/ D7 v  ^        if(pshreRAM->packet_cout != count_copy)4 O; e) ~/ M% g5 T* ?$ J0 q9 i
        {
; d0 R* t+ C0 W                printf("a is %d\n", pshreRAM->a);
2 N3 Z8 W( k, \7 i                printf("b is %d\n", pshreRAM->b);/ U) E+ @- r7 A: G$ q$ T
                printf("count is %d\n", pshreRAM->packet_cout);
1 W4 d3 J: q/ [' h2 _- {" w+ M                count_copy = pshreRAM->packet_cout;$ p, u3 ^3 J7 L
        }! y2 P  B  T# k* g  r, h* q6 P/ L" B2 G
        else7 \6 H: ]2 [' W6 I% [
        {; Y! l- S. v2 o! `  ]3 B  s" L( b
                printf("No effective message!\n");
3 L; i# F4 r: M" k+ o4 G        }
3 ^( W3 Q; p  f) p) z}7 U/ G& Q5 o. b7 m. Q! N

. e6 v! @& @0 A. g2 g5 l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ ]7 P3 W1 v6 n* B) w6 v8 K( ]/ ~$ N( S: I  a* c
2 a- {% J* T' j- P0 @

! |8 E% R. N6 ^: J% h9 X; I1 |) m5 e4 G4 @( [





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