|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 p( N( C" R, z$ ~( k
# }# A+ K5 m" V1 P7 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' S2 @# o& h- p. L8 z% V, |#include <unistd.h>
$ N/ f4 G; o& a: E. s6 Z#include <sys/mman.h>
# f V3 G8 x. l) X: P7 x- g#include <sys/types.h>
+ H) O; P* n4 n) d- Y#include <fcntl.h>) e$ t% E/ }# F( n# _
) b. ~! z# k0 q#define SHAER_RAM_BASE_ADDR (0x80000000) & J- z3 S8 Z. M( ]: ?/ I9 a
, q0 J' d' r; T
typedef struct
7 c. Z2 {0 M- u# Y{& ~; X. _+ U( n0 N8 u. _
unsigned int a;
9 `) b' Y9 q! [# \" x unsigned int b;
. a& l4 e3 D6 @7 s" z1 h) M unsigned int packet_cout;
8 ]5 R7 o; M0 ?6 [+ N$ P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ V% ^8 F$ t4 O" j) L& q/ j B: H8 y7 b4 V, E* O( y$ Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& O$ e7 y$ V$ i( M
unsigned int count_copy = 0;3 w5 l% [( ^1 `: t
# O" h- U3 H; {( Q+ \* O" W4 {) x4 |& H1 B% w3 i/ y1 ]
int main()
: D* @7 b. P r7 v7 r5 S{
9 s# q. S9 E) Y: W pRX_MSG_PROTOCOL pshreRAM = NULL; y: u) H: T0 P! ]& f4 v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, {3 {$ n; K" V+ R- @) q1 l3 g6 w: n5 D# S* H6 a( J: u
while(1)9 e: e0 ~- `% {8 u# d
{
3 y1 T7 D* e) o( j! c read_MSG_buffer(pshreRAM);
, k2 L9 A6 F+ r8 X }
0 b S2 x# c$ s* h. I}% v0 P% R7 Q! B9 X- J5 g( H
, n7 h" Z- ^% u# l' a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ r p* I0 b- ]3 A2 E
{+ D8 ?- `5 p/ u( H; p6 }1 O
RX_MSG_PROTOCOL buf;' E% f/ o8 t. {8 w6 C, i
. R7 c7 s* S, f" w* s
buf.a = pshreRAM->a; B; z5 g4 @3 x, R
buf.b = pshreRAM->b;
2 \; a+ i9 }. Q) m buf.packet_cout = pshreRAM->packet_cout;3 E; @" w5 }9 ~5 y4 E4 k
8 W- E- U1 ~+ } if(buf.packet_cout != count_copy)+ N( Z; N* a2 c2 ~
{
" }3 R0 t2 Q4 o2 w printf("a is %d\n", buf.a);
, Y! e: H$ y/ {/ l( i0 W' L printf("b is %d\n", buf.b);
) e/ {" j3 X% o. A* Q printf("count is %d\n", buf.packet_cout);* o3 s( d7 G% C' q3 T# z
count_copy = buf.packet_cout;
) j' A# g. s" N( h }8 Y. ^4 g" M. n
else
; s9 [6 R, Z- B% Z {
1 V! B$ Y2 z# X5 `- b; [+ ^1 x: J printf("No effective message!"); u" m( t8 w2 {# q5 Z( j* c
}
/ F/ b& l) @1 i( {* y}
' N; s: N: v, a+ m5 s8 V8 h
' ]2 [+ _+ j. M/ t: w7 ^- B2 l( R: i1 I4 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& B9 A- Z4 s& t% }
使用下面代码,对内存使用了mmap函数后:
2 o# O+ M( _4 A4 V: j#include <stdio.h>( x- Z2 i7 U6 c0 O: {/ e8 _
#include <unistd.h>+ t" f, g/ M% H z1 V
#include <sys/mman.h>
4 N& }9 h5 v* t- F& x3 q* ]! ?#include <sys/types.h>7 P" v' z: o' |- ~2 _+ N
#include <fcntl.h>2 A A* Z+ y3 N1 x5 J
2 y$ a9 s Z" S4 m6 K( L1 p: R#define SHAER_RAM_BASE_ADDR (0x80000000)0 F! x/ t+ s/ s* i8 Q8 C6 S
#define SHAER_RAM_SIZE (0x20000)
1 L) n* g, D# d+ d5 v; }1 b; L0 I, D/ u; m; m* s; n3 K
typedef struct' p& P# D7 Q( N0 ]( C. i
{! z9 ]% \7 G8 Q( E. L
unsigned int a;
9 [: }! \" f& z unsigned int b;
+ j! z! {+ ?$ `, O5 s unsigned int packet_cout;
4 N, s C) t% ~9 H7 v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! `2 T$ J6 Y/ t3 m9 E
$ ^( B3 D6 P: s( A+ Dvoid read_MSG_buffer(int *baseaddr);
/ C- C) o. R2 ~0 Lunsigned int count_copy = 0;
# M+ v/ P' @$ w% c! y) @- L8 I2 E# |3 W1 e* C, M! k
int main()
7 n1 J* U7 Y ?: ~( o% {! | u{
5 J3 d/ X; _; M2 R int fd;
9 Z. w' E" r# |+ T& H int *mem = NULL;
2 V6 K* r/ N9 m& H; l% h7 i( n
) F( A7 `% P, V6 u3 _. k. f5 ^ if((fd = open("/dev/mem", O_RDWR)) <0)8 a5 M) Y; S, y; ^/ c: H' }
{
# e' D6 t) n# l perror("open error");
8 B/ C3 Q1 J# X9 D5 `; q( C return -1;
% p/ M! a# s9 f }
4 Z$ n. ]0 f {- M5 |
/ i, c/ A% m0 t: L mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& e% h) A6 Z0 ~8 I$ ^1 ~
& E4 g7 j& }: P( Z7 y( F while(1) F' j* J; G# W4 a# b9 q' {% f
{
8 z- z9 G7 N2 x" K read_MSG_buffer(mem);
+ t0 P4 _% p d% a" a. Y; v }
" ?# i5 b6 w% |0 l9 g}) p+ ]# a$ x- u$ k& w
/ {! u1 X# {$ q' f @' \* jvoid read_MSG_buffer(int *baseaddr)
# V! |& b& i8 Y; B, `{7 m0 T6 i" q4 @+ O! L: u
pRX_MSG_PROTOCOL pshreRAM = NULL;6 d4 k ~) U5 s: i! U, p5 X
& Z5 j0 o0 Z" W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 I: P7 ?0 f. w) I3 i7 l1 V F
2 Z3 R. s; X7 F2 ?; Y8 C if(pshreRAM->packet_cout != count_copy)8 E: _. J6 |8 Y6 n' I9 v2 H2 |0 U
{
8 I# ^; F7 |2 H& c \( X/ h printf("a is %d\n", pshreRAM->a);# q" g S9 j+ F& Y7 ?
printf("b is %d\n", pshreRAM->b);
5 K) z9 P' ~1 Y printf("count is %d\n", pshreRAM->packet_cout);) d+ h' ^/ X3 }: l, V* c, g9 e
count_copy = pshreRAM->packet_cout;0 S( c! H2 K; ^# h& F
}5 L1 s, s, _) y: W' Y- w
else2 p+ c% g9 Y; Q/ P4 H
{" v4 R1 v- g0 F9 J
printf("No effective message!\n");& m, O- k N* t5 ?
}
: {2 |0 S3 W* \0 w1 A' b2 ^) K}# X% p1 b3 L% }3 b6 r+ J
% m- w5 a" M- J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" p* S# H3 Q0 _; I" z" q* L
% l1 s' k$ Y E
2 W9 w3 B* d( k9 Z4 Q7 u- d* S
2 w+ ~2 o* c' G! p+ f, b; V
! F/ {; O8 a2 ^% M+ K |
|