|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 J- d3 J3 l6 e
& C0 w. {8 g1 z3 L& y# W9 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 i; i) r1 ]1 B h+ f. k" }7 a#include <unistd.h>- Q! c8 h+ R, Q6 @8 m
#include <sys/mman.h>
% R- \1 g5 o! V/ p4 }#include <sys/types.h>
+ T" l" K9 C0 W. J. T2 ^/ I#include <fcntl.h>, }4 }# R1 O. x1 }) }8 w
! w) o' m: r S/ I4 `' G#define SHAER_RAM_BASE_ADDR (0x80000000)
; d* l% y4 b' s) r8 {
+ |, I$ x- A' i5 u3 Y+ _typedef struct
) H3 x$ V5 q6 ^9 \: ?{" d3 F6 g8 g! t
unsigned int a;4 R9 }2 l# k5 V
unsigned int b;4 E: ]( x2 U- P, R" r- s) w5 O: X
unsigned int packet_cout;# \; e3 U+ H8 V5 k) @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* I b& J. T/ a. I( M
+ R% q( O/ k$ E Y9 d& gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 H6 A& S# m5 j$ Sunsigned int count_copy = 0;
$ o3 g3 E' D# ~) q1 n& |1 C" I& C( u) X2 |: g9 x V
; t+ H- m( v6 E) h9 n1 Z8 ~int main()' K' |$ A* f: B0 n# Z8 ? q% a3 C
{
" P8 |, e. P6 ?5 C& y/ B pRX_MSG_PROTOCOL pshreRAM = NULL;- h2 M' D5 |7 `4 h& `( s# l6 V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& o3 ?% I( N& f n& E6 h. u2 O7 F
while(1)7 F+ `+ J! W9 P
{: ^( m9 g% V4 R" l) }
read_MSG_buffer(pshreRAM);
' z8 F) a9 [) T7 t! P$ H } 7 X' ?- \: Z1 e
}
+ ?$ a. Z; i6 X& d m9 o; F% A7 H0 h R1 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! I! w7 m: K8 [: U B0 S, |# t6 M{
* v8 ]: L& A T5 a8 [" A RX_MSG_PROTOCOL buf;
3 A" P% W( h1 Q3 R3 G4 N 9 t$ ^. B* L h. A
buf.a = pshreRAM->a;8 u T- ~- G$ H& d
buf.b = pshreRAM->b;
9 z' ^0 I9 f. t2 ? buf.packet_cout = pshreRAM->packet_cout;
* ~2 K3 @* J- ^6 f" L
, |* U( c! j+ w- R, r; d5 u if(buf.packet_cout != count_copy)
?6 J* w+ D! [5 R/ e5 K7 G+ m {
8 N% ?+ c, C! ]! [3 E+ j printf("a is %d\n", buf.a);
$ W& e0 s2 f( b, r1 E2 j printf("b is %d\n", buf.b);
% S& j! x% n# Z9 r3 U$ n& H printf("count is %d\n", buf.packet_cout);! l, j8 e! {" f' l& |8 h, d0 o
count_copy = buf.packet_cout;
- t8 Y0 E' G0 E2 a9 Q" q }
& H$ L8 x( G& v/ l7 I else
$ Q) ~0 X% u. ^2 c( t- ?7 ?2 f {
0 D; s% h& L4 R7 j printf("No effective message!");2 _4 M- k& l- R5 D8 M
}
# f: _% J+ R, W, @+ [, N3 L}
6 j4 @( z7 |* z' u/ }7 U! j4 |
* x2 N. s, ~5 l2 u* h4 q6 {4 a$ p4 x9 Z) `2 j3 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* h- ?' h/ _) B7 S+ X使用下面代码,对内存使用了mmap函数后:2 i+ R+ @- ?, [2 ^" e6 H5 R
#include <stdio.h>/ ^ N. ]' B3 J. |
#include <unistd.h>
M6 c1 d5 G0 j& y% a0 r#include <sys/mman.h>
6 s* L& a( Y: i#include <sys/types.h>' r, o) n7 h0 N% A5 I
#include <fcntl.h>
: v' l, r7 h5 b) @5 U& \; G) \# H! B' g
#define SHAER_RAM_BASE_ADDR (0x80000000)
. d2 T: ]; U+ h C, J- m6 B5 I" k#define SHAER_RAM_SIZE (0x20000) $ z: ?/ Y$ x9 c: ?9 _: v1 g3 J: |7 w
9 M A' S' P" x$ {
typedef struct& L& L4 ?, M1 l) s2 L( B
{5 U7 A) r! u7 V9 z
unsigned int a;' o. O4 B. o( y7 w! [" a3 R
unsigned int b;
' h" |3 i, u# K3 C, k- d! H6 W unsigned int packet_cout;
, B. j9 c* r' P* b2 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 r: O3 J; Y, z3 d) F' d! F' K# f$ G
- @% I; m5 r- @+ m% l& f; d% V
void read_MSG_buffer(int *baseaddr);
4 R8 w& p" C- a9 n% [' }7 y% munsigned int count_copy = 0;5 [8 v, \9 b. I* o& ^
' p. e. l ^9 [( k0 P3 q
int main()& y& \. X% s- {+ p
{
6 n( d* t9 Y9 T. ?; W: j int fd;
1 u s9 W0 K% K( w5 B/ v int *mem = NULL;
1 _" m$ L4 o5 n, Y! M0 y, B+ Z& u4 @" a* P4 r1 _/ s
if((fd = open("/dev/mem", O_RDWR)) <0)
. j/ r" s8 T% f {( x, Q$ a( I/ _3 S
perror("open error");
3 q( @6 E# |/ v5 J2 L/ h return -1;
( e1 b7 S3 T6 U/ k- } R/ o8 c }
! _3 z' J; e7 [3 R% l6 t, J' U" d7 A
: S \% g T3 z' d mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- M3 q, ^ ?/ ?% J* B/ b
! L# i6 l2 [1 i$ p! g3 S0 r
while(1) p" ^ r0 I; S; F
{) t* {+ m1 g, {$ J# `
read_MSG_buffer(mem); B9 U- M1 T. w% ]& A: H0 M
}
; _( r9 d v5 \' m3 U}3 R1 A ]% P* c c. Y
; \+ b8 z" k1 ?
void read_MSG_buffer(int *baseaddr)" N8 ?' F0 R" s$ k5 t1 M
{5 T2 Z- r2 K& Y( ~& T; n
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 x8 e( K' D4 {: P& q5 H. t' A8 z. b5 l6 N& ^1 a. L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 k3 \- l( C% ~/ |
. N# _; f! U1 _$ d& e if(pshreRAM->packet_cout != count_copy)# L N9 C; I& }2 e6 M, S- E
{
! n7 _9 l. c5 |8 d9 H printf("a is %d\n", pshreRAM->a);
3 Q7 [- F4 ~- k7 V6 B. _ printf("b is %d\n", pshreRAM->b);- P$ Y! f' y) T" G: e
printf("count is %d\n", pshreRAM->packet_cout);
5 d9 ~) _5 z8 z4 B& x- ? count_copy = pshreRAM->packet_cout;" x! u" g6 o5 _& H' |& e# r
}* ^& c+ r, v7 |: A4 l3 J
else* M( E2 U6 k6 G B: \; A
{
9 r9 T, B5 U! t6 l/ F# s printf("No effective message!\n");
- G# }. s7 T* `( j" _0 q4 c }- @% s4 S% Q0 N4 F: F' n5 o6 }- o# o
}
9 w$ C% f: v) u: ?, O2 l- l4 B+ D2 o H* k, f! B* w1 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 w& t( T I1 x
5 I3 L- ?5 c v6 k8 `, t8 F% S1 K
) {1 s5 j$ R% S1 i, i# b
% l$ x/ b0 C: R, X! K" b4 t/ n
, R8 t" U6 V$ c# y |
|