|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' v3 H4 ]6 C4 g1 o
6 G. y, P/ X0 Z( Y* z X, h* n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. c# W" G$ y; G! q4 F% ~#include <unistd.h>0 V- p+ t* H6 @9 X# u- m# l8 z/ E! Z
#include <sys/mman.h>
1 J3 g) G$ A7 b, ?' y/ }( J#include <sys/types.h>
1 V# B. }& f* ^$ s#include <fcntl.h>
- z. o G! T. S( i5 U# @6 o# d! p) u* D- c3 n; ]
#define SHAER_RAM_BASE_ADDR (0x80000000) ' J3 R) S4 d4 P5 X9 N, W
: j+ y% T, _/ ^2 t, r! D7 l( o: ctypedef struct4 x+ Q* g7 r* i3 z9 n
{
; S+ f& i# j1 {8 `0 d' u0 m4 | unsigned int a;
8 R: Z: C! ] k! J- |# k0 i' Z unsigned int b;+ _( e- f5 O8 R, [6 u
unsigned int packet_cout;
2 v7 r' L w+ B3 c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 O4 f1 J; E4 g/ `( f/ w
# D% j% R* w# R! T% h. Q& f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* w! ~8 \; B! T9 y3 B" `; Tunsigned int count_copy = 0;
% W* q+ U+ A5 N0 u
# ^* u7 x" f4 e9 } I- s; U0 X# e9 y5 q8 j/ O
int main()
: w# Y T. Q2 `( o{
/ f2 W1 x. O4 b9 u Y7 |4 C5 Z5 Z pRX_MSG_PROTOCOL pshreRAM = NULL;, E6 Z5 V7 I- d) s7 u& e2 d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 k, O6 K" p! W4 H: Y: v6 Y2 ` ?
while(1)
: N) j$ ~9 q; e" B {0 h/ o6 X& Y$ f5 X7 ~
read_MSG_buffer(pshreRAM);5 E- O, _, B% T8 z0 D; {# g
} 7 s) b$ P! v! L
}0 [3 T" Y3 L8 v0 a0 _# l7 U9 j
, U4 U$ \/ J0 e; O9 m7 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* n! R/ U B7 F2 ]: `! y' n0 B
{+ S- T: x9 G+ {' [: M. ?
RX_MSG_PROTOCOL buf;
# n1 f3 o ?9 C; D6 |4 s$ `
6 a+ l' B* m! ]6 y( e( Q! l, f buf.a = pshreRAM->a;8 V; v9 N% D$ Z2 ?: T0 k& j7 i* v2 z
buf.b = pshreRAM->b;8 E& K& w& Z, P$ P3 p# C
buf.packet_cout = pshreRAM->packet_cout;
' h7 d0 c( U6 t3 y% x $ k' r7 r4 z' H; H7 C
if(buf.packet_cout != count_copy)
& r) u" U4 |) f' u* T% r {) E0 ^) F7 p* g
printf("a is %d\n", buf.a);
4 N( l# b9 A- [6 ^: q printf("b is %d\n", buf.b);! S4 l% P3 R; J _
printf("count is %d\n", buf.packet_cout);* u1 L) r3 L* ?/ h5 g, b
count_copy = buf.packet_cout;, R- C& N1 G/ }+ |0 M4 y: `
}
1 M! @7 ?$ _' { else
/ V( i2 z9 b- Q9 ~, @( i1 f {
, ]5 \6 x- }( s$ K" o" `% }" x printf("No effective message!");; j+ b- ?5 [8 N: u
}
?! o, x8 D' X5 g}8 R* M8 O" ]6 g
& C5 v1 d- a# o# T, e6 [* V& j
8 P6 B% E- [" C3 ^( b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ C' F! ?6 d0 A6 j2 t5 T0 O
使用下面代码,对内存使用了mmap函数后:
% `1 C2 S+ i8 ~9 f8 x#include <stdio.h>+ }! S: y C4 u- U$ ~$ V
#include <unistd.h>
+ X/ j; Q6 l; H2 r9 e7 j#include <sys/mman.h>
5 _* C5 ^4 ~! Z+ Q) P#include <sys/types.h>' z5 N5 O2 n* P) F+ ]
#include <fcntl.h>
9 {; z; ?" n$ J: t4 x. z! f, ^" B j5 T& \* M$ O
#define SHAER_RAM_BASE_ADDR (0x80000000)# S, Q" K1 M L c
#define SHAER_RAM_SIZE (0x20000) * q% l% v& f# ?8 m
* T0 G+ _% @8 v/ u; r1 T
typedef struct/ O6 \: {# @ a7 f) ?
{9 A0 w7 t; p9 n, F) [; B
unsigned int a;7 b8 j. ?+ |* c* i) e( \4 u
unsigned int b;1 c( w$ y S! |) ?
unsigned int packet_cout;
! a4 |' D0 a# o1 ~- N/ _/ t/ a; R1 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! `! O0 s# y' P7 H- _% q
$ l7 H- Y: Z0 w0 g, J- }7 l1 D
void read_MSG_buffer(int *baseaddr);: i3 ?% C0 y/ H9 E
unsigned int count_copy = 0;
! V" p6 P& j0 m
! i9 u4 H( x# _- M% c( Jint main()( |2 ]. o' f( n R. O
{
( z# ^( w5 Q2 [& @ int fd;$ |1 G" E" I4 u' Y& B9 [' t# D
int *mem = NULL; Z$ b/ R3 s# H2 H
8 Z4 W# j3 \; n T7 o3 {
if((fd = open("/dev/mem", O_RDWR)) <0)
3 i9 {: ?2 R, Q: r5 h {% f$ T1 b) g: g" U
perror("open error");
" R& E% V* S% M( P return -1;0 V) D& U9 _4 {1 g: E1 `5 G
}
% X: ^* k- q1 j" k) T& E( b; _ * Q9 ? U j# c
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. ]7 E& g- ^$ q! O; C
: `( M* n' J: t$ w+ ~( b+ K while(1)3 C1 W) H+ Y8 _: m+ N, K3 Z" [: o
{ |% D1 o+ ^6 I/ |
read_MSG_buffer(mem);
% b' E5 M- n: I }
7 W% R8 @% s2 Z. }0 T. E}7 r( z" B3 w; x6 D8 X4 G y
$ n0 B2 i) {+ u. |void read_MSG_buffer(int *baseaddr)( W+ U `+ h+ s, z; U3 X
{/ [: m9 {) j. W' Z9 b
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 M* S. x% T- x. j6 T" G4 h/ N7 b3 z
9 P4 r0 |6 T3 s }/ O$ { pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 B, r9 Q4 [2 e3 H9 O" h$ g' P
+ \3 s. {' `! f* N if(pshreRAM->packet_cout != count_copy)
" ?2 l m" `' K2 I1 M* g {
) |: c: x! d7 N- j9 r) s% z3 u printf("a is %d\n", pshreRAM->a);
4 f; F3 y, I1 n5 f1 e' h printf("b is %d\n", pshreRAM->b);5 T( S% R8 \# V
printf("count is %d\n", pshreRAM->packet_cout);
" p( W6 k5 ^# y6 q% m+ H count_copy = pshreRAM->packet_cout;
& M3 S5 I: n+ X: F) g& f* P5 d+ b }2 f, T1 [2 o& D
else
$ j& j- j6 f2 |0 V3 }% P {% k. j& ]- r% Q; W( f/ t( p
printf("No effective message!\n");2 ^1 T" h5 r0 Q
}
# G( Q! d. ^& |" N}9 d V. V5 O+ N! _; c' b$ l
' l* \! ]4 D* P0 s0 f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. u. D- T+ a- J- V' U
! u" }% a. T; b
; p5 @2 q6 `; n0 A! A. c2 x2 x! b2 O1 M* c
4 w% r+ f/ D3 Q8 [2 g, H. b |
|