|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + W" V3 r( c/ I( e% A6 D8 _
( A9 S0 \ Q- X. \, v0 v5 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 @- \* {7 s+ S) k. \$ E3 U, S#include <unistd.h>! [2 o% n# B) j/ B
#include <sys/mman.h>
9 }6 _# i' C) y% X; U#include <sys/types.h>
( u: ]! q1 n `4 J' [; F#include <fcntl.h>
+ N" M2 }5 ?& c' e* u) ~/ Z% M& c# Y/ R& t5 @ `' ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 V0 O7 F2 \5 [( r; U x5 S v: ]8 J% f1 U! _
typedef struct
- L3 }6 t5 g9 @, T{
4 A8 S7 }6 I" n( u5 G; M unsigned int a;6 S0 L0 j) ]( r4 y5 {
unsigned int b;
( z, V: l1 m7 f+ o unsigned int packet_cout;
+ {$ s7 O$ j5 B5 {" b# V3 R1 r- l2 Q9 J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ m8 X% P+ I+ W# P. a( I
) ]' A; p! T; i3 p7 _" @: ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ q. J# ~- `( K2 T
unsigned int count_copy = 0;% G3 T0 `. x& `: ~
" s3 a- w; L, y; p6 j9 Q8 R% E% d2 d
int main()
# Y3 A" Y6 B* i! ]+ ]{4 R }/ h* Z, \" _8 r- d- C. i+ B
pRX_MSG_PROTOCOL pshreRAM = NULL;
* U# n3 t8 @/ G. [ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 A1 z D! b$ U+ d* u: F
4 v6 f8 Y. j7 d; |% l; b while(1)
6 }7 z! R/ o! \ {/ [7 E5 M7 ^/ Z; [% o0 t
read_MSG_buffer(pshreRAM);: u6 Y! w$ ^# Q' u- [3 U
}
0 Q8 r# n1 X; Z8 x* I}
! e% ~6 A5 r) s- j6 N" S7 o1 _) }" Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' O/ f" G9 q+ G4 m- T* x{
) F8 x( h" O2 i+ r RX_MSG_PROTOCOL buf;
5 j `4 r8 i- o+ x' |5 d: P
$ g* q3 q& O2 N1 x6 z) N buf.a = pshreRAM->a;
# q6 P- ]( L* Y3 s1 f buf.b = pshreRAM->b;
0 P7 [$ w: I- b Q( b) J6 w buf.packet_cout = pshreRAM->packet_cout;
3 ]' J# j( m8 |( F& f, q5 L; R
7 T; X! L2 S9 G if(buf.packet_cout != count_copy)$ i* J- E: K9 v' B! q) ?
{. b' G6 G9 g4 g# K9 L6 F" Q9 j
printf("a is %d\n", buf.a);
v8 A# A1 {& X$ P, \7 q) h X printf("b is %d\n", buf.b);' C/ ]3 B I' L' s5 k- j' q6 b& {% D
printf("count is %d\n", buf.packet_cout);& \& R7 ?( O9 r0 B& H, m0 y. D
count_copy = buf.packet_cout;# x+ N1 d. E$ \) r2 @! w
}$ }6 Y4 K5 b& I* [* C$ |
else
- u5 i& Y7 m2 e" F {0 P# u+ p) X7 R
printf("No effective message!");
4 D& J: V7 O+ F9 A7 Z- X6 ~ }- D! I2 B) L7 Y5 p
}
4 y# k$ F* ]( g: K1 v7 Q1 z4 i$ ^) e" n/ r: X
! }5 \3 O" b1 m! b T! K/ \* E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 R( g0 ^( V1 D% N& x6 G! T [& B
使用下面代码,对内存使用了mmap函数后:* P+ C J: F" u7 J9 m9 ~+ R5 {
#include <stdio.h>
1 B/ }" h- C6 S [8 j#include <unistd.h>! G& L" n Q4 W) V6 B1 z7 U
#include <sys/mman.h>5 W# ?5 ^8 t1 {) s" ]8 W; B
#include <sys/types.h>1 j3 o+ E2 `3 m Q$ }* N: C& i
#include <fcntl.h>
- C* D2 F! a( A: N; I4 v$ j, F# k/ X* }" I9 g* n
#define SHAER_RAM_BASE_ADDR (0x80000000)6 g0 O1 \% @/ Q) I
#define SHAER_RAM_SIZE (0x20000) 0 [( J( u" F% J& Y, l5 |: Q" i
& v7 f8 R% R7 V7 M8 r/ d Ttypedef struct
' A4 ^5 j" n; C' Y' [8 J; {{. m& c% d' p" [+ q
unsigned int a; u) O8 Q5 Y$ l; A" ]3 v
unsigned int b;
. d9 \# S( ^, s unsigned int packet_cout;
' d$ S8 z h. A. W6 R# s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, r! R) X# S: M2 ?7 F4 @
( Z2 z& w O4 a* \void read_MSG_buffer(int *baseaddr);' L t$ G0 [. V8 }
unsigned int count_copy = 0;/ d: u$ l% x+ h! M* w' z2 L
/ A+ z; D9 X# z# h# iint main()
# c7 g- c' p5 n/ y+ A' ?{
* F; h! |) G/ C/ r/ |9 E, o int fd;- g; f' ^4 @& R3 M" ]
int *mem = NULL;) `; F( L6 G8 f, {6 C9 c8 E
; p% m3 o5 y" y N7 q; m, x) x; b if((fd = open("/dev/mem", O_RDWR)) <0)% L$ r7 o8 [5 }9 z
{9 b4 E( f$ a, u3 r
perror("open error");
0 s* U* F8 x# V0 w: M) t return -1;
4 m& j! _: Q4 v+ H7 Z2 E; x }; I3 o' A2 ~/ T' c
/ V( S# g7 H* g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 \, G6 A! h+ j& Y t2 \$ c h3 r2 V0 f7 t+ x3 [
while(1)5 l8 G9 Z( I @9 w" _4 q
{
5 p+ \9 m( y+ |' {: O) H read_MSG_buffer(mem);
1 j1 a$ V# T7 u }
7 r" \& \8 M9 n! t! j}
9 |! X7 P; c+ l' s7 V. V9 O) k# r0 ]( {8 T3 P: y1 y% V) v
void read_MSG_buffer(int *baseaddr)
; Z- Z/ v2 p3 b, `3 g8 y{
* W4 I: ]/ C* {6 ^* d+ f pRX_MSG_PROTOCOL pshreRAM = NULL;# n, S: y; n& d* h; F% P3 G2 P
" c$ R* k- Z; [2 G: {+ @- ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 ^$ [, @0 s9 Z% A( l j$ @
7 T7 i+ D& E. o' V1 D: k, T7 E if(pshreRAM->packet_cout != count_copy)& J Y2 i$ j2 r# b2 [, S2 p
{: y9 ?) b3 O8 ]# \$ H
printf("a is %d\n", pshreRAM->a);
( ^4 e* W/ H+ A% U; ` printf("b is %d\n", pshreRAM->b);# O4 `* g/ |0 G8 O" _& {! I
printf("count is %d\n", pshreRAM->packet_cout);
0 C- x" T7 q9 E& L count_copy = pshreRAM->packet_cout;
5 T$ h! ?8 D; i }
- g8 D# {* }5 L; b! n; F else
$ d: ?, M" K' e7 I {
7 a* r8 J) w- X9 R printf("No effective message!\n");
* X( B; F, c W: L- `6 i: U6 R ^ }
) c. D; C* i# ]: [: _# C8 H}3 z% \& k" |8 Y# r' k$ A6 f- P7 D
5 M4 R& C8 C* h5 p5 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% E/ r" R" u# x
! d2 [8 x9 [3 Q/ ~" j& x0 H& W. l. U* j# i+ s/ e
. I1 A" u. ?+ z
# |9 D9 a2 F$ j |
|