|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. _* ~- Z& \3 I- R! s' e) Y2 ?% L* a, r+ Q. Y. _! O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* E, h. S/ I. C: _, @- W2 b9 o#include <unistd.h>; O: e+ l6 l4 `! T* h" c9 Z" y
#include <sys/mman.h>1 S* [ d6 p1 L* u
#include <sys/types.h>
( {/ l5 ^% k' k" o5 I% R#include <fcntl.h>
& _; a9 x8 ^+ z8 T: N, D+ Q( v, Z7 _, `4 h, K+ i' E( m. }' W! u7 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
y- U; b) ]* e: X6 t* u$ J* i- L3 w, K: p) _ B+ B: ~$ h
typedef struct6 p* H: s; @5 ^, X" M1 W
{
- W, p$ N$ p2 d% K; S. K6 X1 h8 R' w unsigned int a;
8 M/ H) E1 d% y- V+ V4 o: E unsigned int b;
: H" c' E" M0 m- Z" e- T8 k unsigned int packet_cout;
^+ h5 L+ E/ i& L3 q; P) g7 P7 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: G- Y5 }2 L4 u$ F4 [1 q ]7 h G/ ~! i8 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 U1 L2 e' [2 N+ @% ]( `/ ?unsigned int count_copy = 0;0 o, D5 R3 m/ w' `: s1 Y8 F7 W, U- ^. O* y
# {* t+ ]5 v" d ~. E+ f! W
0 |) |! `6 l! H) j" \2 zint main()6 T& P$ Z# s+ Q' \% @
{
* x2 o2 V& @* E' j; U* e pRX_MSG_PROTOCOL pshreRAM = NULL;
* \9 b6 o8 D3 |8 \/ K! C4 Q pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& V% \" h( N6 E7 Y1 E# T, e
* X, |; k/ l `; W3 z& F7 S while(1)
7 Y/ R& x. L L" w) D0 b; t {
8 N5 G3 E% Y! t% F read_MSG_buffer(pshreRAM);
) b3 b8 W0 J; a* e0 }0 @2 e/ U2 g# k# b } % y8 k/ p6 V& O/ i E Z5 ^# _8 W' H3 B
}6 }- m0 E1 n9 G0 C) v
; `1 ]# K' J# z8 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 g4 r* _/ O& d* R) G{* j3 o A9 w( L8 d, f
RX_MSG_PROTOCOL buf;# B% d" I- E7 C3 g; z
3 z1 M( I. F1 t3 t0 c& Q- {0 Y8 _
buf.a = pshreRAM->a;
" C) n, s0 s& y1 t" q buf.b = pshreRAM->b; p8 }7 o* w1 V
buf.packet_cout = pshreRAM->packet_cout;$ m) a: @+ C2 p2 }& k& Z
0 w0 {+ f3 a# |9 i
if(buf.packet_cout != count_copy)( Z d" l1 Y# P
{5 o( M* H' v! E7 B& w
printf("a is %d\n", buf.a);7 S, Q3 U6 t9 I$ U* y
printf("b is %d\n", buf.b);7 t h, ?) _8 C$ m0 X1 p4 l
printf("count is %d\n", buf.packet_cout);+ c" _2 y5 Q6 e4 V
count_copy = buf.packet_cout;
8 f7 N$ Z7 y, p' D9 Y. a# P: B }
4 Y- n/ Q( K" M; {: r1 \9 r else+ `1 R6 j2 n, s9 \/ }* v. s
{2 k4 f8 R6 x @, B
printf("No effective message!");! {! y- m: \: o% q: e- e) l: r
}6 b" D; H$ `# _' G- `* T3 g# O
}- ~6 u s# o. n3 S0 z4 q# `2 o# w& U
9 [5 Q( U7 j7 O# j1 i0 x) l' Z
( E% Y' i1 W) F4 A9 F) y8 S" Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( F& f. m% H8 H1 Y使用下面代码,对内存使用了mmap函数后:
3 N3 w6 B) D6 d7 @- O) \. C#include <stdio.h>
, P' h! m' E e2 _1 l2 f$ l#include <unistd.h>
, t8 I+ G1 {7 O8 j$ V( b#include <sys/mman.h>
2 [1 U4 K2 P. S, d: C#include <sys/types.h>
% c E. J5 ^3 q. @3 e. C% B#include <fcntl.h>$ ^8 w; j6 b) Q, y1 ]
3 \$ Q6 Z; X/ o$ ~% c* u* j
#define SHAER_RAM_BASE_ADDR (0x80000000)3 }: i# S( W8 i* i7 m8 t6 l( t
#define SHAER_RAM_SIZE (0x20000)
" e/ ^' |4 ]" i- f5 V1 ~7 M# R5 l: Q8 X# S; ?" e
typedef struct* I# B) }5 I) A8 J( m" m4 |1 A! Z
{
( H% `) y; Z9 i+ j1 s _: V2 S3 W unsigned int a;
2 ~ g7 l8 x8 [ u- Z2 ~ unsigned int b;5 {2 Z6 ?7 ~' Z- Q) T- E
unsigned int packet_cout;" u( f1 I% k9 Q7 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; H9 i" m: h; y& ?6 [
5 t5 B( r, d6 ]+ C
void read_MSG_buffer(int *baseaddr);
3 N- f1 o, t8 _" Qunsigned int count_copy = 0;* P% k5 D V7 J; m
$ n$ i) i& O0 O( Z
int main()
8 |- u9 w' d5 v4 E{5 N% f! h3 @2 U8 z3 e3 x, Z' l
int fd;5 v P3 d4 }" _# x0 [5 S
int *mem = NULL;" o5 P9 x9 O1 ]2 n
- ~5 `" j" C; P9 m% y
if((fd = open("/dev/mem", O_RDWR)) <0)1 N" O9 n$ \. h' ~' Y9 { W
{# v- R/ [+ ?( ]& B
perror("open error");4 z! W& x1 f0 n6 u. ~: \
return -1;$ R' b- x# S& N! r8 N; X5 e# O
}
5 w0 f3 u( G: d! s4 ]8 W% b1 C0 c * `' u% B4 S# J. j# t% A3 s, Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 u) b) D6 J; H. Q0 h2 _
/ t" z1 d# A" }9 \9 D1 u- V while(1), A3 `) q N; R( P s% v+ @
{0 a1 S' l: _7 R9 x3 b/ v
read_MSG_buffer(mem);+ ]2 y* r% F# _* a# _; z9 Z
} : x, N S+ W+ A5 F
}3 A+ C. h7 q- I
! e0 `( Z/ ?3 b7 h
void read_MSG_buffer(int *baseaddr)' C1 o8 G7 R+ n
{- O- o: H1 D- x
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ t! _3 y3 K! x! J3 o1 h: a% i8 D9 T' }$ B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! m" f9 |5 H& e; c4 G; e% b
$ @; ?& _' E6 H5 ? f) y4 g( M if(pshreRAM->packet_cout != count_copy)
, m2 `/ E4 s8 a' k {6 D% q' K* B& Q1 M4 B
printf("a is %d\n", pshreRAM->a);4 J4 W8 W) |& ]
printf("b is %d\n", pshreRAM->b);5 ^9 C1 S# O3 J1 W
printf("count is %d\n", pshreRAM->packet_cout);
$ k6 t! |6 f8 d; X count_copy = pshreRAM->packet_cout;% y5 Z, D4 C& s& v
}
; s7 |* i: y8 P1 m* { else0 |8 J; ~; ?3 R
{
. x* m. c: \$ v! p% P9 I/ ^ printf("No effective message!\n");
+ e+ Y" i: n& f9 H: i }
: w/ a/ K' L% ]8 L% u! Q/ O8 i}4 l1 d2 E0 m# P( |' q
. K8 C; K: W" _/ h3 R( B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ~( e" U# ?* B" H; i, T9 i9 u/ f0 p. p" p3 ]
+ T+ x3 P3 [/ ^) q
. g5 l3 g2 M% k- E0 p8 }% A2 [
7 z" [0 Y3 E( d6 B' ?: h
|
|