|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, O5 L% Z7 _, ^+ ~; M c; P9 H+ V0 H& h- o4 v/ f+ q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 q1 P6 a/ {6 h1 B/ b' x#include <unistd.h> c: [! ^" V! @# w! [8 u5 E
#include <sys/mman.h>
+ w+ z- y( B* Y; m' D- _& M1 y0 v( o5 E#include <sys/types.h>
& n& A( C- k, V3 i6 X#include <fcntl.h>5 G; L+ Z, f5 u4 A# I
- ?9 F# U' Z% _8 D/ O6 G( f#define SHAER_RAM_BASE_ADDR (0x80000000) # |6 U! z. n$ Y, s
% \6 y4 D1 o1 S( H% j( z6 ~1 ]* e
typedef struct
+ e0 F* \( Y4 z$ P9 p{
" |* R) C& F6 g5 |8 _3 {8 z unsigned int a;
: O7 a9 ~. D, F( J5 {3 x) i unsigned int b;+ p+ @. ?1 T' M$ s" ^
unsigned int packet_cout;
0 B9 K& V& s: f/ W7 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; t: ~, x! T% W( |( R: \) f" N* x# t
+ X r2 _' y. u' b- _8 {' qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! L0 p2 k2 P8 N( E q
unsigned int count_copy = 0;2 N8 e6 n3 U* y( ?, A
- ~$ p! F3 @, n. Y0 m
, M, e$ n3 \$ b1 t* E# tint main()) W, l2 I+ Z4 g( _
{
# U9 W! p6 n5 | pRX_MSG_PROTOCOL pshreRAM = NULL;
4 {1 {3 ^, h& y( c, j* s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; A/ W! {" e) M$ p' y
e2 G5 P$ ?2 O
while(1)
* @. C8 l6 ~3 f r! S) L8 O {! f% C; R% z0 N9 `+ x" b( l& M* D: x3 d
read_MSG_buffer(pshreRAM);
( `. E) K" r* j$ h: | }
2 F7 j; w" |8 {$ Z}
' C7 n6 r' Y9 A9 Q* q% l
, u2 S0 u0 V( v1 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( \8 u! ?9 `2 ^& b: | k' ~{
4 f; `7 ]; Y+ Y0 W0 c) C0 R RX_MSG_PROTOCOL buf;" _( A, G U. B: p; A: x
4 i/ X! n. {; c# x! l! O buf.a = pshreRAM->a;
5 F/ b" x1 T8 c, g* |# h buf.b = pshreRAM->b;
1 d5 C& |. o, U2 x* M& ~: c buf.packet_cout = pshreRAM->packet_cout;2 G, K, g( T: d2 B
8 N9 k9 \/ K, s4 C* \ if(buf.packet_cout != count_copy)
5 g; B' b, S9 e {; o( k( o7 T& H0 M- x: Z
printf("a is %d\n", buf.a);
2 B' N& C# c7 R8 u: Y; @2 ^2 y/ R printf("b is %d\n", buf.b);
! G3 w( h( g5 }) ~" X3 x printf("count is %d\n", buf.packet_cout);
- Z3 z' k8 }- b( w L% f0 O; e count_copy = buf.packet_cout;& x. |& }6 _6 D1 ^& w& `
}
8 \0 I" _! T2 T2 K2 ] else/ C0 t! \* v6 ~) G6 A
{1 S2 P8 t+ X, c) U, X: v) X- k7 u
printf("No effective message!");
; F9 T, e# w- n }$ _( }; z P+ a' e6 W% ]
}- T0 G% v/ }8 m6 J9 G
0 q" d5 U0 ?% l7 X' f' L
2 B/ u/ c+ L3 a M! P# V0 H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 B& \# l% a" t
使用下面代码,对内存使用了mmap函数后:/ ?. C* ]+ G' P6 ]
#include <stdio.h>2 k; x( N# X0 G& P
#include <unistd.h> ~* i4 Y1 E$ k4 p. W T
#include <sys/mman.h>
+ M# w8 j# l9 e& o( `#include <sys/types.h>9 C/ ~7 U, f ^1 O' ?& t& d$ F
#include <fcntl.h>
' f' Q7 d1 ]' G: i# z7 j: Y, _; \6 ~( Y! r
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 v- B+ p: J* w4 O. R, U#define SHAER_RAM_SIZE (0x20000) $ c! Z: x" y0 w+ x
9 m X( w+ u& ~) @% r% L/ y
typedef struct" r" A9 ~7 {. p9 U- F! \" o0 ?
{7 D3 Z3 e" Q5 {" H8 F! i
unsigned int a;
7 k4 {9 B# f7 l2 a C1 Z unsigned int b;
' m# T, d$ l, B; ]& i1 W& d1 i4 Z unsigned int packet_cout;
/ M3 o7 b& q0 q, }8 \3 \1 M" A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; p7 E3 D' j. C/ q* o4 q1 @! ~; T3 i& n: o
void read_MSG_buffer(int *baseaddr);
* I( ^$ H2 Q0 |6 munsigned int count_copy = 0;
$ l! j3 @5 M8 O0 X Q4 E, G. s% z" C# s& @; h3 a
int main()' e1 x& B& j" ^4 L8 ^3 ~& V
{
7 O& j% M& |4 l8 B3 A int fd;
# I9 l. P, J8 n5 I4 t- ` int *mem = NULL;
5 Z+ b$ ^' i9 P2 E" h3 h" J8 C7 X1 ^
if((fd = open("/dev/mem", O_RDWR)) <0)2 X& A) V7 y6 | R. r1 v
{- J4 q3 A5 N4 S. H, J: O8 x; D
perror("open error");
2 f8 B/ H0 q7 C return -1; _2 ?# Z* s. ~* z% s& K0 u
}
: W. a7 ?$ r0 H- s6 f . @0 }. f- n2 W# u$ A8 e9 p: J1 J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( m1 q/ `1 u5 b1 A* o. D, C u6 N, u+ |8 f+ v
while(1)& }9 f' O# P! n6 w G& K
{( i8 C8 c' d5 z7 f/ O* L
read_MSG_buffer(mem);
0 v5 g: q& R J. V% a& ` } 7 |3 `( S2 E/ f" x1 e# m3 c
}
3 x% O S# l- N' ~ X* B" H" L4 _. S" _+ W
void read_MSG_buffer(int *baseaddr)
' O: P( q3 k P' `; F3 f{- t8 _' H: X( \. c
pRX_MSG_PROTOCOL pshreRAM = NULL;4 m1 {0 x$ d( t9 [) |
0 ^8 n2 ?4 T6 B4 f- [, g) c* x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 I2 o. s! a- Y% T- d6 @
( u- ~" h1 l5 z if(pshreRAM->packet_cout != count_copy)
0 l0 o) A }9 l& u5 C {
# f. K9 T. l: G2 I printf("a is %d\n", pshreRAM->a);" [ N% g7 E5 @9 ~( d) X' x
printf("b is %d\n", pshreRAM->b);
7 `% c) Q2 ~- F3 W7 a8 P printf("count is %d\n", pshreRAM->packet_cout);. G# I% m r( Z$ _
count_copy = pshreRAM->packet_cout;) r6 q3 {( G/ P- P$ h
}
& `7 |8 V. Z: l else
`! G u- [) n1 Z/ R' V1 u {8 k$ F6 D- @9 I g7 c6 {# H1 g
printf("No effective message!\n");
' c! f9 K7 X) w2 r l2 ] }
: _- G# I) W, b- ^/ G6 ?4 K% w}' r9 ?9 Y) m3 f. U. K7 t8 P
" Q8 M3 u9 }; C# d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 i/ s& X/ g8 Y# l. Y9 @/ H* S3 J6 G
. w$ U8 V( f, h) h* s6 z/ \' z2 t, D
0 @9 u2 u: v, n: B+ ~, E
& X7 U, G& @6 A' d* L/ ]$ _! j4 G
2 J4 x0 v) @; g+ s' a( g |
|