|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 l& F( z: W9 b8 H$ k/ n |+ [% u% p2 I) R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 A: l. Y6 f3 N
#include <unistd.h>
3 S0 M3 i$ m3 d- e7 _6 o#include <sys/mman.h>6 D% S, ~ E P+ k
#include <sys/types.h>
% n7 z3 {+ b& ]) t% Z& l#include <fcntl.h>% X. s4 o. n2 Q0 t3 x: n
4 j9 w4 k, `9 Z#define SHAER_RAM_BASE_ADDR (0x80000000)
0 J9 W* x; n% M' t( h7 T9 h E- y2 Y; O5 A8 G) I/ J
typedef struct: u- e& j' k. Y# j
{0 T" C! I" B, R2 b
unsigned int a;# s7 g l9 b2 k4 ?$ z: c, X: h- W
unsigned int b;
! L P5 U2 } ?! D- N8 |( { unsigned int packet_cout;
/ `/ x9 i8 o- T; {6 M$ M2 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' c( m1 v8 Y7 D7 y8 s
, [# Y+ _( O* |6 A! R* s. I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ I$ E! w7 Q- C o2 \unsigned int count_copy = 0;
4 L* R3 t+ p q6 D. c- k
. Y' ^ e! U6 U5 d8 T) n5 O
, F/ C1 o' P; g. b, d' t! ^int main()
3 F4 L: S) \8 w+ \{
) f, T& q2 ?. G) W7 {( T pRX_MSG_PROTOCOL pshreRAM = NULL;
; X4 h- t4 q; c! e' E) z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ ]( \- N9 q- a2 u6 i7 h0 ^& G+ h6 d1 i
while(1)) L$ [3 Y" T0 U2 s4 a: Z4 o8 Q
{
& z1 a9 q7 V, {* H read_MSG_buffer(pshreRAM);7 F9 [4 n4 x) C6 c
}
# m; E Z6 I; F' o% J$ q" C( X}- e+ h7 c( q- L! H
% m8 |% l: n! E9 f, ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ i3 b: N0 C4 r* D1 R% [
{6 _/ r7 m! r! X0 T" k, O: e
RX_MSG_PROTOCOL buf;
6 @! E! M5 H( @/ w( s3 K : z( W9 T: P5 I5 i, {9 j
buf.a = pshreRAM->a;2 @" G- C: S8 b; z$ g1 P( d
buf.b = pshreRAM->b;+ f. ~. G4 J8 t7 [6 I
buf.packet_cout = pshreRAM->packet_cout;
' n0 `' U; R2 f
& S2 Z2 n9 E. R7 O5 t, N2 L2 P if(buf.packet_cout != count_copy)
. l' e2 O5 c7 f& E {' B L9 e/ N: S& v h. D7 N
printf("a is %d\n", buf.a);, {( B9 w# ]: _
printf("b is %d\n", buf.b);
+ O- [% O/ c% N' J% T/ ~ printf("count is %d\n", buf.packet_cout);
: d. F! [% l9 t n8 A) ` count_copy = buf.packet_cout;
) l% X1 e( j' }, f! p2 q1 ]9 ], Y }5 j9 B0 g0 ^2 E9 G+ n/ T
else, \$ l+ x) ?1 E6 z7 a3 ^* h8 S
{1 \% ^* B- P; O% y6 S, K+ }. U
printf("No effective message!");
/ g1 {8 W ~' L9 i# k }4 _ g8 {# Z: C7 }- k: L
}
0 J: [* |. _8 U% T* ~1 \# ~9 H- q3 z1 ~3 k4 H: T( C
$ R9 s6 W/ d. F3 M& X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! k* p, A* w" D. F7 E使用下面代码,对内存使用了mmap函数后:, M; @( b7 D% J$ z
#include <stdio.h>6 x' f* O( c: l# o- {8 M
#include <unistd.h>5 b" O+ y& `$ ~1 H% }
#include <sys/mman.h>* R+ P3 n" ^2 h. h( r9 S) m
#include <sys/types.h>
3 \' y/ N% b# v6 n+ i$ x#include <fcntl.h>9 }$ J' q( c9 A6 {8 |; @4 H" M
$ l) |9 X+ v3 t& B#define SHAER_RAM_BASE_ADDR (0x80000000)
- w$ d4 ]" D* C6 O1 c. ]# N#define SHAER_RAM_SIZE (0x20000)
* z8 M/ X5 Z' ~2 x' e! U/ `/ V4 @6 D: B& S, Z
typedef struct6 N2 V8 F5 G* n
{. p; @8 G2 b! }1 b d) V
unsigned int a;3 n' v. l! t$ n8 ], R/ J7 C9 r; V! P
unsigned int b;
* L( `" ~) y3 h unsigned int packet_cout;' r0 }( l6 W& W1 k; ]" F6 G \3 N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' B" @* v7 g X- b* W& y3 k" f& \/ ]* e
void read_MSG_buffer(int *baseaddr);- Q1 t1 N5 A, Z
unsigned int count_copy = 0;
- a e# L* o8 w: M- l+ [
4 b- M9 S0 l# N# Q5 Tint main()
, S& Z6 s" I1 J2 J% k7 }{) ~& n' G0 H8 v$ P r' N1 z
int fd;
, j3 ] n1 t7 p+ B, c R: J. d int *mem = NULL;
( }9 a9 |1 m+ f% H; X) D/ I6 M2 M- s6 q9 u- I
if((fd = open("/dev/mem", O_RDWR)) <0)
- S" l3 S3 Z3 O" B' S. h/ S {
; ~; n& p0 Z2 w! x7 k- _ perror("open error");3 `$ M3 B# w: l% V" h- l
return -1;
" @, i8 R7 D, y- } k1 D6 S9 G+ l }
' q% W, M1 h8 m& e
: Z) @+ }' x N/ Z( N6 m' M1 \7 s mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 K, ?' \7 d' i, S" o9 U' _4 T; z1 T. w! ]. C6 F6 o
while(1)
. I- W8 }/ w Y1 Y w3 w3 {! G! T4 @ {
# V( D" D; `9 ]& o, E3 d |/ a" a read_MSG_buffer(mem);
1 P2 r+ I" N: s }
0 V _- d/ e& \' a}( s8 }! ~( `; j
, f" q; p+ e1 I* j! B1 y
void read_MSG_buffer(int *baseaddr)
9 u. b6 r% n* v z{7 r* @* b3 j1 `
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ I3 R+ p2 f. }2 f! D% ?1 d/ \9 I! J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 ~ V! h( p* N; `
5 Q7 c* |) d+ w if(pshreRAM->packet_cout != count_copy)
! I2 L, E( h+ k {
" r! [9 x2 o& I0 n$ W' m2 B- B printf("a is %d\n", pshreRAM->a);
! O7 [3 v7 u! F( z2 B! j7 c printf("b is %d\n", pshreRAM->b);7 B( S0 K# j1 \7 U1 w
printf("count is %d\n", pshreRAM->packet_cout);
{, m; B" j6 Z6 [) W count_copy = pshreRAM->packet_cout;
0 k. ?8 b8 D: K7 G }# W5 l8 M/ o& ]( j) J( g8 B" U
else
( v. ~/ P3 `- }# Z% @% O" { {
" T! W2 d3 R5 R$ n printf("No effective message!\n");7 b$ x: s* X+ h# u2 ?
}
6 ]* F" b1 L: r8 }1 P}
% G- N! @+ E+ ]5 U6 c; A, O5 `5 C
9 L! W4 m1 v' Q3 U" K没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
O/ o; ^6 _) D# _/ T. o
2 r0 a' H0 _# M6 z2 V6 E" E) {
# J: s$ K+ E N
/ u. e6 v% a6 t) y
( K+ Y3 z8 g- o' u |
|