|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 p' G7 e) O; k$ O
, V6 }# y" n: E" C& G+ l8 |$ S' kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 v/ w0 V( |& T+ X+ ?" g! `% H; t
#include <unistd.h>( B; v( s' @5 `* N! w* n
#include <sys/mman.h>) P8 R1 _7 y, j; X9 n/ P
#include <sys/types.h>6 l0 h9 M9 f( |4 z; L0 |
#include <fcntl.h>
& a* }9 _$ j1 f3 k; O: D
/ W) l( I4 S" l#define SHAER_RAM_BASE_ADDR (0x80000000)
1 ]" T" C. ~3 k4 k9 m" J) _6 t$ G- [5 z5 A9 \; M
typedef struct w& E! G/ P! B2 q, t3 B1 V
{, E1 M+ w! l$ t) d8 R" z, ~1 M% N
unsigned int a;8 t9 K3 z& v: L
unsigned int b;
# q7 l# y- |! ?3 c8 E unsigned int packet_cout;% }, C: k% m( W% @; W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# M5 v1 M/ g1 t: B; h8 y8 M& O+ r3 k6 _" Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 @3 \# l: r2 h& j% D( m
unsigned int count_copy = 0;
4 a1 W$ @1 K8 f" R2 ~
0 R$ S' {0 R" ?* N1 z
4 O: B, S* P9 `+ U: h' P. Wint main()& Q m2 v; c0 w, L
{6 C# U, q6 V" x& r1 W7 S
pRX_MSG_PROTOCOL pshreRAM = NULL;9 I" T- O5 d& F5 h" |2 m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 {0 A0 x3 i" @1 T! ?2 |8 m! y
' v6 {5 X7 c1 Q, e
while(1)
* P0 }& ~0 X% P* r% ~- [ {
. W0 O- h5 A& S7 E$ [/ } read_MSG_buffer(pshreRAM);
2 X) f/ Q% |' m }
) G9 `6 @: n1 D2 t" @}
! B$ o" E% s2 j; A
! o$ N. ^; j6 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- Q$ p. L! k) l1 k& E
{9 D% t; @0 J6 x2 P; X, c9 U
RX_MSG_PROTOCOL buf;
' S) G) d& J" q* h7 F
2 L7 G; Q/ c; F: G. _9 j. G6 m buf.a = pshreRAM->a;; F0 Q( e( P' D$ j( u) _
buf.b = pshreRAM->b;
6 S8 q4 ]4 C) C% @6 d" E buf.packet_cout = pshreRAM->packet_cout;
2 N9 {/ E" P0 P4 V# v6 h: V# C + J( b- H& ?1 F/ a
if(buf.packet_cout != count_copy)
( m6 L! n# F( T5 n: D0 p {
' u' f+ a# M1 D' a printf("a is %d\n", buf.a);
2 N+ z! o- k" z; x5 \ printf("b is %d\n", buf.b);
7 G3 c6 u% p* P5 z/ C$ C printf("count is %d\n", buf.packet_cout);: [9 k( T! I5 q3 g: J' E% x, ~
count_copy = buf.packet_cout;" D7 A2 \# @; P' t2 k
}
9 q' M+ N2 Y% Z% ? else
1 C& W0 e# ]0 X1 C" X5 E5 H {
5 w9 F' T5 d/ [# W' e$ x printf("No effective message!");4 X+ q% r) z! ]& ], b$ ]- k
}
. j$ c1 h( v1 C% a1 k& K}
/ Y5 a, ^5 B5 I' q) `5 ^, q: v# n) v6 b4 Z v1 m
* Y- ?2 z* U) Z# M但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# K# ?+ X# T1 P: c
使用下面代码,对内存使用了mmap函数后:
/ |1 Y$ R+ M- \#include <stdio.h>5 I$ c6 K \! N0 ?
#include <unistd.h>
+ [& p' p" H7 E/ s#include <sys/mman.h>8 A- x: R2 b# X2 V' ]! ~. [
#include <sys/types.h>
0 s% Z. `* ~. u5 {#include <fcntl.h>. D/ e% U& P. R7 R/ z: x8 c# |( d
) |9 ^6 G# d5 S) C. A#define SHAER_RAM_BASE_ADDR (0x80000000)6 r' j( R3 u# ?4 G
#define SHAER_RAM_SIZE (0x20000) u+ o7 d- _1 f4 Z. l) B$ X
, k' n5 V' d2 B" h" v. E5 k- B
typedef struct R7 {7 x4 N9 b0 N& U0 g
{2 f5 N1 {+ F) w0 N! T
unsigned int a;0 e7 v( Z3 z U# u5 Y
unsigned int b;
8 {& G1 \/ m r5 K unsigned int packet_cout;# K$ U& a" \0 z& A( v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" @' Z1 D9 k9 \/ s+ h! ^
$ Z0 b8 N) j% \6 o
void read_MSG_buffer(int *baseaddr);
4 F% f. {3 b) ?1 O9 B- `unsigned int count_copy = 0;2 G$ W5 T8 i, l& v4 W0 Z; m3 {
( l) P+ T: h R' U9 R/ Fint main()
( K! O( S' a8 g' X) E3 ]" P0 d: ]{
# w& l n! }& O/ a9 c: S, F! i int fd;+ Q& P" M+ f2 M) _
int *mem = NULL;
7 g0 q2 R3 L" H: i( L4 D, W1 n: _1 m) V2 j8 ]. c. Z' S; G+ h) _
if((fd = open("/dev/mem", O_RDWR)) <0)
; U/ P! ?$ A/ N: |( A) u {( L* I7 W& [2 x" s( I& ~4 T8 W( Y% \
perror("open error");: W8 G5 _' R0 o# e @! {
return -1;
% I( m' k' i+ I6 ^; q, U( j7 k, j }3 i: ^- z/ P1 n& N6 x3 P, x
! [: A; D! D, G% C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# H! U5 c6 }" W1 y" p" W) t2 }( z; k# f# g
while(1)
* M+ E. {& o ]0 }; M v4 l% A {
- s' P/ k, c, T$ O. L0 r read_MSG_buffer(mem); _0 \# E% c8 r8 I
}
8 @7 o2 r5 T3 Q# \3 H% X2 ?1 A: F J}
+ y. U/ Z- {: a7 ]5 t- X; N# w! o7 j5 d! w% ?, L
void read_MSG_buffer(int *baseaddr)
% K0 @: K' v4 V; P{
7 Z" y! F1 y4 P ? pRX_MSG_PROTOCOL pshreRAM = NULL;/ c2 ` D9 u1 K6 x/ N' k: Y
* w& {9 V" [: r% x" A S4 `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 b1 S) V. a( A# d ~0 _3 A1 j
+ r+ E3 _/ I; _7 X( p+ M3 l h if(pshreRAM->packet_cout != count_copy)
$ c1 c1 a, E; F" q) j/ j% n {4 M' |, w3 u9 p7 j6 [
printf("a is %d\n", pshreRAM->a);1 D" I6 U# k6 H0 v
printf("b is %d\n", pshreRAM->b);
; M2 w/ v1 Q _3 {- ^6 H printf("count is %d\n", pshreRAM->packet_cout);
$ V* o, ]5 m/ p8 x0 P" l count_copy = pshreRAM->packet_cout;' v8 L/ T# g" y' k+ q
}' x1 ^& S4 }/ e0 ]7 B2 E9 X
else
# d; T9 A9 n/ h0 g0 M; J {. z* U% Z5 K, H8 h+ v2 U- Y
printf("No effective message!\n");$ l# q0 d! C) x! L* Q; Y- s8 G/ x
}/ f6 q, ?3 S2 d/ D1 f9 m( r
}
; }* ^, S* h. f; h/ e/ s5 k$ L) Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# t7 j, `2 Z9 X& s0 n1 Z& {% f
( L F( b3 z9 {4 f8 N- z" I! o: R! V
n# A. P3 Y3 W0 L5 X
3 z% P1 ]3 t; `# U- v; z
|
|