|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 s, t7 f/ Z4 ^
. Q$ C5 F: F7 kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; A" m" y' X) F# D# t; j+ J
#include <unistd.h>
9 m# z: v, A6 O$ {#include <sys/mman.h> u& f: F0 d/ h& y8 u3 T* Q( v
#include <sys/types.h>
* U5 d* W+ y! l1 Y) |2 Y' P( c#include <fcntl.h>
5 C) ?3 D0 A% S3 R, |# E; B
6 s9 e9 O6 R& D3 T; f q#define SHAER_RAM_BASE_ADDR (0x80000000) + V+ I! h4 ?2 g" b* f/ k) w
6 E! g- M! [+ s* ^typedef struct
* z$ ?1 o. w1 ~0 M. W' r0 Q{
# u& x. p3 W+ z. f unsigned int a;* d) g# n( x) g, S m3 f
unsigned int b;) \5 ^0 m4 {8 m" G; |2 C- ?
unsigned int packet_cout;
z- J0 h/ `1 Z B' R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 X5 Y1 I- r0 Z! `8 l: }& F! M
, G* b: Z, M% xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 O# h' a1 C# t) l& M1 K
unsigned int count_copy = 0;
0 ^3 m3 n0 Q% R, S- `
& [" @! l* E+ H' z! e' V
+ i m; N8 _2 q& W. @: u6 y; ~int main()
, t2 G- z& _0 `, J( {/ G0 M; G{
: x- a+ P* z, A$ |& J- Z4 @: y* a pRX_MSG_PROTOCOL pshreRAM = NULL;
8 o" a# M ~2 E) E) H, u pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; g5 R% `6 S. P& Y1 V
, O% Z3 M* `; h; B
while(1)
L7 L/ Y s. ~3 b: L {0 x9 q: c1 G" T7 E
read_MSG_buffer(pshreRAM);
! E3 s+ _4 |; t- c; y }
, H2 N( c4 J7 l: Y, f/ v}3 ]1 ~& V& }2 n2 [" X, Y4 P
% F* h/ ?4 z. Z3 x; \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 M1 M0 p+ Y9 C. a t{2 Y% R3 b, Y( _
RX_MSG_PROTOCOL buf;+ e" ]7 R" q/ f7 N
8 j2 t" G3 s ` Q+ b
buf.a = pshreRAM->a;" S' Z! B" |4 f/ g' n' @
buf.b = pshreRAM->b;
# S* x5 E0 V$ X L5 O2 @* E buf.packet_cout = pshreRAM->packet_cout;
6 ~6 c i7 N9 H! z( X" X+ n ` * f% {! H" f4 w3 V. F- Z$ A+ Z
if(buf.packet_cout != count_copy)! r' Q8 m' m! I
{7 d, o. N3 A1 D. {* b8 ?. e
printf("a is %d\n", buf.a);9 Z2 J% y9 d" ?- @, x. Q
printf("b is %d\n", buf.b);; G& K- O" ?5 F: b1 I
printf("count is %d\n", buf.packet_cout);( f% R3 C0 N. Q. Y) @
count_copy = buf.packet_cout;
+ F/ `' u0 p2 w. X/ A }
_1 @' v' u3 L% ] else
, e6 _2 z2 h& g3 q) `: q {
' c" j( G2 x+ C printf("No effective message!");8 V0 Z$ g# m$ _' r/ N: p1 V0 p4 X* C0 b
}- E# |" N- g y. C( `; _
}
- ~2 u9 r2 E2 j. d& i) X2 n' K( c& Z8 y% V
" v: b+ q4 p/ ^9 l/ v2 n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 I& [, h9 d+ ] z( `使用下面代码,对内存使用了mmap函数后:
6 o9 b# @) n- C o) J; ?3 b#include <stdio.h>
$ T$ L5 |4 U7 K% x& D7 ?#include <unistd.h>$ ~% ~ T/ ?0 {% \" }4 n% m
#include <sys/mman.h>
* S% F, B) G+ U/ t#include <sys/types.h>0 ?& T5 K% z% ]4 N* G/ R: x
#include <fcntl.h>
: ]) G1 W/ v/ j; e% E# h' k2 p/ F) e. b# L8 V% ^$ m: t
#define SHAER_RAM_BASE_ADDR (0x80000000)8 M( E3 y6 c8 I9 E2 n4 O
#define SHAER_RAM_SIZE (0x20000) & G- Q& M/ U; @; a, W7 q. V
& Z2 G; h8 [* r5 V9 g2 utypedef struct$ ?: I D8 q9 \8 o% o; [
{$ u# c' k# Y, V: K
unsigned int a;' f- \& h V- h0 U3 G9 T; f9 R
unsigned int b;
6 w2 L3 \4 v! U( A unsigned int packet_cout;/ a0 C3 H7 p; k8 B- E; j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 g' m. ~7 `; ^3 V. g# s! W4 C% j$ [, D
void read_MSG_buffer(int *baseaddr);$ U& z- ?- Q; w% k% W
unsigned int count_copy = 0;, C# V4 c. N/ Y7 I! P5 F! c
1 j+ {. o" y& X; q( \4 }7 R
int main()0 \+ a8 J! K' a2 k; T
{5 [! [& I* J4 J1 o
int fd;* R# R. O8 J! H$ p+ h; ?
int *mem = NULL;
. E3 ^/ m6 W! ^
: t' t. R3 [3 T if((fd = open("/dev/mem", O_RDWR)) <0)0 m @8 E4 H* M- e
{# K) W% g2 z6 y8 r! g0 h) A
perror("open error");
7 [- d; u; n: D return -1;
5 ~( G/ b% ?. {1 S1 W7 ]4 I- T0 x }# g2 c/ G# ]4 y( r, R% ]8 x
: w. m% {; D9 K/ h: y/ w+ |( H3 i7 l mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 D( D+ s6 G0 |+ m
0 t% G9 L+ ^0 m9 k1 W while(1)5 h% V2 H$ Q' r2 |, p1 U- Q
{9 b3 W3 w3 l1 u" b2 J! B* O
read_MSG_buffer(mem);
) p3 r0 Q: M4 A' X0 z/ R }
: o/ i) n' ^0 `}
: ~- D8 h. ~: U: c6 k" @- R6 F# H: Z6 j+ m$ ~# U6 ^+ d
void read_MSG_buffer(int *baseaddr)
: {9 ~3 m6 H8 R{# E r/ \( k4 e0 T; `/ o6 O4 }) i, ], Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 }4 S6 D3 Y/ s0 u* b" J& ~7 o2 |: P0 Y0 w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 R" d c5 {- F" O ] U
! k, [+ O" ]* `/ b+ v if(pshreRAM->packet_cout != count_copy)- h2 N2 g" \5 |3 n
{4 X v! u) d5 w6 Y) L
printf("a is %d\n", pshreRAM->a);0 \1 n; o; R- {% p/ g/ @2 w+ n$ _- F+ _% p
printf("b is %d\n", pshreRAM->b); q5 N- i: `8 y7 y: r4 c
printf("count is %d\n", pshreRAM->packet_cout);
. S1 R v, |( y2 D1 _$ A h count_copy = pshreRAM->packet_cout;
! Y. a3 N7 b2 j" ?4 `( P }
) Y* t3 b9 C1 R& |5 {* a9 t else' {4 y/ h) i2 E; j' {" p) z3 P
{
8 r' M1 s7 W" m8 v0 @# ?+ E printf("No effective message!\n");
6 ~) ]( x4 |0 t& ]7 t$ V+ X- s6 S }
: P* l1 c+ W M, r: u0 P* A# c- m9 F9 S}) A5 X+ I9 `8 v0 ]5 q
: R8 I) I1 t: C1 P; Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ O. `6 q/ c; R0 l& ^9 u, s
& e1 y$ _8 [4 t( Z9 s
, S( ~" J' r( L. H, I- Z$ i3 p7 {) T3 k# ]" ~
* w; C/ Y2 Y0 F- ^ b
|
|