|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + P" Y& P- Z$ z8 c5 p) @, b
e! Y% T% j; G+ k( P! U) zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) B( g. J, r2 r2 p2 F#include <unistd.h>) E4 H# S! h8 J2 n" x9 a
#include <sys/mman.h>
& ^7 e8 g; [ k& G" X" Z#include <sys/types.h>
, W, |+ x: |( j* m$ [#include <fcntl.h>" q" j3 i V$ B$ k
1 m+ a* d" J5 V! E% k+ O. }& U& Q#define SHAER_RAM_BASE_ADDR (0x80000000) - D% [7 D" y$ D$ c( [
; a' q! e6 {9 ?( D( o1 Qtypedef struct) I, G: v' O; [9 ` }/ e3 e
{" x+ R4 ~% U5 f; h
unsigned int a;
) Q* ?' {& g, a8 ] unsigned int b;
; N! T0 p% I5 P( s7 Y e unsigned int packet_cout;
4 A g; T s( b+ S: r. O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 e, ]4 L6 D W" ]! w& r# e0 Z! |( c
) T8 R/ ]% N5 v( K$ K3 N9 M4 Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 \5 N& F4 A: A, X0 m2 Iunsigned int count_copy = 0;
% N; y( E. v& S# |3 n% T7 \$ M" ?) ]' V- `7 u \7 U$ F5 n7 @/ t# ]$ v2 e
0 _" E& D- b, y" W8 `% x1 ]int main()
: e g! o, T) |{
: a4 \' }5 Q+ |# @2 f' C pRX_MSG_PROTOCOL pshreRAM = NULL;
, ?1 {& v& H+ ^1 i& h; g) J. I' V pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) j" u" T4 D- H6 j3 J- E% i5 H7 k7 G
# C! H0 x/ b: t# \
while(1)
/ X( e. w! s1 l. R7 V% { {
; s, Y4 X/ f, @5 ^/ H) U& k read_MSG_buffer(pshreRAM);
/ @) E' z! {/ W3 `; [! g' ?/ C }
! M9 v5 K3 U0 x: c8 [}
: e" O' D' w) J5 t1 O- x$ h- F% w8 E+ |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' O4 z% M8 x; A8 o# R; P
{
" T4 G7 h% n% p3 s3 v; C RX_MSG_PROTOCOL buf;$ m, U3 F4 X; K, I) ?" M- w4 c
$ Y& l3 Q% C9 u1 y buf.a = pshreRAM->a;
# X& f, a r5 g/ d buf.b = pshreRAM->b;( ^7 ~ O! H# D* R: n* x& Q3 a
buf.packet_cout = pshreRAM->packet_cout;3 E8 u% a9 n- E/ J1 o! j
6 r, l. x# M. I A6 a( q
if(buf.packet_cout != count_copy)
4 r4 W' Y' ?! O5 C9 Q {) U2 N5 u2 c: D+ M6 \6 D5 R& }: L/ \, x
printf("a is %d\n", buf.a);
& B7 ? _0 x9 G' n+ E i printf("b is %d\n", buf.b);
& ~8 [* x) u+ M' x. c3 ]: u/ A: j printf("count is %d\n", buf.packet_cout);4 |% z5 x" |/ h* e8 L) _
count_copy = buf.packet_cout;
. w, S8 o* J) d7 j }
; d) a& ?; a& u3 d else3 o/ ~& j6 n. S/ o5 y
{
6 R* N0 K: L9 s$ i0 | printf("No effective message!");: }0 F: X0 H4 E5 o
}/ V' G: x/ M- l# s2 L* B8 x
}+ H' J( [5 B& \- V; k" U. Q8 p
( h; J8 r" R1 g
g$ @4 K& F3 f0 n) v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: W& C3 {4 E' K0 _3 m
使用下面代码,对内存使用了mmap函数后:
/ o, n- Y& Z' t- U) P) O* x7 F1 e6 T#include <stdio.h>
* s( k' n: V6 L# }#include <unistd.h>+ [7 Q. K7 C V# x/ A' C
#include <sys/mman.h>
5 U. s: h$ I- I; ], u#include <sys/types.h>
, p) i1 N( J5 o7 [, M- q# J#include <fcntl.h>/ E* R0 b2 m3 L6 Y, a
j4 I7 v9 y" P" P% H) w2 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 p8 H0 I8 ~- R7 Y) i& i* I! O#define SHAER_RAM_SIZE (0x20000) $ T- @7 ]; _6 {3 y: K, c( ~$ _
4 h9 h0 V% U0 C" ^% X+ V' f
typedef struct
. V" S, U/ V* X8 x% h/ u{
$ t5 v2 i6 G- S: ~! W; O7 g unsigned int a;
& v8 [6 M4 A2 w unsigned int b;- T5 k2 e+ N g% a7 ~
unsigned int packet_cout;
) g) m. m! m, k& S: Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 a, `- o+ g( ?0 \9 b
4 w/ {) e+ t- U4 wvoid read_MSG_buffer(int *baseaddr);
& Y0 h* Q# B1 s6 Dunsigned int count_copy = 0;
8 H% |0 }1 }* D5 z! j+ Y5 c6 l: b
$ m* o# i a8 rint main(); g8 ^# }4 G# X" x
{
+ J) Z" a8 X }7 W8 E. e% R int fd;5 Q7 h% ^" I5 F! s0 _# [
int *mem = NULL;
0 Q$ S/ K% d) F9 b4 H
1 n6 y$ l3 a2 J3 g) B if((fd = open("/dev/mem", O_RDWR)) <0)8 H: ~! E$ F' C
{/ p( B1 c7 y& j, C
perror("open error");' g5 y8 H, H0 Y, l; m7 j
return -1;: S9 o/ s5 N+ D# w
}7 j: U) j) w) d7 M" V5 V; B3 N! h
( s; i3 c0 t4 p* d mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* o" R4 F; Z' A+ [& V
5 V8 i2 ^% |+ Z! G6 S while(1)
: V9 n9 i& q# C( W/ b& E9 L {
0 g W! k: b7 W8 W4 ] read_MSG_buffer(mem);
. _' m0 r7 Z0 r, D, ?: u7 y% } } 0 B1 g" d: W. C! L* N! G
}( W9 v2 F' u$ q- J% E+ e: p
1 H3 v: I# F. K% Z* ?6 zvoid read_MSG_buffer(int *baseaddr)
; [- n9 c$ f4 C5 Q{6 ~3 |1 f7 S j
pRX_MSG_PROTOCOL pshreRAM = NULL;5 [& ]5 a8 L0 K# }) n
) J( n/ S9 M" y7 T% ? q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. E: i0 Q) Q' |, Y8 \
. T" m) V K/ S+ V& Y4 E* F if(pshreRAM->packet_cout != count_copy)8 Y' w- O) H2 [5 o5 J9 \
{
4 N. ]2 f! w) D4 q& J+ K printf("a is %d\n", pshreRAM->a);
6 W7 M& P$ E, I/ m# O0 i printf("b is %d\n", pshreRAM->b);( J7 n7 I( N2 \; o6 u0 x1 E4 e
printf("count is %d\n", pshreRAM->packet_cout);
! K6 H. \: x# }0 K, R count_copy = pshreRAM->packet_cout;" Z5 T! O8 j1 w2 M- o
}7 y4 a& u9 ]: o
else: s. A- y' S! G3 z: z+ L
{) I0 _' M) N* T8 I: J
printf("No effective message!\n");4 o) P: ^. z2 {, |" b5 z7 ?
}( H" M0 k. B9 T1 c" H+ N
}
Q& b* S! y4 W2 z: \2 B) w/ X8 g$ E2 [' s( U& n0 M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 f2 C( c: J( f' }- z) s* G% M
/ C/ g& h# A% j/ V6 @
& ?4 R0 j# a) b' \8 V3 m: U/ L: t5 U6 p1 |, A: y
: X& n$ q& z7 c( M; h' `4 ^
|
|