|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ^$ F* `0 |7 R- |# Q
( c# K$ m, C: \/ v2 m6 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; C+ g# w7 ~0 T" Z) Z8 A
#include <unistd.h>, J1 {# C- ?2 x2 n
#include <sys/mman.h> t. X' O& W' L% E3 Y/ a- L/ a
#include <sys/types.h>
7 K+ G& _: |- u% p4 `#include <fcntl.h>
' c4 T8 E" f7 ?5 \/ `+ n- N% E7 v" T) f! H) F) K
#define SHAER_RAM_BASE_ADDR (0x80000000)
& X% f/ Y" D9 b% u0 K% O7 T& }
! E: g4 F* ^ G) rtypedef struct1 K, W! t* a: w4 O0 Y6 m
{: v; W7 \$ X3 Y+ e& l" v
unsigned int a;
1 D- E- Q) }* h2 z* ^ unsigned int b;
% z, K+ t# ?* J0 a$ P unsigned int packet_cout;+ Z! u3 n' s: p6 t* O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& a7 R8 {0 w' @$ \' E# K
1 w: i2 h0 n, x0 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 T! p/ P' ]4 `3 _
unsigned int count_copy = 0;
; @8 w2 w. G! Z. m S# A o
- _/ B' G, `+ x. K/ s( x9 V
, c. S4 i1 S `5 S8 S2 Lint main()8 I, X2 ]' x5 f+ c% ~8 \. U
{
! l% v9 X: R* a, z. ^ pRX_MSG_PROTOCOL pshreRAM = NULL;
7 }& I; P" ?* q6 ^7 d$ L pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: C: {; k0 j" n- A- n5 K! I1 l5 P" w* N% S) i# F
while(1)
% W! [* Y+ a/ Q {3 ?$ d( t0 q4 C0 g$ y2 ~+ R
read_MSG_buffer(pshreRAM);$ ?7 N O/ e/ Q0 ?8 X
} . d0 e) N. j$ _
}! x0 k; D& K8 ]& M+ S) j6 X0 E4 I
[7 N0 K7 }2 ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 `6 n/ |4 n% b, m% T9 E( m# M{3 }8 b: K+ |8 e' f j; ^. a
RX_MSG_PROTOCOL buf;2 d: R* u% g4 _/ O! m9 N
) m0 w+ Z0 Y! y2 S2 x buf.a = pshreRAM->a;
- n8 z B, C1 U0 K- Y buf.b = pshreRAM->b;( B7 w" t6 ], v! ?2 a
buf.packet_cout = pshreRAM->packet_cout;" B8 I4 m$ l1 y0 `; A5 Q2 z) D
+ [* F0 E3 m- s if(buf.packet_cout != count_copy)
, [/ L& G; y+ ^* e' g {
5 b: V5 v- P: \2 D7 x printf("a is %d\n", buf.a);0 X( e* j2 r8 I2 p3 Q
printf("b is %d\n", buf.b);: @' B& [7 {/ p' c$ ^
printf("count is %d\n", buf.packet_cout);. W) ~5 ~* S8 C9 ?9 d+ A, }# q
count_copy = buf.packet_cout;$ b A& Q, }) _
}
- M% H: s6 l4 W% \$ u else! ~/ R& r$ d0 f3 T+ p
{ q/ k! D: g: z q; ?
printf("No effective message!");
# ?. P2 ]# {; f9 O }
]6 b' |5 x/ l0 `0 s}8 ~$ b9 ~/ W: x4 i1 G
% r/ C( l* |5 W6 @9 O! y' g+ |
2 T' B/ F* O9 K; o" }; P& P- ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ J4 \3 u) x. ~1 A5 M2 r/ w+ o7 y使用下面代码,对内存使用了mmap函数后:
. d8 ~+ s9 T1 h9 {* i: \4 |# s#include <stdio.h>
( W2 T M, l- ^: N* v#include <unistd.h>
( T; v' b+ x! Q- y3 v! B#include <sys/mman.h>
* V* v7 L! b! w+ O6 c#include <sys/types.h>
B e1 O, |3 S& t- L#include <fcntl.h>
* v, [) ?5 T0 m0 {1 Q
0 p+ z/ Z# B' X6 Q2 H#define SHAER_RAM_BASE_ADDR (0x80000000)% N% b+ H% F. x: ~5 \8 B" e
#define SHAER_RAM_SIZE (0x20000) ! [4 \) d) o! l1 W* S5 R
8 S' G; O" n ?3 ^% c1 Q) H
typedef struct" ~, V4 ]$ h' d3 d: Z
{
2 E4 ^! l+ @% O0 J, h8 y# ]; \ unsigned int a;4 Z7 }! _7 {/ R3 @
unsigned int b;# l6 Q/ S8 s, t. U* C: K3 C
unsigned int packet_cout;3 [% F$ V3 S7 f: ~' c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 v5 h7 T2 M, J ~/ h( j
0 m5 r3 O' N7 I4 g
void read_MSG_buffer(int *baseaddr);
1 m# c! a* @! r" ^5 munsigned int count_copy = 0;: {$ [- g! ~# S- B. Y
( q- C) C: {: i% m% i0 U
int main()" R4 [7 V3 L! H: ~/ h( ]# \
{
9 K r$ [% M' N$ k int fd;! _( o$ `: X' O; t* _3 f
int *mem = NULL;2 Z: ?! b! f6 w/ |
9 H: |5 d$ F5 Y" h5 j
if((fd = open("/dev/mem", O_RDWR)) <0)' \! t+ q$ d' }5 _
{
8 n$ _, h Z4 _& l1 O perror("open error");
( M: \6 m6 t5 b$ x* a B2 i! L, m return -1;1 E) n: `) @, ~2 D4 @7 j! i5 W
}! ~) Y- K. ]$ B6 s: Z9 ?, V6 ^# f
: N( U. I! x6 }' V9 Q5 W/ \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 {* s A1 O% h6 l6 @' W# h; W9 O1 e5 N/ G2 Z- w/ k2 G4 {: [7 @! F. S! d
while(1)
. x# V8 F6 f1 L9 Q0 Y# p {
, V0 i, {" M( b* l1 Y read_MSG_buffer(mem);
3 a% Z- M+ `# p K }
/ k, o3 X, e; i" ?8 I9 \}% Q% N% z( s) c, u
. q3 V( x6 r( u( n! z( [2 m
void read_MSG_buffer(int *baseaddr)
) W T5 F8 c' c! d9 J# m- U{: x, x+ z2 `, S( e
pRX_MSG_PROTOCOL pshreRAM = NULL;% R' Z" m; [! P- ~' w7 `9 o- D5 \2 A5 a
8 T4 l/ J3 V/ y0 @3 n+ _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& K G1 p' V! Z% Q
+ y7 r6 e5 G% g2 g if(pshreRAM->packet_cout != count_copy)6 {" j- i b1 {
{
# z! U7 I% O3 V1 H printf("a is %d\n", pshreRAM->a);4 H: p6 C3 T& _( [
printf("b is %d\n", pshreRAM->b);
3 m- O9 N, K$ Z printf("count is %d\n", pshreRAM->packet_cout);
4 y+ w2 \& E! u' Y count_copy = pshreRAM->packet_cout;# p0 |2 @5 B4 y" ]
}- Q" \+ l. g6 f1 Q
else
* L, V; p. q7 `5 Z6 H$ K0 N {+ l; L1 o3 H; ~( Z
printf("No effective message!\n");7 J$ N! L+ b* W
}! N9 O1 d# e* n! V0 X( `0 h
}3 Q: Y2 n: B( [- X3 z! N
; B/ T j2 \5 v" h( r; W9 e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* G& _8 n0 p* q, T. S' J ^, p& k
+ D" B5 R" p9 z" N u. q! T8 L u8 y# r
/ C4 t; m" G4 r7 _2 P/ v9 J
* [. [3 S, r/ I0 t$ U+ v6 x8 L |
|