|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 h* I0 e( |$ `4 O
# J+ E: n3 M mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 n; Z' @9 g' t! W/ |" [2 d' \
#include <unistd.h>
3 q1 V- g9 `/ Q" Q; X1 z#include <sys/mman.h>
& P+ s) z& u& {% `& |8 |#include <sys/types.h>7 v- T. ?; o8 @( {& H
#include <fcntl.h># i6 M; Z9 f; C# U( Q$ W
4 Y, u$ x+ {) \3 @
#define SHAER_RAM_BASE_ADDR (0x80000000) X" K- k9 ^ A: Z) N- u
3 P8 N. z9 \- [4 z. stypedef struct* e; p5 P( h5 j) k
{
) U) K- Q6 [; \9 _) r) a4 ? unsigned int a;- t8 {3 {7 e3 j# w I" }
unsigned int b;
9 g0 a r+ s0 e unsigned int packet_cout;
$ M9 a, j7 e3 U5 o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, r/ o, x4 \1 w4 ~+ u( A- k# r6 P5 [& }$ ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 E; E. v2 p/ I4 u+ `# {' f$ }0 O0 o' M
unsigned int count_copy = 0;
9 W" s H* W4 l# |6 [! [ r7 \/ F0 R! |+ Z6 B# U
3 V8 K# \; t4 x5 k6 _
int main()" O, u7 o' M+ o, k
{
7 ^' A1 H, r/ A2 @ pRX_MSG_PROTOCOL pshreRAM = NULL;
7 O+ P- N; e8 ?) \! N: h% F- K pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; p. f8 m" ^, X- z$ S( ]8 E' T
, C+ D; H0 W2 k while(1)
+ t3 W& p; r& E7 o# V' A {7 `: j4 u7 }. ~) u+ D* }
read_MSG_buffer(pshreRAM);
$ \- O; d# B8 H }
6 {/ \3 r% w6 u, E" l}. h$ {1 Z+ ]6 g% q
- l. N& I9 U9 k9 a) s: U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- D9 ]: U4 J, r" C9 W
{
- X, R2 N% q# g! L8 K6 _/ i RX_MSG_PROTOCOL buf;
) G9 o L+ |5 o; h4 N
0 H3 l6 t9 Y) A1 f( P buf.a = pshreRAM->a;* _! r" i* e7 \3 i
buf.b = pshreRAM->b;
4 }# k% k. N& c# _+ _8 l buf.packet_cout = pshreRAM->packet_cout;" D7 o% I! S7 p: `
& v5 j2 S- u' i/ F if(buf.packet_cout != count_copy)
* _" N# S- {+ r: G7 l5 V C* L4 x {8 J! H* }% c h: v E6 G+ m/ K
printf("a is %d\n", buf.a);
8 l7 V- r4 u& T3 q; R printf("b is %d\n", buf.b);
2 a# X% t0 H/ O5 W$ T/ X printf("count is %d\n", buf.packet_cout);) r9 D' G. S4 ?
count_copy = buf.packet_cout;
' ]; R) p: D2 Y5 z2 Z% e' f }
4 }; K3 N. W. q( S' j else
% |# j" R% f% s" p& m4 R {
) h! Z, K! I5 E, n: e/ G4 W; e9 h printf("No effective message!");
. Q7 f4 o% N+ h3 i6 r }
( B' ~3 l* B9 q2 i- V1 B) n}
/ B/ m. ]6 h7 _0 Q! Y( @3 s" y# d7 q7 `/ W4 i' B2 x
. O3 K9 z" h1 J: `/ b# `3 X* C. u3 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ A. E) b+ ^4 g
使用下面代码,对内存使用了mmap函数后:
& K- f" b1 u8 u g% k#include <stdio.h>
/ @ ~: {5 N! ^6 }8 g) x- H#include <unistd.h>
- r8 s1 y O/ `7 Z* D#include <sys/mman.h>! w7 ~- F5 M4 b) l1 k
#include <sys/types.h>
7 t6 r2 X) O p/ _: d& z7 E7 R( j" W#include <fcntl.h>
/ c+ {! l) Z6 n# I4 A
" Z3 s9 g& _/ q3 B) B#define SHAER_RAM_BASE_ADDR (0x80000000)
2 f' u7 K: y$ q& `#define SHAER_RAM_SIZE (0x20000)
, I9 H$ j: z" Q3 ]7 ~
; M7 T8 ?+ Q& P# Btypedef struct* w' Y" v$ P) N* n; b0 T
{4 I3 o' t, N* i1 Y+ v% ~
unsigned int a;/ Z/ d- g% Y2 |# z6 ^# F; T: l
unsigned int b;
8 |- K: O7 U) b' P' ^ unsigned int packet_cout;* }6 n2 b0 U! M* X1 F( D4 d# b& n+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ?& T2 s) o! a% |! S# ?
. d1 J5 [- ^% ovoid read_MSG_buffer(int *baseaddr);$ f* ~0 @ P% ]* Y* h: i7 S
unsigned int count_copy = 0;
6 p- [# h$ }* Y' A1 [% Y; b' Y' _6 l$ V
0 E2 M6 z; Q' c5 S+ [int main()+ K8 z! m _8 J! O h) x
{
$ \% M9 Z$ J3 D! w% b+ O7 ^# v int fd;
5 W* v- i N( ?0 p+ V$ ] int *mem = NULL;: x+ L4 F3 C0 Z$ S' N
0 R0 {7 j, I! G' k- H" I: x" \ if((fd = open("/dev/mem", O_RDWR)) <0)7 Q, s$ l8 @1 R+ i" s) I- a4 t
{5 K9 }& y% Q' V( o% O
perror("open error");
o4 h# v( u% M, q- E1 j7 y return -1;1 f# A V7 |( D: ?+ l
}
' _- D. t8 W& q. M- a8 d$ V
. v" l+ ^4 e) [. T( k* n mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 \/ ]3 }7 z% w: G2 W5 N2 U7 r
* |: R* h' y$ I7 s5 a while(1)
) y( j, b5 ?; T {. j# x- ]3 j% t, T. L. q4 \
read_MSG_buffer(mem);
6 Z6 a x9 S5 Y: N# C C2 y }
* D9 Z; X+ Z2 t- ]* H# i! ?}9 q6 D, Y& O: P3 S, `1 ~
) f% Q S9 M( O; u9 ^9 ^
void read_MSG_buffer(int *baseaddr)
- f) B2 [' S- p3 T{" f8 J! |1 X- B
pRX_MSG_PROTOCOL pshreRAM = NULL;9 N8 q* X7 {3 R+ ^7 N
! W* m, y' P1 n- w y) ^- S/ q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 ?) [4 X) u: c2 R( ^
2 Z. i6 [/ b3 j' A, d5 \ if(pshreRAM->packet_cout != count_copy)1 [: {2 R" o3 k; L
{; ~/ M% k7 ~; G4 t
printf("a is %d\n", pshreRAM->a);
7 K5 Y# Z3 ^* f1 A printf("b is %d\n", pshreRAM->b);% F5 F/ [/ C! O( b
printf("count is %d\n", pshreRAM->packet_cout);
& I5 X0 [' {3 Z# W8 ?& F$ u& w, U. Y count_copy = pshreRAM->packet_cout;
e4 }9 C& e: p$ N4 f4 N: d5 C }
: I! T& A" R# `! t# Q else
* W8 Z6 M9 c+ t, P {
, p: q v% m: `' e4 Z printf("No effective message!\n");# p% ^3 L$ Y+ l$ T3 F
}
6 g' u; u$ z7 m- C6 J/ m}+ i0 j, m* U/ S1 i
4 e. J; X( C4 p/ N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& R) V9 U, Q5 M- h3 n# K) @
7 H* w$ {7 H n. B: x* v3 m! S1 n$ U; B$ F) V
H5 L& c2 i) Y9 i; V% i1 X6 Z; a7 r/ b0 h( |# B9 @* M
|
|