|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 }% r2 D0 D; i3 o/ h) } Y: A' y5 A" H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) Z; G: ]. v$ C8 Q1 [( B#include <unistd.h>
. M* _7 d) B" E9 |8 o- a#include <sys/mman.h>
4 e2 o# Z$ X( ?( d#include <sys/types.h>
* E3 r! ~- H9 R2 S#include <fcntl.h>
5 }( f' G; ^$ C/ b
; u0 F n3 p: \#define SHAER_RAM_BASE_ADDR (0x80000000)
( p% N9 J8 [' P$ R
7 o; S% q* w P- G% d% J/ vtypedef struct
& [ O9 G: f7 u( W6 K" A{, k7 q9 M5 M$ \9 k6 c
unsigned int a;7 {4 ^" b" _9 f0 f
unsigned int b;# b/ H7 T0 j' n, x& `* p5 {3 E. U
unsigned int packet_cout;8 \% |5 Y$ B1 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# t0 f" F+ @( |: i! ~+ b# I" u% q; Q& `& E9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* s# G! U$ q+ p$ z( Sunsigned int count_copy = 0;, `, s/ E y; `& c
- ]4 o& V- v3 j8 |* i5 W
* D, q i* g4 f; Y# C4 N6 ~int main()
- Z) c; M" g$ Y! o7 p4 k* J1 o{$ F7 W3 w2 A# d3 T% n& ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ P& s2 P% g! `) ~) m% k; X _ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! N, }# `: A5 w- B- x
) p9 c( \/ a9 S8 o
while(1)' @; a" E& n% W8 r( c5 e
{
8 f4 Q4 i* a6 t8 D% g) L9 v read_MSG_buffer(pshreRAM);
) R9 S$ D$ y; A% k% O- U } ; j* [" @$ m" q" x
}! {2 H. h* Y0 C
& Z- v4 u$ B( Q N6 @1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 N. _: i- Q) y0 C' I# ]/ g& `5 r
{: U+ {1 e* n+ w/ N+ s# \
RX_MSG_PROTOCOL buf;" f3 z0 m, P; A
: u8 z: I$ W2 Y' N; z; y3 u8 p buf.a = pshreRAM->a;9 D- u3 ]0 J" S) }
buf.b = pshreRAM->b;7 v1 j1 k, B$ h1 |) z( p; m4 S4 B
buf.packet_cout = pshreRAM->packet_cout;, m( f* O8 m) y' r4 J- ?3 a6 Y
% ^7 j! B" T. R. D- Z; X! {' w# u
if(buf.packet_cout != count_copy)* C& o- n3 C( l7 s/ Y: @: L+ {/ m
{- c" \/ n5 ?3 x5 `
printf("a is %d\n", buf.a);7 I1 v2 V% y% J& n
printf("b is %d\n", buf.b);
1 V. | S" i% S v$ W0 N printf("count is %d\n", buf.packet_cout); n, a8 x+ P0 `$ N+ r$ w
count_copy = buf.packet_cout;
0 R0 z4 @# A: O! O" C2 l0 ` }
; H3 Y$ ?8 W+ S& ]! j6 i else r9 e2 s* g# ]
{1 S8 h: S+ D1 g- u) B# {2 k* o
printf("No effective message!");
8 i) L; ?$ d; r, ~3 C" H }7 r% w6 d* k/ O
}6 r! W7 q4 @0 p( O2 K# f7 h. ^
8 w( U7 P$ a: c I# T$ r6 R% z
! G$ g# i4 R% |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! {* A9 j$ Q& Y" l$ s2 J( z, w
使用下面代码,对内存使用了mmap函数后:2 u" u1 x3 @0 ]& D* O& I+ ]
#include <stdio.h>/ k; b: d N7 ?/ ~( X9 V7 Y
#include <unistd.h>( z8 u% I4 X6 c* y) K$ N/ E
#include <sys/mman.h>
, y* e+ w+ T% y3 M; g/ x#include <sys/types.h>5 v1 n. {' }/ A+ C8 M% k4 T" P
#include <fcntl.h>
! B# U- q: ?& o% T0 L. ~
' P" a6 c5 ]( {% V8 p$ k#define SHAER_RAM_BASE_ADDR (0x80000000)) b* r2 |( ~9 M/ I8 J& R
#define SHAER_RAM_SIZE (0x20000)
" W9 I% H' [" y7 N) d8 |$ [ C! X1 N. m) t
typedef struct
" R# [2 ^1 n! I" ~{
% `6 `' X% m0 n; Z4 [ unsigned int a; c9 `/ p! d% [+ n( ]4 u, E1 z X
unsigned int b;* e, f% W/ P0 M% g
unsigned int packet_cout;% I3 r, t, M, ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ A; i# V& x+ g* v3 d( u }* X2 L+ C; a$ V* a( m7 P* a
void read_MSG_buffer(int *baseaddr);
. S: D* A+ Y9 p9 @unsigned int count_copy = 0;- k, e& W6 O9 K" ^( C! \( r
: d! X! b; B+ Tint main()
3 @- W H& i3 o2 i& ]% A! h{% ?: z% o2 V4 }8 k( x
int fd;
# {, J, o% b& M, T4 w int *mem = NULL;. n( r D" C. k& Q6 e
4 Z; `' d I. |" F: ~5 f if((fd = open("/dev/mem", O_RDWR)) <0)
9 n/ @+ X* p1 N m7 W4 \4 H {+ I: X9 Q" s' _4 ~9 q
perror("open error");& d$ S7 b V7 ~; S
return -1;! C2 ?7 V& }2 d% z
}
+ X7 K0 x7 p* z7 L9 V 5 Y$ [4 Y" c3 l6 W" D0 M9 o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( D6 m3 y; n1 \- m6 w6 E
; P* b5 ?- S, J2 H while(1). Q6 {2 n* p9 S, Q* H# a0 d
{
7 o( r1 K/ q! E0 b read_MSG_buffer(mem);
3 G/ T4 S+ u" S3 }8 o9 W. b }
9 G& H, N3 r: p4 n. t}
m2 @: V* H2 G0 M$ R4 N/ P6 ?! U: a" n# `* M- P( [7 m
void read_MSG_buffer(int *baseaddr)1 x3 {7 E: I s) @& M3 r% s! I
{1 i a) t3 Y1 x# h) z
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 e' x/ Y/ e. P4 M C- t1 x+ f
5 n) A+ I) ~+ U pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 t8 Z O1 b. }& p9 d0 H+ g- n/ Y
% I/ m7 \: Q3 ]$ h, b" b k+ }) N if(pshreRAM->packet_cout != count_copy). @8 d( J: t% h7 T+ p) T7 ~
{, L8 H( }4 z: \0 X! ~
printf("a is %d\n", pshreRAM->a);
) b# R* g& G8 Q& T2 V) ?' V! t! S printf("b is %d\n", pshreRAM->b);
* E& q9 p' r {0 \+ o printf("count is %d\n", pshreRAM->packet_cout);
/ |; A& U& F& A count_copy = pshreRAM->packet_cout;
x0 b1 r3 `: O* Z8 c, c }% R% a2 V3 T8 v0 v) q8 m# M
else' K" U |" j. c" A) u
{
+ b! [* I2 ~4 I$ y printf("No effective message!\n");
; P- {% g0 {( h }9 _& }, ?, }. q/ B
}
* O2 V) d2 j: k! b a- `2 _6 o* _$ Y2 n6 l3 j" a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( R7 e' g: e/ L2 x* f7 q, J- Y+ I8 q; F1 E9 @9 f) C
6 {( X4 D6 f/ r& x0 t
: |9 h+ O# N5 M5 E+ v! u' Q g) n& y O
|
|