|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! Z$ C/ A0 r' ~3 K% c& c# |- z4 v8 r3 e& u9 e$ [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 V8 I# Z3 h: f! P#include <unistd.h>
5 q. Q7 N" ]3 W2 s% X ~#include <sys/mman.h>) S$ `. T* g9 _( h5 z% O; [& V' p, A
#include <sys/types.h>
" u5 P) \' x" K! A- z#include <fcntl.h>
% ]$ M/ |% |6 _) A* }$ l: Q% F. y$ I @. G0 A/ f; v& o
#define SHAER_RAM_BASE_ADDR (0x80000000) + M& `. u8 S, t" d3 U' a
: l7 g: Q# ?# R5 [2 \' j5 m/ R# Dtypedef struct
: h4 K7 o1 U$ [% F9 |8 {2 o{9 k& J2 \6 G2 c! I2 E- G
unsigned int a;
4 r7 Y# ~' h, w0 Y unsigned int b;4 G; z2 m" S& ?
unsigned int packet_cout;0 m. X3 A; @$ r( W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: t& _6 L5 c, G A( \% r) Y* G% L+ Y! F- q) d' ?+ W& t0 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 q3 m( x9 M6 @) S2 P3 o
unsigned int count_copy = 0;0 J. E: |( W4 e! M" X1 j$ }8 ^7 F [
# p/ j, x5 X9 J$ [; l/ q4 x' n0 ?8 I% K2 h( K2 l
int main()1 L. j& H% M0 A; j" p
{
& _2 S1 I( L7 a& q# | pRX_MSG_PROTOCOL pshreRAM = NULL;* O. d. O* t& \; T& @ p$ [
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 h# ?3 Y6 v4 c+ m# p5 M z( }
while(1)
; A; ^7 u7 ?2 g0 O0 _ {
! Z; q. `. C5 p; ~7 S% Z read_MSG_buffer(pshreRAM);- I" I* t8 H9 k+ l) L
}
9 x! H! x4 W: y" h: D" j, {, b}1 s, Z( x0 U7 y* q
- C! S$ {6 i6 J$ T1 J, M0 d% H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! G& S% z' p$ g6 ]
{
/ \$ X8 Q! P$ ^$ _, B RX_MSG_PROTOCOL buf;7 N. l2 s# l( N$ C" ~
0 l8 R7 ], c. P L
buf.a = pshreRAM->a;
9 G$ \. A% A' j J buf.b = pshreRAM->b;9 `% A- A, j# k- ] Z! j
buf.packet_cout = pshreRAM->packet_cout;
6 P* |) T9 o* S0 y: U4 o$ H
4 o$ I8 m7 O" ~$ }' |6 i if(buf.packet_cout != count_copy). a1 I+ i4 k! d& K8 i; o, E
{9 }6 i: O5 X4 p
printf("a is %d\n", buf.a);! ]1 A" x( L+ P9 K4 a |
printf("b is %d\n", buf.b);
( O0 ]6 c; e8 f1 E: A7 h: B( j printf("count is %d\n", buf.packet_cout);9 o# k& t4 @! a S% I8 x) v
count_copy = buf.packet_cout;) n6 _4 Y4 W: M, `! M7 v" w
}% Q @$ c$ \) _. I
else
, W7 x/ i1 r# T/ O) ?, v+ _ {
& |: k8 k, P# a. s4 K! \& A printf("No effective message!");3 D2 `: u' `& M" U* p$ }2 ]5 |
}
, m) g4 f) s: P/ h# c f; b1 _, a}
1 `/ u/ V ]8 l1 f
0 k% j: m& S$ e) T7 ?1 p9 k3 d' n) w: [. z# X" i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- R$ u0 B, H( g7 G) Z
使用下面代码,对内存使用了mmap函数后:
0 ?& Q* \ G0 \! |8 v0 s4 `#include <stdio.h>& }$ O& b4 i( ], \, e2 q$ ~
#include <unistd.h>8 [. W' ?! r4 M5 `5 w
#include <sys/mman.h>
* Y% o9 p# S& K( k( w$ S#include <sys/types.h>1 d4 k+ d& ^# X) m* `- \/ `) a
#include <fcntl.h>
( p A8 S# W' `# T- g! ~' H- E3 z3 v% Z
#define SHAER_RAM_BASE_ADDR (0x80000000) M1 o( l& U3 |
#define SHAER_RAM_SIZE (0x20000)
3 S W6 {- t8 e. N- u, d- C8 {8 e5 `
typedef struct
( ?. G0 ]+ h9 J{4 U" E2 ~& f$ |5 p7 x
unsigned int a;! k% @5 M1 t* m: ]
unsigned int b;0 L/ f* D- @; J+ f1 W9 N5 K! i5 D& K
unsigned int packet_cout;% R F4 a6 a5 i" n( w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 a7 k t! _/ n t- R& z# E. J9 }
2 t) G9 D2 t! Q, N) |7 W1 F: X+ d
void read_MSG_buffer(int *baseaddr);
7 W6 a6 n2 G! K7 Punsigned int count_copy = 0;# ^4 [& t" a/ I H4 P) u
' L# B$ u$ L; o2 Kint main()0 u8 ?. g) j+ ]; @7 T9 _( O$ _( A
{0 Y P0 P4 F* f: i$ ]6 Y
int fd;
/ w4 _7 E( S2 t int *mem = NULL;3 ^" b8 b' W0 a2 h% b! Y- b/ k
* |% ~' B$ U% X7 ?5 X if((fd = open("/dev/mem", O_RDWR)) <0)
. N4 N: c* ~9 d! m; r- m {
# E0 o5 ?* h1 b$ Y, k0 g perror("open error");
% |% h, L2 W( N1 ~+ \7 ]/ l) e! d3 u return -1;* o, |/ [! G" x2 G- r" v
}
0 a# J* ]! H4 d& m( j ^3 ~ N5 A) O7 T) R9 F* p5 F! S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 D2 s5 q6 k5 W9 g/ k7 g+ Y
- [( Y7 l: i& O( w while(1)& n& H& u& c, L) h) b
{
6 c* U9 N0 W3 C5 z$ X0 h read_MSG_buffer(mem);
! q/ q' e7 N* N8 G }
0 n" q. l. V$ L+ ?. y2 l}
( I- P0 s, \; Z5 j; }1 v5 w
) p" q6 N, x2 M. j1 i- ?void read_MSG_buffer(int *baseaddr). N a/ H. H, s+ q7 I+ D+ G
{9 U6 b D7 r1 e9 ~3 @: Y7 [2 q
pRX_MSG_PROTOCOL pshreRAM = NULL;0 a5 a7 k( _+ B& C
, {1 a5 f2 @$ J2 {; v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. q9 e. \$ q. L0 b* g- c Q; @0 {- w! X8 ~6 I9 T4 u
if(pshreRAM->packet_cout != count_copy)
9 ? P/ ~9 f# Y8 f, r G {6 Q C7 r- ~4 t3 ^
printf("a is %d\n", pshreRAM->a);( X9 H# I* d: ]1 f; |2 {! |
printf("b is %d\n", pshreRAM->b);
* N3 H, P- i& Q; v3 E. b printf("count is %d\n", pshreRAM->packet_cout);7 j0 j" G: i- u
count_copy = pshreRAM->packet_cout;
! o A1 S, E2 g. K) T- K }5 I4 j, u; Q, Y9 w+ T4 N: R+ H) W
else; o7 l$ ^0 |9 F' [ G
{
: N- m5 j9 A! Q v printf("No effective message!\n");
9 Z# I# l' N( T& Y: H }/ C, N0 ?- M B' l/ T" Y% b9 V2 |
}( V7 ^+ @( H0 l3 r
, t: `" S' h# E, d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 g$ U* F+ a* p5 R' a% r) ]
" I& [+ @) { `$ r) ?! v( v% B) r- S! U
. i: x7 K5 t7 Q! g5 D
2 o) i1 w& ]$ c7 ]$ s |
|