|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % H( J( D7 V$ |0 \# x) m
) A3 }) d" E# s2 N# M$ j; gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" [% I0 {: T; x% S" V8 k, T
#include <unistd.h>1 L( t5 g) B1 T. P7 _" S3 }, k3 y
#include <sys/mman.h>
C; O- O2 N9 u5 b$ c O#include <sys/types.h>+ G* {/ H* r5 w8 k/ c* u0 j
#include <fcntl.h>
! V7 u8 L! B- ~) ?& k
) Y- c: [ l, O/ J4 V#define SHAER_RAM_BASE_ADDR (0x80000000)
) M; t2 P. T/ D! X* c4 y) C7 n% O& [1 M: p2 T
typedef struct
+ D+ m4 ~6 R* f% R% p0 B' a6 w{4 ^8 c @" r2 R! n% R9 E
unsigned int a;
P& ?0 |$ z2 [ unsigned int b;
~" U7 N+ N4 L$ y5 a) u unsigned int packet_cout;
+ j' u6 D7 F/ x ?$ Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" b. B R* x, z& q: a
7 L* o5 {) R8 x/ \ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ `& v+ G0 v8 _5 l% t6 Q) N& `unsigned int count_copy = 0;
+ D# G# a/ i# Y( x) r( g+ Q. l' L/ x- u+ L
/ l$ x, T/ i+ gint main()
. M8 ~/ K2 S; z4 A- Z+ j; s2 I, G# w{
; R9 q) x! N( t$ E5 W9 }8 E pRX_MSG_PROTOCOL pshreRAM = NULL;
7 U, R/ i7 R% p7 R8 `! Q1 a( T pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 m T3 G" |8 I
^! }" t# C/ d4 Q! C& z, d while(1)
7 q, {" F2 |, i6 x; M4 E0 j {5 P9 ` i0 L+ o4 Y. A) Z$ c
read_MSG_buffer(pshreRAM);
( P$ m; f/ [6 \- p' \1 J1 b } U0 m F; f; m$ k' b
}
1 r# g# p X- n, f. k( k: O9 E
' f: s g7 \4 p2 t D0 v) Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* b- _- a, }, P; \$ r; r
{' ^' k1 D9 p7 e/ r% F0 v2 H
RX_MSG_PROTOCOL buf;' P& u- k% v( \% \
& w, [2 q: w" m4 y- N& h: ]& i buf.a = pshreRAM->a;
$ |4 G4 C4 k$ f( h* Z buf.b = pshreRAM->b;
( o! Y0 ?* @8 A3 }. f* r6 u buf.packet_cout = pshreRAM->packet_cout;# M& b" f- _& ?
# ]$ p6 {" \! L4 J8 K O if(buf.packet_cout != count_copy)
( K: I7 u9 m, ] {3 h9 @; [$ i. V4 p) w
printf("a is %d\n", buf.a);& _: B; }% s G; ]* S
printf("b is %d\n", buf.b);: T: F& }* A! o5 E
printf("count is %d\n", buf.packet_cout);
3 _" H" N6 Y5 z, E4 h2 i. [ count_copy = buf.packet_cout;, D8 Y8 E/ _+ t) K% L/ F/ v
}6 _' o P# n: C$ q" F
else, l% h* k7 U6 m1 d8 k/ q
{
) ^# N) q/ R1 J2 X" L( i printf("No effective message!");4 m+ H& { E3 e5 k l O+ J1 r
}
7 S9 N! e, |6 u$ M: a u, `' f0 ~& s+ K}7 b% v8 `* ~% Y3 m
3 Z% \- j) N; X w( U/ V) a
5 o7 Z* S4 @4 a% A5 O( F" k g. `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ I- f$ y3 m# g. s使用下面代码,对内存使用了mmap函数后:
5 Y3 Y. Z) z+ ^% b1 e0 k) t1 \, n#include <stdio.h>2 G9 D; _8 B: c8 _7 t) D7 R, g
#include <unistd.h>" c+ H1 z0 A% Z9 Z& n
#include <sys/mman.h>
% B9 X& a2 G, i% N, U- J! f1 ^#include <sys/types.h>% ?0 p5 g6 M1 Y0 P
#include <fcntl.h>- h$ q: w1 b( m# J
9 J; a) b5 S3 V) r" P8 x3 S& z4 {: H# k
#define SHAER_RAM_BASE_ADDR (0x80000000)
, O9 ~: ~ I6 B#define SHAER_RAM_SIZE (0x20000) . _. |5 q5 C2 R- d! Z
1 p+ n& A8 X& {
typedef struct, w( {% C2 c1 Y# X7 j$ J1 z% \# H
{
) |) v1 U+ t# y( j7 E+ C- M6 O+ v unsigned int a;
9 p4 ^" m! ~+ ^" M/ i* [ unsigned int b;% \, z( W4 W) B. y: ^
unsigned int packet_cout;$ u; d1 \! N$ v7 I; x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 M" |. E. `4 c1 v$ X- n
- H( _1 K4 j! \( @3 e3 _void read_MSG_buffer(int *baseaddr);
5 \* e$ Q" D6 ^, \8 T* M% Junsigned int count_copy = 0;: F* O4 V0 O$ ?: n" q
$ Y7 k8 e1 T" F- q. c1 k8 xint main()
- B5 g4 Y# [ ^: ]8 N7 {1 E ^+ l{
6 ]3 i8 t6 U' C& ~ int fd;
9 Q7 ~; V8 m2 }3 }/ U# k int *mem = NULL;! Y0 |% V) Q) w/ u
) v& S0 R! X! f# p7 m if((fd = open("/dev/mem", O_RDWR)) <0). L2 X& }3 G6 w
{
7 U. H! g# H2 Q8 u1 y- H/ h1 x% f perror("open error");
m, n( O# C4 `% h return -1;
! g4 ~4 ?6 U- r$ I' |& V& H }
# X2 x% r+ i* ^, ?: \ I 0 x4 E3 H+ e& F* u& U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 {9 c5 K8 f. q2 }+ c
9 K4 a$ `: |& K! Y3 X3 c while(1)
8 }' l2 k3 i+ F* M1 O( e {+ {3 I! v' f6 O) G. N( s* {4 @
read_MSG_buffer(mem);
4 \8 s6 N" F B } 6 Z/ {5 u1 m+ j
}+ g/ i$ R; K. l1 n9 @$ U/ P; D
2 B3 ^5 Z$ v% L5 c2 z
void read_MSG_buffer(int *baseaddr)
8 L# z8 B, w- K( w s{
. \+ M* T( o; x3 X w pRX_MSG_PROTOCOL pshreRAM = NULL;* ^. C/ ]5 c: e T/ r
; Z( _7 w7 q I pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& G- q; h7 i' w
$ e+ V/ ]7 m& g3 `1 z/ ^* a if(pshreRAM->packet_cout != count_copy)
/ \; v) y5 X: O) p% |0 R+ C {% K1 p/ h. Y; Y0 B- I
printf("a is %d\n", pshreRAM->a);, Q: b$ j: ~" H0 A" |9 \. f
printf("b is %d\n", pshreRAM->b);
0 `2 Y6 E8 }0 u7 Z8 N printf("count is %d\n", pshreRAM->packet_cout);
, i, o( q! W$ `' I) Y8 @! f4 [. e count_copy = pshreRAM->packet_cout;
; _% U" Y4 ~9 B7 f q }& ?6 ?9 J9 V$ @- m
else+ |, y2 O- \7 I
{
5 l. L8 ^3 x' b printf("No effective message!\n");
5 s6 S4 k7 o& e4 }1 d! Z }) O+ G5 m3 R9 h7 F+ q8 N
}
6 X$ g# K- \6 |+ m
) G A ]: @$ R7 P* u" [/ s没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% B2 Y: [) M! u; S: a% q) f
7 H) w9 u2 V6 g
9 b$ r T1 u3 d. b* [
$ E4 V* U. \! [% k9 i+ O
7 b" S* x' x* n( I$ P$ P5 J& g |
|