|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& P3 j. F; b& U; P/ E `7 V; u' E* ]- a; v' `. q7 O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. V$ X3 x% n' r- @
#include <unistd.h>" A5 Y1 ]/ P$ y o0 l' G( T
#include <sys/mman.h>
1 B! l; a7 L# ]7 e6 a#include <sys/types.h>. ?$ Q4 V2 Y! P# h. I4 n" N* J
#include <fcntl.h>
" C% l: v$ g/ A4 r* F$ z
* b. M* {/ k, ?5 [ ~5 g3 q#define SHAER_RAM_BASE_ADDR (0x80000000) * C6 R' c" V+ H. ?8 j
. y& |* D! x( i( a" ^+ r ^typedef struct
4 u; `* _5 a3 p/ I{
# o! d( {( a7 O9 R3 p8 [ unsigned int a;% k$ w; ?( B* n1 I
unsigned int b;/ E5 B: Y& j8 p5 V/ S3 u$ w
unsigned int packet_cout;
! u/ F0 {- S' _! B: u0 W; x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w( F& _/ C, t% O' D `- F$ C9 f9 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 N4 B$ Y: @/ k: d; \! Q ^3 G( k( V/ vunsigned int count_copy = 0;
$ K" X( _: J* q: G Y* P3 F9 n4 g: x3 X, s
% s% M' E+ W: ^# l! _- i- |9 S/ y3 p* [: Fint main()3 }4 B. B! ^) i# Z! P4 M7 B
{' c t1 f( S. \ h9 t1 F
pRX_MSG_PROTOCOL pshreRAM = NULL;3 c2 k) `, }) ?! p ~, O
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" R/ V# |+ v6 y$ W4 E
% N$ m b3 z3 b
while(1)4 f. w: J+ s9 [1 {
{
, p* F$ y/ @( [; T, y read_MSG_buffer(pshreRAM);
8 m* k- g+ Y* x7 j } 7 F+ K% z" R! G4 J
}+ m% V/ O) j: u! \# {: v; L" P
7 w5 A& h. q1 Q4 ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 L# X+ ^6 F+ r2 K; U7 m) ]) p{' B$ B$ Q/ y6 n# t: |+ Z( D, K% { w
RX_MSG_PROTOCOL buf;: r- Y, Y- t$ `+ x3 v$ `9 ?) }* a" H
# y8 e' p f- T7 h0 g
buf.a = pshreRAM->a;/ x; E) j9 i! X' o- {4 ~ G
buf.b = pshreRAM->b;
; E4 T6 J) Y' P. R buf.packet_cout = pshreRAM->packet_cout;
8 a5 q8 a3 p4 Y* c' D& u
8 p0 \% k# P, R- S, R if(buf.packet_cout != count_copy)
2 I |* r, j4 U6 \" A4 S8 B {+ J5 T6 o6 i* a' T5 d
printf("a is %d\n", buf.a);9 r* c8 B% z1 ^! ~
printf("b is %d\n", buf.b);, u8 ^% L) Q% K8 f! }
printf("count is %d\n", buf.packet_cout);# m' S0 t4 R- [3 |# J- k4 o
count_copy = buf.packet_cout;
3 j. ]3 _' l1 x- _3 ~: s# s0 S5 { }) p* r9 s# ?! [& a! ]
else% f+ W' _' B# \0 W
{
9 R! K$ _1 Q! s+ L( B- j printf("No effective message!");
% o: s' V+ f( m% x6 D# H# U }' i( ^4 Y9 A0 m8 \) u/ v$ I, ?
}2 U5 b1 x; a* `% \2 X5 e3 }+ N/ r
6 I3 ^/ P2 F0 u1 V9 A3 M8 _( Z
4 E8 D! i# ]- [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 Q3 Y% T1 g- h1 N9 y- R
使用下面代码,对内存使用了mmap函数后: m, Y, `5 k* E1 d5 [
#include <stdio.h>0 T+ q- s( q1 L
#include <unistd.h>/ q% V1 b- G) K9 d
#include <sys/mman.h>
) e5 a* Y/ {* k1 O#include <sys/types.h>5 K/ x6 u, U3 J `; i8 Q
#include <fcntl.h>( I& `& P A+ ] G# I7 w
9 q, N) L- d# s A$ J& y$ w6 a
#define SHAER_RAM_BASE_ADDR (0x80000000)- ^: f' \6 M7 l9 ?4 _) f! w0 E& `
#define SHAER_RAM_SIZE (0x20000) 7 ^5 @0 H: P- C+ E7 \' F% u$ P
& m2 v+ O2 ~* ]5 k# Q/ G! a# l: E7 q
typedef struct
( e$ W0 r- v8 ]( ~{
/ T1 M* x$ Y( w" ^$ X; s0 Z! ` unsigned int a;+ P% B8 P* x% F3 ], O7 l
unsigned int b;- @) D" |0 V4 [% Z
unsigned int packet_cout;
' ^" m8 g+ I( R% v, w* A# e" e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
r/ c' b6 h! w1 d# Z8 z C/ P) {
( a) p' _. r) T; q W$ H% ^: kvoid read_MSG_buffer(int *baseaddr);
; ?0 C. G6 W Y( z; s! Kunsigned int count_copy = 0;
* K( u0 B& _. D3 E9 ]5 l; b3 I
7 E2 N3 W3 a: X7 s$ g/ b0 x& Gint main()
$ X b3 H5 M3 E{
0 }3 z/ f9 B/ V* _* t' j int fd;
2 {9 X9 _1 v% H) u; g int *mem = NULL;
$ J% V, m& I h/ P ]+ [0 K% A0 a& M% S+ _' c" o( y
if((fd = open("/dev/mem", O_RDWR)) <0) @: [) P: {3 f" U/ M+ B
{
( e; U2 q, ~& k! W perror("open error");
1 l+ G1 v2 l/ [# M& x% E return -1;) n8 j1 p) v2 `$ ]0 v
}( v4 e, e! v7 x( e$ l
2 m2 q$ r3 C* h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: Z C) U; j7 I9 j
* J) r3 C( k: E6 H" G
while(1)
6 @2 ?4 u$ y8 C, b" O+ m {
# Z% O2 C' \; e* d# t8 i' r/ [ read_MSG_buffer(mem);: C' E5 s6 H0 R3 Y7 ?
}
8 i& p# J* j$ M0 x5 e& c}1 e6 G3 P* r. t
- N- |, R9 a- @) x9 e: P. ^void read_MSG_buffer(int *baseaddr)1 c; W# l: |. H' O$ _% R+ Z s
{+ g i" z$ h3 r% G- G
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 P( ~* V0 t1 c) [6 ^" N# ]. f: B" d/ |, o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 }& ^0 Y) M% T: |& Q: M/ h' T4 |/ n. i3 F q0 S% v) e
if(pshreRAM->packet_cout != count_copy)7 v- q9 `# c1 N
{
, H# V- A+ ~. W% I" Y printf("a is %d\n", pshreRAM->a);) A& [( @# r3 c# u5 v4 i
printf("b is %d\n", pshreRAM->b);2 _3 L* a k9 ~# y8 f
printf("count is %d\n", pshreRAM->packet_cout);
4 U: s4 Y- I/ Y) S count_copy = pshreRAM->packet_cout;
& z8 _- q# \$ J* C. ?1 x }
# o$ K1 i, }& V# i/ y1 I! t& V* F else
o. m: F5 m, z2 Q {) O& ?9 O9 S& L) \; l3 n) \
printf("No effective message!\n");7 i! y( z9 Q5 f8 E
}0 u- @% _+ a* C6 L
}
, H' \! v; j( z+ H* y7 o) w/ p& N- V9 \7 n# O: f& t+ H" s `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? a+ I1 \1 Z" l# W0 w
7 N, j9 t4 ^! W! M
, x2 i3 R0 f8 t8 N
) c( I/ R0 n f$ Z7 D6 z# t6 l5 ^, K2 ^
|
|