|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 r3 A- s ~. R1 n) X" f x4 K
v% Q$ V* \4 n6 O& { w7 s8 J4 A" c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 Y9 [# ^2 { N+ s' X6 {, {
#include <unistd.h>$ V B/ E! V: q, e( @. Q- B
#include <sys/mman.h>
# d; y( b, l& ?5 n+ F/ M( z#include <sys/types.h>
5 q5 j4 O7 `1 T ^7 Z/ h#include <fcntl.h>- P' L( F2 H5 S2 v! t
7 L2 @$ {! D+ r" h, ]#define SHAER_RAM_BASE_ADDR (0x80000000) ( q. K1 R: D6 ]+ f
$ N5 h0 X2 P7 {" y7 A; x
typedef struct
! r' Z- }% o- C ^4 u& P{9 u. R3 l( L/ `: Y$ x
unsigned int a;* M. [ Y9 D I, K& j" J/ V- `0 I- ]
unsigned int b;
5 U: I: h# m& _ unsigned int packet_cout;9 | J9 L" { m2 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 ]8 P2 Q# g" g* n! Q1 f
9 l5 T6 S+ S4 N: I6 a1 Y; |* C) [' ` f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; v5 P, F( z% V+ P& K. ]% v; ?
unsigned int count_copy = 0;
3 Y: i" @: g: D1 p9 M* C, Q H7 I( M
) }' m7 i5 l& A v" {6 @& F$ X
int main()& j8 I4 D" R$ |/ o' J5 X9 K1 R
{0 b6 P, i9 l4 g
pRX_MSG_PROTOCOL pshreRAM = NULL;
" d4 _* p) g/ O/ q( o- J pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 H9 G( O+ [9 d) t z4 W1 Y
7 H. D' `$ g$ U! T" X' Z while(1)6 J4 T3 o8 n7 t& p2 S& c' i9 l
{
9 H+ ]& D5 i m6 m# l$ q- g read_MSG_buffer(pshreRAM);
$ l+ z: Q1 F! G# m0 J4 Q }
' A9 m2 W6 X! i; |1 l}
. O4 m/ e/ _; R' u4 y) P- Y7 s4 z7 {# I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% f; g4 m! k8 X+ z) P0 K
{
. ~5 s% p6 l+ k2 ~6 w RX_MSG_PROTOCOL buf;
8 X- T1 t" L5 H4 N o K$ R) s( Z
" J9 O& k2 s6 o0 ?" W* ~+ o6 w% f buf.a = pshreRAM->a;' O& k( k, s/ N/ L3 e
buf.b = pshreRAM->b;$ T, j+ t( P X
buf.packet_cout = pshreRAM->packet_cout;
; r0 Y8 f. ~$ g7 i4 \
. P5 A6 [8 _0 P! w# j if(buf.packet_cout != count_copy)
/ J, F p; ~* _* r8 B {: s1 J4 u9 x4 X9 Q% z4 S
printf("a is %d\n", buf.a);
8 B4 u& f3 A7 O' G printf("b is %d\n", buf.b);- l% P/ r9 u. ?, n3 W* h' |
printf("count is %d\n", buf.packet_cout); Q" M, R9 g' m+ U8 o
count_copy = buf.packet_cout;
) R% V1 d8 J- M4 k2 l& R; w& d }
9 M! X0 [8 h% u3 D else
+ B' v+ L$ v G& M {! J* S* u( d) l Y
printf("No effective message!");
$ C5 I5 H5 v/ t% U }* y: Z& h0 G$ c: x* h; g
}
Q5 x+ Y+ f: d8 ^7 {" |! f+ S# D: F9 h' S0 B
8 |# S+ l, U3 Z' u% ]2 p/ c# B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 q! y% e h- S. j2 b; ~0 A. j使用下面代码,对内存使用了mmap函数后:
) b; w8 c# W4 M4 ^* F#include <stdio.h>4 @" G0 e2 h1 M; G, s$ r- N
#include <unistd.h>
, p- A3 [) z- T6 U#include <sys/mman.h>, v2 |3 k3 _" T& }3 @) @3 P1 m
#include <sys/types.h>
: i, _" }' [7 b#include <fcntl.h>
7 \2 i& |& z5 }9 F* [- p ~$ k4 k; [6 B5 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 c& P4 k# H- F9 r5 O) P#define SHAER_RAM_SIZE (0x20000) # Z: P$ [# A6 e) U( U( ]8 ]
$ A9 c* W( E5 I) i! f2 f$ B$ v
typedef struct3 ?8 l7 b0 |5 Q% l
{' Z2 A9 ]' p7 J9 x, N' j0 v, z2 _
unsigned int a;$ z, a6 m# x r4 g3 S ?
unsigned int b;1 @& r5 H; w7 N$ U2 E. [3 J
unsigned int packet_cout;9 Z8 J$ D! N8 ^6 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, x& V8 R& e' R& C) |4 |
4 ~( F6 H+ S. l$ @ \# Evoid read_MSG_buffer(int *baseaddr);
7 i' ?8 _/ \0 D( @% i( d" Vunsigned int count_copy = 0;
% p; J( O; H) z9 x) O- n
2 \( o3 C* Q- [ S, Dint main()
( a# f/ E7 L! Y. A: i$ z{
* ?' W1 w& {1 @/ B$ D- N$ y* R2 A+ `& { int fd;
$ N5 o- \0 e! V+ s' F int *mem = NULL;1 p, i2 o0 \* c R9 x
( h }7 `) B$ z: s; D& Z4 x if((fd = open("/dev/mem", O_RDWR)) <0): {9 R4 w8 v/ p" w7 X
{/ F8 t5 Q$ ^; ^" [0 U& R* n
perror("open error");1 X4 s/ K2 C, D) x
return -1;
; n3 J0 p! C- O9 [7 z& t1 h+ R }
3 q) A# K( m! F5 C% ]$ N( O 9 t. n: n9 `- ]5 u* G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 P6 F) O6 d9 J& Q
& j" }! b- |. V% I while(1)
* I+ S3 ~! Y8 B' u' B9 g {
# r; Y8 m0 j: E* f$ q; n read_MSG_buffer(mem);; l! f+ N0 M1 p/ M7 E! V
} 4 d$ w% l& Q5 y
}( m+ W! w; V" u2 X4 b' [; y
9 N% M& `. e" H: O/ vvoid read_MSG_buffer(int *baseaddr)+ _7 p/ T- t7 y1 _ z- ~
{
# V" I- y& g ^1 W! y9 @( D pRX_MSG_PROTOCOL pshreRAM = NULL; O: D8 S! S6 c5 W* U4 O3 \- V/ n
0 j, T5 X7 O3 d- V# `, d) i3 l pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. |7 A( |4 n: l0 O9 N9 k3 v5 S, c q" X4 `" B/ A y' X# h) g
if(pshreRAM->packet_cout != count_copy)3 B! g; M h' |
{2 E4 U. y4 I+ J% k9 o
printf("a is %d\n", pshreRAM->a);
2 R4 Z5 {" U& a% z printf("b is %d\n", pshreRAM->b);
! R; h. |3 J5 v printf("count is %d\n", pshreRAM->packet_cout);
3 {/ `# L1 J- k: p% @: E6 e, c! U count_copy = pshreRAM->packet_cout;3 |0 V- I6 _7 K! u- u7 H: v2 @
}
# X+ `9 ^2 i* E8 ? else
! C( i/ b9 T9 w9 C1 @* ~/ u {
0 @1 f* D* e9 l+ I* }, o* L) J5 a printf("No effective message!\n");
$ o9 s5 j9 T4 k2 n9 {- _' v }
* R6 g' i' c+ s- g' L5 R}
$ f1 r) y: t9 [3 z0 W5 {$ h3 N6 @/ J7 e$ u1 Z, W) G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& Z6 _ ]/ p8 q% J' }/ q1 P& E! V0 \' S" Y) F) f) @8 Z3 y
% s$ S1 b8 M# R- G
8 X7 J, D( c9 B
+ f7 t# ]' X/ ~2 e! W |
|