|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * }: J; k8 o' f1 B( B
, i. A8 Q" k! Y/ O% d* S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" w9 I D/ B/ r3 z8 Z' U/ o
#include <unistd.h>
8 E; t, N# |$ o8 Q: [! T#include <sys/mman.h>
) q1 G' f U* |0 m. h#include <sys/types.h>
/ X& R# n/ h' Z; J+ |6 g/ q( ]#include <fcntl.h>
; }. @3 J2 A4 B/ P) Q, V, l% k i3 J5 J) E! g; F/ U0 ?: G
#define SHAER_RAM_BASE_ADDR (0x80000000) ; R6 |! `9 D: T" p* I4 \1 z4 H5 _, D
* ^( x4 I2 r6 y( G, L
typedef struct
9 |3 k+ f0 G' I v1 V0 n{* `% A. ^) z$ }1 L8 s% l( \
unsigned int a;/ G! F& l2 n6 M7 g
unsigned int b;6 M+ ~! Y; O: F9 r
unsigned int packet_cout;. g$ e) {8 [2 V/ f; q. A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 Q9 M+ j3 [. s( P6 A% l- D. v5 g$ O
; m6 [* B! N$ X. P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, a& F" l5 }( e1 x4 Q( D: |+ l
unsigned int count_copy = 0;
7 b8 z6 w. `: i4 u) b' L$ M0 ~! Q: @, l5 W5 i
' g/ [2 g* v/ j% B# eint main()& q: Q) }/ M9 Z: z5 V
{
7 u$ W1 N* p% M, F$ o% q9 [ pRX_MSG_PROTOCOL pshreRAM = NULL;% @7 [ `( q1 _8 J% \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) }, t# y) A ]* j( A( s( H" I
9 x8 R% x9 v+ |; a" P. g( D3 J while(1)
$ w0 B- l- a% { {
" ~) D/ @2 ]/ t+ e* V; J read_MSG_buffer(pshreRAM);7 ~4 R" ~7 j* f, H
} ) S: t$ ^6 X+ C/ @& |6 S
}, e! z: M k- T) ~
# H1 P3 Y4 G1 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 C1 J( h1 x- T5 Q
{% k' N. ^' [2 v! T) v4 U
RX_MSG_PROTOCOL buf;
( Z: ~) ?* @3 g4 J) @( K0 C 8 ?6 } W; N. {1 \& _5 C8 R$ T
buf.a = pshreRAM->a;: }2 m% g$ ~2 ^3 U# z7 h
buf.b = pshreRAM->b;% h7 c+ S% w7 `9 F- H. F4 i- T
buf.packet_cout = pshreRAM->packet_cout;
8 ?7 W8 d) w/ p0 m3 F 2 U" q) a6 f5 ?( {) q
if(buf.packet_cout != count_copy)
8 ` ^0 e, i% Y {8 U6 Q( h; N; Y+ D
printf("a is %d\n", buf.a);
) N$ L( u% c9 ^0 k8 f( \: V printf("b is %d\n", buf.b);
X7 O6 n2 f' K% o printf("count is %d\n", buf.packet_cout);
3 ^ x4 q, M! H. y9 i/ i count_copy = buf.packet_cout;( z4 g3 D! f; H; Q/ O' c6 |+ H/ \
}
% G1 W, n. y: z% e else
7 O( b$ R) v: s! w, @ {
, \' h; D Y: b( x printf("No effective message!");1 D# {9 m8 R; x/ b
}2 T- l# K5 G$ b5 P/ u% T
}
5 W6 I$ o$ c/ p2 S. q& X% T" t2 C; j) T9 m# K' Y" \
% O" L" a; k: |8 P$ l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, l _9 } |4 T: v% ]4 }使用下面代码,对内存使用了mmap函数后:! O: p7 K6 b; r; y0 j
#include <stdio.h>$ u2 y. J+ W2 g+ l) o
#include <unistd.h>
3 u t) }7 |. d) g' C/ b#include <sys/mman.h>! q; ^& S$ {* X* L+ s$ u, c
#include <sys/types.h>+ V1 c5 p. e+ h) I6 a" f
#include <fcntl.h>
1 u. Q% G: I) a% J) b2 D; ]) d: p% }5 j) r
#define SHAER_RAM_BASE_ADDR (0x80000000)
: |* L5 G' G7 c1 o: X2 @1 V#define SHAER_RAM_SIZE (0x20000)
0 P' f" ^. Q% m8 T$ Y6 N, z0 |
# q: x- u! b/ l+ P8 vtypedef struct
8 ], U1 ], M0 W. {) R) r& w' R{
+ V: }8 q2 b3 w5 L- { unsigned int a;/ Y0 r F- C. Q; d0 x: \; Y: y, [
unsigned int b;3 C, U) k' i9 f; G8 z& s
unsigned int packet_cout;
% B* F. V( t* f4 f& T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 R# t# Z% B6 h+ |. ~
- N4 c" @8 N# t) E# g" w
void read_MSG_buffer(int *baseaddr);* Q: K3 c$ s2 Q
unsigned int count_copy = 0;
6 \7 ]$ @; Y, ~' Q* u+ T
6 v0 m7 _! k; A1 |/ x. xint main()
6 C+ m# [3 ~2 ~# _/ {/ a8 M{
) b) e/ i8 x, U3 B" Y* G1 O int fd;
' j' u m2 E" B8 G int *mem = NULL;
( R9 v, K% ?3 S+ ?* J
& o( W5 d* b7 i/ m) P9 A. }! k6 H, @ if((fd = open("/dev/mem", O_RDWR)) <0)6 t! W$ [# ? ?7 p
{( B+ r- H2 Q0 v2 A' \& `
perror("open error");
& M5 |: J/ |! S6 z, i return -1;
c" P" W9 s0 e/ N+ Z1 } }9 c( Z0 B7 r" Y9 B$ J/ L
V) J7 @6 Z# T! O. c mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 \1 K5 T) y2 \" U" B
0 g1 f, P, o4 S: W/ u F. D* v$ J while(1)" k; j) s. t4 G1 @
{: J' Z. `5 }7 Y3 b) C; U
read_MSG_buffer(mem);$ D( H4 d. `! u4 }
}
4 W2 i$ x& {: S, H. |2 l$ r% ^3 o}
s; Z5 \, x* W- g" ^8 v* E* ]; F: |* r1 V# z# C5 x8 p4 }
void read_MSG_buffer(int *baseaddr)% {8 V( r/ ?& c7 @$ E1 P3 N o
{$ _1 J5 Z1 T9 N0 t
pRX_MSG_PROTOCOL pshreRAM = NULL;1 [( T+ S1 _) A' W/ g
) z, l# Z6 t4 K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 g; ?4 E+ z1 o) v. w$ z8 F
: W' o" g/ d4 o) o* m) C$ A% g0 a1 |& C if(pshreRAM->packet_cout != count_copy)
c. n) J5 o( ]* G) V9 X {( W$ K" [+ V6 Q( F& Z/ }, a5 V1 }- |8 D
printf("a is %d\n", pshreRAM->a);8 j5 P+ c% L, i! t' y
printf("b is %d\n", pshreRAM->b);6 ^7 r) Y1 X( A. S H
printf("count is %d\n", pshreRAM->packet_cout);
& z* u2 s$ i4 o0 g' C count_copy = pshreRAM->packet_cout;
0 V7 O6 A/ [2 v v }
& X# ~, P' r% j' `: k! C$ D* j else8 @/ u! K# C( h* Q
{, x5 e7 i8 \1 V9 Q
printf("No effective message!\n");
5 h9 p: B3 ^4 a: r9 I9 ? }
$ y1 c- M }' s N4 s& Q}
& o. ~' J! ?1 B9 r( L% Y8 m
& f: P2 C9 l1 `7 V3 l0 A4 q3 J! E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 r7 H+ T6 u+ C$ R N; k& C
; {# ?# s, b4 F/ U. X$ }
3 S% H/ T9 g9 P1 C) e& q& \4 j
" _( `6 Q9 ~% o1 ]. ]. E% g- t) v; @* h
|
|