|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& T; @4 a) t8 F, W# z9 f" }( q
8 L5 \8 O k9 m4 m+ S7 kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 @- I4 K" G! p& z' ]+ c
#include <unistd.h>
6 Y! J2 D; X$ e, H! f# D#include <sys/mman.h>
9 x! e5 ?" o0 \5 \* Q) @8 @' I#include <sys/types.h>7 b6 g4 g5 J+ ~2 n- B0 H8 s
#include <fcntl.h>2 H; ?! B5 W+ c* b
# p1 Q' f% }, Z. N2 f#define SHAER_RAM_BASE_ADDR (0x80000000)
! a" t+ Y0 n( e: d& n3 ?2 } A# z8 X9 v( M# b
typedef struct% \: l: J' J9 d; U' n7 i
{7 z3 _, Z4 U5 L5 N" t9 B. k- r
unsigned int a;
( t2 b) p% H8 ?7 ^; q+ _ unsigned int b;0 D# a9 C/ f: d) z- }, t
unsigned int packet_cout;
! L- Q$ b. I( I0 h0 H- c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 {) n7 ~' e- |9 s; c2 @/ s$ \5 |2 {# c1 G/ j& i: q( q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ K3 x" N0 r5 S. p7 x& ^; wunsigned int count_copy = 0;6 I$ G$ _/ A- A' b2 q0 K* x( J
$ n; N/ L$ \3 x
$ `! \: p' p9 [0 mint main()5 n8 I$ S+ d: R. E9 k! I8 [
{
5 e* f+ t/ ~, a2 n; d pRX_MSG_PROTOCOL pshreRAM = NULL;; k3 C. ?. |2 g/ }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 l# y: C) d4 u/ B+ o6 d
7 r) K) K8 V3 i6 i* \& s while(1)2 Q& i' Z! B% R5 P
{
- [& @5 [9 Y2 \8 v read_MSG_buffer(pshreRAM);
' O; d0 r* c3 ? }
6 @& z" d" G D ]9 Q7 D}5 o2 T5 w: \; s( x
! u) P3 R' l J% mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 }6 \+ D5 B- {4 O0 T{+ s6 r% r* i' t. h D) ?
RX_MSG_PROTOCOL buf;, A+ [' @/ O3 |
4 u# A& j/ ?! A. r5 ~4 b buf.a = pshreRAM->a;
* K5 ^1 ~6 [" f" y' ~: Q# n buf.b = pshreRAM->b;3 l. m! j- B2 _2 h' n
buf.packet_cout = pshreRAM->packet_cout;
5 b5 Y y0 B) z a3 G7 X$ N) V/ r 3 B" p5 G4 e/ W% h
if(buf.packet_cout != count_copy)
; k0 g2 F1 Y4 U: ] {1 P: h# r5 ~) e7 i1 d
printf("a is %d\n", buf.a);
7 o; y: F, ^, y, i8 @0 b printf("b is %d\n", buf.b);
( O( A, J6 q) o7 g( }- ] printf("count is %d\n", buf.packet_cout);
: h4 g1 }' d) A( @ count_copy = buf.packet_cout;
2 z" D2 u& q' }$ W: y1 V }0 O1 h, e/ c: w/ }5 o' n. r! t2 I
else
& G8 J7 k( l9 n {# c( a+ x# @3 B: j8 P
printf("No effective message!");
: } V/ r6 L6 o6 k* N1 q }( P% P0 X& Q; U* @$ [6 w
}( g4 a1 m$ G- B; |( V& {1 U; o
: \2 I( ~* l4 |8 u
* i, V4 a Z3 T6 S* _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' |: [1 ?" B9 J1 _1 {. D
使用下面代码,对内存使用了mmap函数后:) h4 U. ]% A0 S" \2 q
#include <stdio.h>3 u9 F- |& }) M5 Q% P8 t0 l: W+ @* \
#include <unistd.h>; A" R! u3 m/ ?& b% e m3 f
#include <sys/mman.h>2 V$ r5 v" w+ R
#include <sys/types.h>
" v5 u; H- ]/ l* o#include <fcntl.h>
7 f( `) W8 r2 o1 ~+ x5 J2 W( w& t: Y7 m1 t% F2 a2 D8 T2 U
#define SHAER_RAM_BASE_ADDR (0x80000000)9 ~, H) v/ C+ i. }' [
#define SHAER_RAM_SIZE (0x20000) # e7 @! i# w, j) E7 P5 J# S! o
/ f& Z5 z) i, H9 ^$ Ttypedef struct* e: L1 |) I( q5 ?+ V3 O5 m
{9 r7 J- W- p, g0 a
unsigned int a;
3 D- Y6 F0 m4 H# ]! S) W unsigned int b;+ O5 l& h5 D+ u8 o9 U
unsigned int packet_cout;
3 J% w/ z+ O9 U1 C4 P/ n9 U' @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% }: H; P! ?1 `, M. B9 G
, `6 U, p/ Z0 ~- E) Q; Hvoid read_MSG_buffer(int *baseaddr);
- v' \8 U9 F% v- funsigned int count_copy = 0;
3 F. ^9 g# |* p! n, C4 L6 w2 f, i8 s8 f
( M) Q/ \; s c1 vint main()
7 _6 ^ }2 A% ?1 v{: h7 H- A# h$ ~$ J8 V* y2 M) V
int fd;
$ a L: _" S e; v3 U; o' y int *mem = NULL;
" ?: ?* J$ d! d) K5 v3 s6 t" D) y3 \" V% ^7 G
if((fd = open("/dev/mem", O_RDWR)) <0)0 t# D; E9 ^/ T
{+ c0 U) q" U W" d$ H4 l8 \* s( d$ a" F
perror("open error");
# Y' L3 H$ `. C$ e return -1;8 [' e5 v# J4 h
}: t- p0 G8 }3 c/ J8 C
( T* E5 t' [8 g0 z# F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& M/ H: j( x" d9 j4 b& h% V
; w! |( \/ f# g" R/ a
while(1) ?, C$ L( K T" S4 c6 o
{! w0 Q% R. R; Y. V1 m; X8 C8 L
read_MSG_buffer(mem);2 u; ~2 t1 A. M- @1 a9 @& _0 Q
} * ~, Z5 n5 T% N1 y( b
}
1 ?8 J- J6 F. n! Q& v& E: ~
6 f# r7 r+ }7 W2 q3 m+ w3 @4 Gvoid read_MSG_buffer(int *baseaddr)
& K1 G; Q" l) C) \{
/ v0 W, j' F. |! o pRX_MSG_PROTOCOL pshreRAM = NULL;7 t5 T: j9 D1 C: z: }8 ~! N
2 d# r) R' p; q( E$ o# L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 p3 e; ^/ L. \6 D1 |; G7 D! l+ f/ ] |, r
if(pshreRAM->packet_cout != count_copy)
. I% C, m( ~; D) r8 _- h {4 a) a# Z4 p/ L7 K" R5 U
printf("a is %d\n", pshreRAM->a);4 O; t ^9 q c# ~
printf("b is %d\n", pshreRAM->b);4 X. n5 n9 \ W1 o0 c3 ^/ I
printf("count is %d\n", pshreRAM->packet_cout);# [; t8 j# v0 q; y* C1 A
count_copy = pshreRAM->packet_cout;
2 D2 P* K# L8 G' W }
; q' ~. K! O E. V else, [% W! m7 u" o! I
{
0 o& }# ^- x+ z, u9 ^; W. p w) j printf("No effective message!\n");
7 Z/ U/ I/ J7 o" f/ Z4 o, O) \9 Y# g }% m8 r" T5 B- E0 M3 ^' X
}
$ _+ w) B/ S$ x1 y$ }$ P) @
- E: C+ O+ z. ~% M5 u$ Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) f2 s( I1 b! P; ^- P; |( A
/ `5 E6 R7 s9 L7 p& s% U. l8 D# i8 M! [) ^" A" u# m$ B, o' O
`. D4 x9 |- d# z) e: n4 ?. f& U: F( q
|
|