|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
K: y. g4 B, e) K" A
% k4 v/ l6 g! |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ v: n! s% q- ? D3 D9 _#include <unistd.h>
1 L( f% C. |& z( E- Y, h3 u6 E#include <sys/mman.h>( P7 i3 j% }4 c- D+ L
#include <sys/types.h>
' L0 i4 f6 Q8 X- }6 w#include <fcntl.h>
7 T# L* V6 K* p* L V- `1 |) }7 A6 ]
#define SHAER_RAM_BASE_ADDR (0x80000000) 9 w/ A* X8 _, Z; b% _
% }. u, K. L3 u6 m, i* A* _/ xtypedef struct
/ _$ X/ o) y3 u( W) T- t( f3 D{
/ k1 i8 h1 K: e6 y unsigned int a;
6 V' C7 A, v8 a( T0 g7 J unsigned int b;. y6 s# P. X& Y: l, \
unsigned int packet_cout;: X7 [- c; I( b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( R6 e& m& z1 t
: t: f. Y& @0 b: w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 I" f2 u( H3 _( ~: K' hunsigned int count_copy = 0;1 l% C" ^/ U# c! v2 B# M
: I4 A0 K8 O5 a) D
; L5 M# p- p/ s# J& z
int main()% i- h% y- E W; v% x% V4 j
{- ?# n# r4 }3 g( V- U; Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
, y# }& ]/ b& t8 n" E pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* W0 ?9 j% U5 q# J2 c0 F) h5 s; w* F# y2 i2 r
while(1)% h- y, ?" @5 e* m0 | d
{
& y6 p2 l) [) b2 K% b read_MSG_buffer(pshreRAM);' A( P7 _+ B0 \6 ]1 f6 k5 t
}
( r' Z1 p6 i% o# O0 m& G' k}. a% [; u# y3 `/ [
6 i, E+ O i- ^- u L8 y2 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 n9 L# w0 Q* U' F5 x{8 r# A! d* t& T3 x s: V
RX_MSG_PROTOCOL buf;8 J' A' [/ W" L' d" k
$ y$ K( E) H- ` buf.a = pshreRAM->a;/ x1 a! ^1 w0 w( c: s
buf.b = pshreRAM->b;; ]+ R, v) E! D: @+ t) {
buf.packet_cout = pshreRAM->packet_cout;( s6 T& `( `% ~6 m" `
7 ]* n# D1 I! R8 v: x6 a; l
if(buf.packet_cout != count_copy); L9 j& m) U9 z$ q6 {
{! D; u9 U. R+ p! F9 I! m9 v
printf("a is %d\n", buf.a);
1 E k7 O+ [: k# s& X8 v$ } printf("b is %d\n", buf.b);
) `" [1 e+ M; I; o) u6 f3 F printf("count is %d\n", buf.packet_cout);
# C' Y+ a0 p! g; s count_copy = buf.packet_cout;
% q2 M+ H+ k. A" m1 c" d2 ] }7 h: R8 h0 E5 W5 H( c
else0 Z! G3 k$ o F, g4 a
{
1 Z: N4 w4 X3 |! o) c3 {6 ] printf("No effective message!");
+ H( ^. ~+ g5 R0 Z. D$ g }: g/ M: o1 f+ z4 @ t1 Y6 @; X
}5 _( Q" c% s' U v
+ @0 P" a- w% U* y2 \) b
, w( }5 U/ r+ i V/ a q0 D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" I0 I5 ?% z' r+ y) J使用下面代码,对内存使用了mmap函数后:7 G; @4 j* u& _' j' U s4 g
#include <stdio.h>
) o) J% X$ I0 r; ?#include <unistd.h>* P( N/ E8 V8 W
#include <sys/mman.h>
& H4 G2 U1 Z! t0 p#include <sys/types.h>+ @ H/ {$ H" a }9 D% K
#include <fcntl.h>" e2 L, j8 Q- b0 i/ T
; }! |/ q! h; T- z ?#define SHAER_RAM_BASE_ADDR (0x80000000)) S: w( B9 K2 F$ y9 j* d
#define SHAER_RAM_SIZE (0x20000)
# ~* k! F* _" J% S+ d
/ j6 G# _8 f: J1 Y9 Jtypedef struct8 L3 [, O" w, d5 U0 r
{
- I; @* q) s. h9 k7 G unsigned int a;
" p! x; u' @0 A% a2 F) H# D$ W unsigned int b;4 }) ?& ]) z, x! H
unsigned int packet_cout;
5 l# s! ?' S5 b% _ x1 K$ Y0 N' @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# p6 i6 ^8 k% f4 e9 d% T
" `+ j, p( u$ M/ e2 q- ^( c9 yvoid read_MSG_buffer(int *baseaddr);
, `! z! T d& J4 n. a; [unsigned int count_copy = 0;* P0 H* v8 Q2 z: n) y% V0 ^
4 X8 u& \; t/ x* F0 _* s" H7 F; gint main()
# L$ n, T8 E% ]# c' T{
! _/ R0 j! D* G( e8 L7 b int fd;
0 a& f: {* H. F1 l8 h5 {* {6 v, Q int *mem = NULL;
7 r2 H! {) @6 t6 g+ w) m* {5 j% v( I* e+ }" o8 R4 _
if((fd = open("/dev/mem", O_RDWR)) <0)
" h: }8 H; b) @& Z1 n E {5 H2 _1 Y5 U6 Q5 Z2 Q. g
perror("open error");2 X+ i0 E" t' V! j- b
return -1;: {" R2 k% ~- y) r$ l2 m$ A
}
5 x: h. E7 u% U7 J4 X. T 2 H; f$ w& Z' t3 k, E& K& D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 |( p8 e9 K ] m- G0 y
. O% F0 R& f; \6 C( h% p9 |* Y
while(1)
0 V1 @; p7 z5 N) x$ U- R5 h: { {* q0 z. G) W b! D- P
read_MSG_buffer(mem);! j6 U* [" y( n9 Z6 x+ J
} : m+ Q7 s& c" Z3 a. m1 s" C
}
, V3 K* f+ ?- ^: S' S
+ K- `! e% {; s h$ Uvoid read_MSG_buffer(int *baseaddr)8 r% G' o% `) h3 y- O
{
' [3 W2 ~* Z# T% @$ F4 E) ^ pRX_MSG_PROTOCOL pshreRAM = NULL;
* l# n- ~* x6 Y8 g9 o
( h$ r @" r% d( P8 j3 p( Q: z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* \, o* d* G. {+ S
9 f0 \( I: K4 `3 _0 G( l if(pshreRAM->packet_cout != count_copy)
3 B- u1 S+ ?, }2 p {
+ o, j7 X) V' I0 T* T7 H printf("a is %d\n", pshreRAM->a);
u0 U3 c9 R+ q9 b7 a; z printf("b is %d\n", pshreRAM->b);
6 m/ S+ s& g/ O. m3 f0 e X9 t9 V printf("count is %d\n", pshreRAM->packet_cout);0 |, ^1 }7 l6 O
count_copy = pshreRAM->packet_cout;5 P$ q5 I2 ^" Y4 ?
}
& f% q* k- }- S t4 a else& a7 E5 M) M0 D8 W
{5 @/ \9 J9 Z0 O
printf("No effective message!\n");) u8 H6 d/ c0 B. o# N- H
}
7 Y( ]! S! k, Y) _' ~}( q9 J2 `* T& u' D7 \
8 L+ g. Z. P9 K! w b ]) I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ b; d" ^: G; q9 O4 k5 E2 z
6 R. F6 W, a( }! s* H" Z
+ u* ]& u+ k' n( T/ I8 \" l) w1 A& v3 J- X0 x" {6 _
' M: ~) m# Y- f5 V+ c |
|