|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; F. W3 E( f: g4 _. Y/ d2 j
2 E. @3 k2 Q) t! M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 Q2 O% e0 G6 d5 N1 K. u
#include <unistd.h>
4 _# d/ i- Q% T4 x# z% {* m5 ~#include <sys/mman.h>
- A6 u1 }" d" c8 \" I) q4 B& R$ t#include <sys/types.h>2 i+ w. w# X8 s1 j0 E8 \; k( @
#include <fcntl.h>/ n$ ]( v- u9 O& z
$ u/ ^5 u: l- t! ]( Y5 ~- z: ~#define SHAER_RAM_BASE_ADDR (0x80000000)
. J5 Q) d! X5 w' l- k% w8 W1 c$ I7 ?, j5 m2 S
typedef struct9 O9 \4 K( \6 i' }( N8 @
{
5 q5 A9 ^, [' C3 h$ p; Y unsigned int a;
4 m- t& r0 z q$ J* Y5 o unsigned int b;
# a8 t6 u% N) B# |- P' z: w unsigned int packet_cout;
" b+ k( L2 N+ `- l( `5 _6 Q! d# |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ \3 m; U+ }4 [4 `# H
6 a; z: @7 x, b7 b; a/ z2 o2 i8 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 i2 n; @# c# S1 A0 K+ L: Dunsigned int count_copy = 0;1 s/ t8 K N4 v, I7 p1 Q
! V: h7 z& A, J2 k; ?( A6 i2 p& I
8 q+ O5 q2 `$ I) ?0 bint main()3 a. K+ [. a: E9 F
{
& Y2 F* Q% v5 }: w# e9 s/ v pRX_MSG_PROTOCOL pshreRAM = NULL;
4 p- y- b, B( |5 f; x pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 |3 {. z, u' ~- X9 m( j
% h4 f4 L6 t# }( t( C8 U while(1)) ?% I7 _! Y$ c
{
x! K" q7 }7 { read_MSG_buffer(pshreRAM);
4 L9 [$ ~* W3 o1 G1 O' V9 L; U- ^ }
: @& w; Y3 \) M4 {}, K& X% X/ h' I: u
4 a) S! e+ ^' n! d( \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 n' r( p2 {3 t+ [! Q4 B5 r! m |{
# v* o& c0 u" d% D( p1 H RX_MSG_PROTOCOL buf;0 q& Z6 i& b" F! T I3 y8 [% b
& ^" B4 u) B* A3 @/ j! n. r' C+ K buf.a = pshreRAM->a;8 f5 J2 S1 E) }& W7 b/ ]; |
buf.b = pshreRAM->b;( _: D& y( w2 \
buf.packet_cout = pshreRAM->packet_cout;
5 o: H! R, M. N
+ [9 O6 z" E9 A: O if(buf.packet_cout != count_copy): Z1 ~% u9 ], ~; b& O. S& {" v% j
{6 [7 s- f, o2 ?1 C; A, K; S6 ]
printf("a is %d\n", buf.a);4 [" T" ?7 K* _" ~% `; {- g
printf("b is %d\n", buf.b);' \( Z& ~- ^9 H5 i/ L1 P, C: D$ d! C& C' _
printf("count is %d\n", buf.packet_cout);9 X, ~; s' @; I* V J% G' {3 k
count_copy = buf.packet_cout;) Z. [+ H* T. }, [9 ]0 j
}
# c4 R; @6 B: m1 Q3 I6 p* a else
; Q: {1 K; W. u( z3 d- Q/ o0 b, e$ j {& J. ?! F4 O) k; o# ~+ [) ?# l% N
printf("No effective message!");- x$ E; A. g# A" e4 C5 x; I
}
& u a" x- J8 d. a}
6 z% F4 C) R- d) H( @! ]1 O& U3 }" h: E' Y2 S5 {- z; n$ R
2 y" h3 l% F: {/ Z. |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 D1 P' j4 `3 Y f9 z( Z$ C$ ?使用下面代码,对内存使用了mmap函数后:2 W# R" i! K7 R) f
#include <stdio.h>% L# P8 r& O& K/ \; U
#include <unistd.h>8 Z% z* F t8 u5 z, B$ c4 Z7 ?9 t1 c
#include <sys/mman.h>
* g* X" y# \! r; { D! y#include <sys/types.h>
2 F0 ^6 \% i- C% }6 ^0 Y#include <fcntl.h>+ a6 R& D* ^& y; F9 c% L8 C \+ h
$ ]1 [3 [5 [! r#define SHAER_RAM_BASE_ADDR (0x80000000), y; J1 @6 b, P* [0 T. L
#define SHAER_RAM_SIZE (0x20000)
; h( X* a: w/ [/ l9 S* x# r- @7 S& t. F+ e; ]8 Z
typedef struct+ l+ A5 |2 i5 K6 R: q
{
) h; P- l8 W; D( ^5 Z unsigned int a;
3 c0 ^4 n! l0 o) n1 U+ K6 S unsigned int b;5 w5 c- X" ^, [0 t
unsigned int packet_cout;
& ?% C6 i& h9 d5 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 A2 h4 z6 U0 i1 ]' ?6 [
# P1 G2 h$ a$ R0 m: ^7 C7 yvoid read_MSG_buffer(int *baseaddr);
5 _1 B! [5 W3 ?+ E3 R: _unsigned int count_copy = 0;* y0 d$ V2 c& q2 z: e; v
/ E2 U0 z- T/ b% \6 }0 A0 g% ~int main()
1 `2 l; o, M4 @ D) d* w% V{
, M# n7 X, U' F. k2 W, r& G# y& I int fd;
% `1 L0 `3 P {* y int *mem = NULL;
) u& e2 J( ^; I1 @6 U0 T7 j/ S+ s1 G
* c/ m& v0 y. j% l. Y8 B if((fd = open("/dev/mem", O_RDWR)) <0)( ]4 q" V" x( T
{0 e7 m+ E) p8 q
perror("open error");
3 }( Y' ]/ C) P2 r return -1;
7 \7 I: f# e3 T# E- S/ |6 [ }( a1 ^% i z, L5 D
$ Z" H0 v) @, @4 S0 u mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 V1 N H; ?6 t: @3 j5 J5 W3 u9 i7 N- }7 Y( c' P3 J
while(1)2 g. D& _2 R, \9 d5 a* }3 z8 J- W/ F
{
7 _) F* P! ^6 k( w$ i; U3 K read_MSG_buffer(mem);, t* b8 M/ p8 J$ g9 @! }8 O
} * p/ r8 K: N: o8 e0 d& Y
}6 A6 M' b/ t5 H8 p
+ T3 Z! |& q0 ?
void read_MSG_buffer(int *baseaddr)) T" c/ G% \7 `1 u% d5 b
{5 i6 [- S, D! s }$ V7 |* h/ A( M
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 j0 W# ]1 T& c4 Z1 p! J7 o, r1 G; p4 f2 f+ z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: _* I! i1 t K; f3 [ ^
1 B% X6 R. `1 H4 l" z& f
if(pshreRAM->packet_cout != count_copy)4 n; v; E4 D% V/ O+ l5 k+ n1 w6 P, ?
{7 f0 G; [& F/ y+ }4 ]" Z2 e
printf("a is %d\n", pshreRAM->a);
; ^# ]6 S# z: T6 [/ U printf("b is %d\n", pshreRAM->b);* v2 f4 m1 H# m+ s2 R
printf("count is %d\n", pshreRAM->packet_cout);5 T, {* v Q1 B& K' B/ m! C
count_copy = pshreRAM->packet_cout;7 y' L0 E$ G' V: t3 P1 T
}$ E% z7 S( U) I. A7 x2 ?- O
else
4 t5 g/ X4 r. {, F& X+ V$ X2 O" M {( B$ L. R# W! @3 h
printf("No effective message!\n");
0 @- o' U# V/ Y( J! o }
0 ?4 e" {( E+ S% R2 c5 ^! N0 Q& Y5 m}
. z7 h1 m3 z7 ^3 V5 y8 f& [2 q# b: z- K. |: K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" @) X# \. m: r- h' e* E! ~2 D- C1 L
& F9 p7 A" r: O, s* s9 D
6 t; L9 k l% M1 n! o- O8 g
& j4 x5 x" L8 q7 `" {+ l6 N0 G' C# ?
/ G$ e1 n" P A$ k |
|