|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! \4 d; K: s0 d6 v; ? q8 c
! e* \9 n. c6 r1 b3 U: gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 q- t7 u1 e5 V" v
#include <unistd.h>
6 U c5 m: l% o! z#include <sys/mman.h>
" j) B0 r+ ~& V4 p9 a1 t0 s) S% U#include <sys/types.h>
3 l" v2 W! }8 Y! B6 J- P7 m#include <fcntl.h>$ [6 Z' Y H K( ?+ f5 b: `- I5 j
5 \% b2 z; R6 ]5 w! E) I: f
#define SHAER_RAM_BASE_ADDR (0x80000000)
: P' C/ b. z8 ~- w$ ~+ Q
8 q) _9 b4 ~8 U+ |typedef struct
+ m4 p) R% j5 o" d/ b# H; {( u% R{9 p0 ~5 h6 j3 p: c
unsigned int a;
]- ?5 n: ?5 |0 E unsigned int b;& O* f* q9 {' J5 W/ s* m
unsigned int packet_cout;
) `+ X0 o" N0 v3 |; L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 s4 O9 U" L! E& o, O
/ _" d! V! V* y3 s, X3 z6 d. ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# g% g% M# \# h6 [- s. Tunsigned int count_copy = 0;* X) C/ _9 x) y0 ]# Z9 R0 y, w
* R: y9 ?" D. P
& W# i d" ]- p, U/ q" p T- hint main()
# V4 `. b5 t; A% P4 I% [{# X: L) _1 ^6 Z2 |+ P& D
pRX_MSG_PROTOCOL pshreRAM = NULL;8 G3 ?9 y& r) T1 ]6 Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; O" b; H5 B9 G
& }8 {; w X0 W
while(1)
$ U+ J! M! I, { {1 I+ X, }: Y6 t9 k
read_MSG_buffer(pshreRAM);: [* a( Y# W, Y
} ! k/ p. g, J* v- a8 |! X! @* O
}
5 Q2 Q; ~8 f+ J8 C6 r0 J. H1 v4 u2 H$ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) J/ p; S' ?2 M9 \{! [ t( N8 A9 ], R& H* ]2 u! d
RX_MSG_PROTOCOL buf;7 {+ U2 p% E' ?; l/ o
& D, u y* `( z- l8 y0 f. _ buf.a = pshreRAM->a;
# Y0 w: M( l. F; f3 P# ? buf.b = pshreRAM->b;; Y0 Z0 b- R- r2 T( h f
buf.packet_cout = pshreRAM->packet_cout;
2 u1 n T$ }$ Y4 Y4 \( I$ z $ T1 X' d y' y" |( G( ^/ l
if(buf.packet_cout != count_copy)
: [, u" G# u7 }, r5 p {
8 |0 \7 {2 w/ o7 d printf("a is %d\n", buf.a);
3 B$ Z& \* u W4 @* T8 g) a- j printf("b is %d\n", buf.b);
w5 }9 g* [# E0 z printf("count is %d\n", buf.packet_cout);
9 @% `0 ~6 k' G: z1 O count_copy = buf.packet_cout;
- H0 ]' p+ V- d }
: b! _! N+ S- O4 t* ` else
8 r1 a9 R0 t0 G2 a% o8 u {/ o2 L) J) `# `5 V+ [! F
printf("No effective message!");! u c& o& K# D1 \; n
}! R" x& H7 p4 y) m! k+ [) x( _
}3 }& Q; z( W" h
2 l* l! n) B2 m! ~0 }/ k& |7 q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。 I! O0 s0 n( C4 l8 I, b4 z# R
使用下面代码,对内存使用了mmap函数后:
% ?! ^/ K, J" }$ [#include <stdio.h>
& x3 [9 Y: Y M5 l#include <unistd.h>
' B& s( [! D' ?$ W#include <sys/mman.h>
- j( k1 Q3 [- Y0 }9 w- Q: Q4 _#include <sys/types.h>
, w; v/ m" F- ]( c/ R/ t. _; O& x, ^% r#include <fcntl.h>: V( J K+ v" r ?! |1 X V# o
5 f! P# k4 r% P) q
#define SHAER_RAM_BASE_ADDR (0x80000000)
" y2 I; [% I5 Y; O# c& t#define SHAER_RAM_SIZE (0x20000)
* s2 }1 g9 o4 p) f* J, a: z! _ F5 Y4 c; B. ~$ Q
typedef struct% c- m8 @8 `' v' e# }' h5 \
{
: w# C. {, `( M' s$ \ unsigned int a;
9 p: e( K8 q& a" i0 a unsigned int b;" p0 H' ~( p/ z$ ~/ l/ U
unsigned int packet_cout;" G7 X/ ?' Q: ~& I' o' L0 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 F1 m$ d3 m' ^! k% ]3 |; N* K' ]- N% o
void read_MSG_buffer(int *baseaddr);2 `: j$ E1 F3 n
unsigned int count_copy = 0;7 m o- W, ?8 u
N6 S* p. j" T! s& f3 k7 hint main()/ g) n4 z% ?4 A2 H4 G/ E! S
{, I% m2 t) K- X
int fd;( F5 I# b* q6 A+ Z( ]
int *mem = NULL;
* R# R. d& T9 t! b2 L) C, Q* j M G4 }; y0 H6 K* t& ]
if((fd = open("/dev/mem", O_RDWR)) <0)3 l, s3 j \; w0 j$ Y+ E% p+ J
{
3 `' W( x6 e) k4 k2 j+ P8 E9 C1 C perror("open error");7 b: b& h& \" h7 `0 w0 `1 g( h
return -1;# K( O, A' ~+ ?& O5 M, g
}
3 j, u, ^/ _/ D, B/ W. n" @0 r
: K+ k% `5 G. J5 M mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 E6 o8 [1 X% L J2 ~
# G! t$ q8 p* J6 S- h. _ V5 C: a while(1)/ C( p$ I! s' S; m, @' _
{
- a$ L5 g; N; c, r6 T" i- E% } read_MSG_buffer(mem);- ~1 M7 ?. {* v2 M) b4 i
}
* q0 v9 A! E1 T" v3 {! u4 H9 X# `" B}( |% O5 w( l# _ d9 l1 h* V
% j7 @+ F4 z: F4 n6 j
void read_MSG_buffer(int *baseaddr)
" H$ W# _2 [# u/ n$ _{: `( E( i7 G/ u6 C5 Z9 U4 m
pRX_MSG_PROTOCOL pshreRAM = NULL;
( x& V0 g/ W3 g6 d8 _4 G+ y
3 `( [3 U- k8 U( u; s pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* _$ a5 D+ \5 U1 }5 S( A+ u1 S& q% X# F ]# n
if(pshreRAM->packet_cout != count_copy)9 N7 r# K/ [' B. T
{. `- y: {8 K4 ]3 m( g5 {' s2 i {
printf("a is %d\n", pshreRAM->a);
; ~5 X) j3 B% f+ a+ O! i printf("b is %d\n", pshreRAM->b);2 q% `# S9 W- Z* F- J
printf("count is %d\n", pshreRAM->packet_cout);- @ ?8 O4 W3 {2 q! {
count_copy = pshreRAM->packet_cout;
; {+ V3 h: A# Q$ g) h7 z }
7 H, H9 r' \7 A# K else
% x7 \; {5 \6 f/ W; Q {# s+ K8 C3 N V
printf("No effective message!\n");8 t0 y; o0 S- l: J8 F. u5 v" h7 I
}
: X3 f$ u" m0 @}
* z# Q* k; G+ k# D0 {7 U! k* t/ @
- K6 a, I1 ?. |' m2 c2 s没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. n7 \, |1 k/ i! c$ B1 ?
9 j* E1 R4 @% k0 \! n0 l$ N( y
3 X7 u. ]9 A! i7 u, u1 v- r8 E# Y" {
& p7 R$ w; _$ l6 X6 @( O |
|