| 
 | 
 
 本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   d( J+ B( ^9 B' U 
 
0 g3 B2 {, K0 e: Y. EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> 
8 F; I$ l% e6 |/ }" }#include <unistd.h>% g6 C. @: x3 T% p! h) Q 
#include <sys/mman.h> 
& g' D1 S7 L% Q8 c+ o8 U* I#include <sys/types.h>: E! K/ b8 G1 t% c3 v' { 
#include <fcntl.h> 
% j7 p7 E& Q: h/ Y7 \/ G- A% b4 E 
0 s4 g: r! n& M" o0 q6 g: e/ M#define SHAER_RAM_BASE_ADDR    (0x80000000)    
4 R& r, J0 r( O1 q2 b5 q7 k+ D. b: K 
2 \( q2 Q0 s5 o& Q" Etypedef struct+ Q! L+ I4 N; O8 P$ P' D' t+ E 
{" Z( P: T- y: x; c: N* Z 
        unsigned int a; 
9 D& ~! G/ U& b( E$ \- @' f        unsigned int b;1 ?. {; x. ?6 v. m  X 
        unsigned int packet_cout;- f- B+ T, W$ w: m4 ? 
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 y# [6 K" y' _+ \/ m, U 
 
9 H5 m5 I) b2 K  \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); 
6 c" Y3 @: }  B3 k3 Punsigned int count_copy = 0;# _1 e+ B, A2 U7 f 
) J" f) }" ?$ V' ]8 E/ p# p 
4 @; b' p5 N3 J+ @2 _9 b 
int main() 
9 D) l; m* y- E: g1 D* u+ K2 R{ 
2 q( ?  d  p, {7 P+ g/ g. W        pRX_MSG_PROTOCOL pshreRAM = NULL; 
2 \9 C7 @# p: f$ n. p9 k" L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ t  g7 L+ r) u5 b 
 
3 C/ v1 E1 X) H6 O0 B        while(1) 
$ |% f8 x; @% M: {' f* X. b        {1 K& E) S6 a7 c 
                read_MSG_buffer(pshreRAM); 
" a* o/ j$ U. B! L        }                  k3 ?0 f0 y) x$ n2 j  _- p 
} 
/ k+ @: N* u  g6 E) U' r 
: l& h" P' ?6 B- h3 h! c7 E. pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 w5 d' d9 |9 s 
{! g: j+ J( U3 J: x0 c 
        RX_MSG_PROTOCOL buf;6 W& r$ b% ]7 o( j, x( @ 
         
/ F4 ~* {- C: P. ^# h* n" V        buf.a = pshreRAM->a; 
3 _8 A0 Z. V6 c  K) i( m        buf.b = pshreRAM->b; 
. ?4 {! c/ g; @( ]        buf.packet_cout = pshreRAM->packet_cout; 
# f: N; S  ]# z        3 @0 O6 T$ o$ V 
        if(buf.packet_cout != count_copy)) w: t. `; C7 o( z) q+ S 
        { 
; J$ ^7 W- p9 l. }: J( W! J                printf("a is %d\n", buf.a);' J5 o6 S( {0 _0 g4 v0 x3 `/ M( i 
                printf("b is %d\n", buf.b); 
6 i, q2 E0 \: J; U0 G/ E5 w                printf("count is %d\n", buf.packet_cout);9 O+ I/ R6 q) {3 [* Y2 @' O 
                count_copy = buf.packet_cout;1 J$ c+ r1 a9 f6 ~$ v: t+ C# X. e! } 
        }# x1 U4 P/ H" h8 s4 x( q7 ~ 
        else 
, j% Q6 Z5 \9 |4 g$ X3 m( O        {  z+ M1 X. V4 F5 x 
                printf("No effective message!"); 
- ?# D3 F! W) C        }& l# ?7 d8 k; T 
} 
) {; u7 s. o! _$ D1 g( V5 K  B: E0 I# l5 |' ?$ ^ 
5 P# m- p4 E' V" ?9 _+ ~9 | 
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 X( _& s. F1 q1 j& p 
使用下面代码,对内存使用了mmap函数后: 
0 c( W( Q/ |- \6 \+ U" j: k#include <stdio.h> 
% g+ X0 G; J, V- ~#include <unistd.h> 
9 H& l9 r9 i4 @#include <sys/mman.h> 
1 z8 |/ ?# D4 x. h! }- z/ Z#include <sys/types.h> 
3 b7 f( ~9 }# v6 F- E" F) n2 l$ [#include <fcntl.h> 
2 c  [8 A) K1 j3 I8 Q! z0 p, {7 d" I' T, e9 L 
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 R" [. \2 O' H. l# k7 V. u" d" { 
#define SHAER_RAM_SIZE         (0x20000)    
9 `0 E" B- M6 s) s, ~0 A( m' G! z6 R2 ]9 x( q1 N% Z; w) D 
typedef struct  ^. \! e9 o$ P1 \$ n5 I 
{ 
4 C" {3 c' Q# ?: k        unsigned int a;1 p# b" U8 ~8 V1 l 
        unsigned int b;' m6 x7 _  a$ p% J( i2 e( h 
        unsigned int packet_cout;' S' B# S7 z1 t1 ~* ~" c7 A 
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Y& c8 `* d6 D) ^# O7 c+ C 
. ~, C3 L; U9 ] 
void read_MSG_buffer(int *baseaddr); 
8 x8 F+ r4 p7 O% O7 tunsigned int count_copy = 0; 
( i' s' ?# `7 `" c8 T8 Z- R  Q! u3 z$ q9 x7 Q$ c% F6 p 
int main() 
/ H8 b6 n1 N3 f/ f4 }{ 
# s# `0 C4 A% }9 f( W        int fd; 
+ [# {; a9 L$ o3 u        int *mem = NULL; 
3 D) K' e5 Z) q! d: p) P 
, t* q3 w4 g' i        if((fd = open("/dev/mem", O_RDWR)) <0) 
0 E0 i  E! I+ f) B8 [6 |+ n) T        { 
) O) E7 h/ F* V6 U9 K! f1 U                perror("open error");9 j% c: ?$ m7 @2 |; f$ I% p 
                return -1;& B: y6 N8 ^2 E1 _ 
        } 
1 j- d1 n  J  D" e9 L/ _, O        : R: I" F  D; X5 V2 Y. m4 v 
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
- q) k7 L( g; \& |* n 
% U. Y, y; m! d0 b% ~( A        while(1) 
- Z! ^1 ?8 ~0 y# q        {4 R" ~" T4 x% {/ r 
                read_MSG_buffer(mem); 
2 Z! N4 C4 x# `- q, r        }                + c6 ?. f, F; V, y 
}0 d" ~- x6 j8 c# L- m 
 
8 t) v5 H8 _. v* a/ z1 tvoid read_MSG_buffer(int *baseaddr) 
1 B5 `7 u  n- v  A8 W2 A{+ p( l# L* R! N" U7 y7 M 
        pRX_MSG_PROTOCOL pshreRAM = NULL;  b4 ]  Q8 {7 u9 w4 b+ r 
/ F5 ~/ S- M% D& ~0 v* I; c- t 
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( O2 {, K" D/ F( ] 
  Z' f1 H9 M) K1 a( e$ W 
        if(pshreRAM->packet_cout != count_copy) 
+ G, E- H0 S' f: J, p' h7 P' x        {5 H: s: H1 W) F8 a4 ?- O7 d 
                printf("a is %d\n", pshreRAM->a);3 X$ `$ p6 C+ c: E3 _/ i1 X( D 
                printf("b is %d\n", pshreRAM->b); 
# Z# c" W/ q+ f$ [. g4 V& q                printf("count is %d\n", pshreRAM->packet_cout);( l4 u7 j! P4 Z 
                count_copy = pshreRAM->packet_cout;; N3 E' W8 i' N( C 
        } 
* n3 Y- j, D* f        else6 h5 {; t# B; \* D6 N8 Z% v 
        { 
% v9 ?8 P3 @, e! \                printf("No effective message!\n"); 
* o3 H  Q# V8 a# V+ _        } 
4 Z5 H; D4 {4 ^( v} 
1 T- P! c2 g5 L: O/ ]' R$ ]; v 
% |+ g. ^8 f$ V6 L0 _+ ~' Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) [7 t5 y$ w& L) K* {5 w2 W 
 
4 L5 m2 X, g7 t0 z4 |* M2 C5 _/ g3 c3 d 
 
2 {& R: ?: _7 F; {4 k4 H1 B1 @! s( C- r( `( U% u! ^% G 
 |   
 
 
 
 |