|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 l# ^ I. Z- d6 N5 t& r
( q) I; P1 [; ~! T; Q! AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 T" a" p+ T# A" W. c" ~4 h
#include <unistd.h>
2 u" D' E$ b' O& x& r6 v#include <sys/mman.h>
: m1 [& ^7 ]# J& K) ]: Y#include <sys/types.h>
! y# X6 T# J2 Z/ m#include <fcntl.h>
1 ?5 p4 z) p) ], Z8 \* Z4 I5 r5 h/ ?5 i1 {0 [
#define SHAER_RAM_BASE_ADDR (0x80000000)
. {9 l! g4 K0 U6 i* j; ?1 W% V( K7 |. P9 E' h; ?1 X2 m
typedef struct
- R; o2 D2 |3 C2 P, `& U. ?* R{8 ]! b4 o% Z6 S: j
unsigned int a;% r9 Q& A! X5 A; M, A2 t" _0 v% S) N
unsigned int b;
, @+ B3 T$ W9 K# D( m/ y* e unsigned int packet_cout;
. s% J! f3 y1 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 l* o& t. L4 m+ f
) W5 e& R/ L3 `( q* V N _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& E; x/ y8 f# R! U- j8 I, y& lunsigned int count_copy = 0;9 z% k f3 I4 b' R5 H) X) \
4 q: d1 {1 ~0 F) n9 B
- o2 c. @; l( a* w+ V
int main(); G* S: M& f; {
{ A- ]* W+ r) m& V1 E& W
pRX_MSG_PROTOCOL pshreRAM = NULL;9 l7 G P M6 l0 z( e' g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 \* q! S( a& v+ r! p
" F9 S( ?! y- @2 k+ c1 G* D while(1)7 M, q3 R" B# Q, R# I
{
; f5 `, M) r, y7 F read_MSG_buffer(pshreRAM);
. v) I- @. [* U( \ }
7 k {* c6 [" e! o}, ^4 ?: r; c( `
5 a) v7 X' N# z E9 V2 L. \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 t9 q4 G% @. u: r
{! Z$ i+ w2 C2 r q! U) L# d
RX_MSG_PROTOCOL buf;6 c2 M8 L, V1 Q4 I
5 a- e9 j. U* Y8 h w buf.a = pshreRAM->a;1 n( I7 d* g1 U0 l2 k
buf.b = pshreRAM->b;
# H! l/ I: G- C7 C3 F* F4 g! N3 } buf.packet_cout = pshreRAM->packet_cout;6 E7 O* E$ Q; x" a
4 s# i. L6 Q* h if(buf.packet_cout != count_copy)# m3 f8 ~9 T: ]6 P L
{+ }& j# T; s1 y4 p' b9 p5 \
printf("a is %d\n", buf.a);- j6 _% P2 r9 D; U- \# l. ~
printf("b is %d\n", buf.b);
/ _+ O8 U; H4 ^2 _* q% M printf("count is %d\n", buf.packet_cout);
+ D4 s+ K3 B0 M count_copy = buf.packet_cout;, S0 O% X. ~$ }9 O
}$ i9 ?0 w {# e
else
8 D7 [$ z( I( ~9 ]4 X; y {
' Q; }! s. }% @3 e. `0 ^ printf("No effective message!");
, D8 X1 S8 i7 ?$ F0 @5 E* ? }9 J0 y4 a+ a; |4 j! L1 p
}
) `6 |" \/ G. Z' L# A3 P. `- i6 o& C9 i
, Q. y, o. b/ l2 o- q- b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 ?3 E2 o2 T. S U5 T( b4 ^使用下面代码,对内存使用了mmap函数后:" D% L" r4 V9 y, w5 B( W5 l
#include <stdio.h>
' E8 N7 r( ]2 d, i#include <unistd.h>
) e C; m: Q6 k( H#include <sys/mman.h>
. W8 }6 p/ F# ^1 G/ J" E7 a#include <sys/types.h>
4 U8 H3 Q9 T$ i9 J0 d#include <fcntl.h>
! |. X' k: G6 f# G; q. ]- [7 H: q4 E, @, o9 g) i7 n8 j# Y# \" c5 {; j
#define SHAER_RAM_BASE_ADDR (0x80000000)) v5 E# f) j( G
#define SHAER_RAM_SIZE (0x20000) 4 D' e% c* @" a" L! L
1 L! i* d& x% g
typedef struct
) z6 y% m4 V& y% u3 X3 d{$ G6 M) H# A( n: ^5 h0 i0 @9 E2 m
unsigned int a;
; L$ l6 ` x4 F$ M unsigned int b;; D2 v. W4 ?' M7 l
unsigned int packet_cout;
4 o1 m" I3 n# @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 W9 P! Y" E1 z$ |+ g |
3 W1 `) b! H; svoid read_MSG_buffer(int *baseaddr);
# M$ A# y9 d- r1 y& ^unsigned int count_copy = 0;0 [" \ k! C; l
4 J4 D: U' n! z9 m, f4 q3 Xint main()
3 X% j Y% R$ C f( T" v+ w2 u{
, p, T3 H* V( s+ m, ?$ J int fd;8 P9 {* U5 R6 Z" m+ @' _' @7 ^
int *mem = NULL;7 h4 m. ]7 I( D" e# J C* e& H
1 j; h2 E$ s" Z; H
if((fd = open("/dev/mem", O_RDWR)) <0)
6 K$ l% P. v& a! m8 k7 r8 N {
0 d1 v. q& y, b) u! o( L perror("open error");4 D$ A, z2 Y' Q/ ], @
return -1;
" \, ^: _! E+ C }
; k5 c; G9 A$ X+ \5 _) l: n ) Z* K& o! n& ~9 A8 u( L/ A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 C X2 P3 o# u6 P6 ?1 ?7 z3 g
5 p3 d( J1 Q4 ?. v( l while(1). }, C1 C" N6 x
{
( ~9 Z1 {+ F, U9 B/ `, [3 ~. Q& u read_MSG_buffer(mem);% B5 z7 Q7 @: Q D7 m
}
7 X" Y d3 w7 Z; ?8 {" `}
% ^% \7 r& ~5 Y. d$ t4 [' s1 x& o5 j& I3 H/ L9 I) y8 s
void read_MSG_buffer(int *baseaddr)
' W4 b4 O* v( A5 @/ g; g$ g3 A{2 Z* F4 v% P1 w2 a8 V% M
pRX_MSG_PROTOCOL pshreRAM = NULL;
: G" \5 c0 G4 y [& K3 p
4 u7 S, Q" A* X; {8 ` pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" T; E/ K7 Q6 Q& u! T4 m
" a. c1 E9 h6 v" |0 S1 @! M if(pshreRAM->packet_cout != count_copy)
2 Q& ]0 }# N- s |! Q, Z/ @2 R {" |' T+ `- K. }7 H$ Y5 @
printf("a is %d\n", pshreRAM->a);
* w. X1 `* ^+ l: Z( j printf("b is %d\n", pshreRAM->b);8 h- l* \; o7 W- ^4 u5 G6 B& t
printf("count is %d\n", pshreRAM->packet_cout);6 m$ k& Y4 Z4 p1 \' N' P
count_copy = pshreRAM->packet_cout;
, o( V9 G% Y* } F }, f I- I8 Z, F$ r
else/ Y2 `5 U" v5 K: @9 n
{
" ^5 V9 s( |$ g7 x, t" s+ |- a0 d printf("No effective message!\n");0 P! }8 N( i* L4 L$ b
}
, B( L8 m* Y- ?}
- I- c1 L9 [$ [ J) k+ R+ P
# j7 F- m; R6 ], g v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* G/ Q) v& z2 C4 ]
p6 w0 Q+ E/ G. u6 P8 V
- t2 P- S* u$ e1 M# e! o, n5 ~) V" Q& ?: _) H0 Z y
: b. L. i! W6 y8 X, k |
|