|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & k& M: \4 s, v }4 C( o q$ w" U
: I* O- G1 D( ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. A& D9 t+ S5 D: `- A#include <unistd.h>6 [! W( X* T/ x
#include <sys/mman.h>
% g9 n" h- ?5 G$ K6 L% S9 R#include <sys/types.h>* ?( I5 v& m" c/ L
#include <fcntl.h># h. q; _6 }$ t& k
+ H; ^1 ^5 G7 c7 U#define SHAER_RAM_BASE_ADDR (0x80000000)
% j+ b# K$ p, g+ m
- t/ b- g9 Y- ?. D& _0 Q ztypedef struct
: G7 R; e4 D5 ^2 r{
! r3 e" K$ [; I, W unsigned int a;
, k& Z/ r6 f0 V1 g" p unsigned int b;
) ]9 ], P6 M& e9 r unsigned int packet_cout;
2 ^, G) i1 w5 v) s# j; V8 g. m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 y) T" D" j0 ]3 q/ n/ V+ @, K9 I6 W" z: g+ }- @0 s/ x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 R4 v- ^) k1 A4 r
unsigned int count_copy = 0;
, H& D" \% b: R* E& p# m0 J* z8 [$ f0 v5 l4 R
; C0 A1 c7 q( R1 [
int main()
+ k0 d4 [: N% a* u{8 ~! m/ w, t% n' P2 F v% R
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ V+ E6 t& q, M$ t( j! Y, @, z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ f# p/ S9 a B5 S# ~
_7 J, @7 ~3 |5 ^" M2 T- A5 c+ J while(1)
% L/ A( r$ z. j, `) s {
' B7 E/ Z7 R2 N* ]0 J) \2 F read_MSG_buffer(pshreRAM);) V9 L$ r% E5 F" M
}
' y& I7 _9 `! O/ f2 S& X}2 ~( E; u: Z" W$ v6 f
* s M9 q1 s( c V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 c6 P0 q" y6 n3 f, d" m* D{
9 N* k0 G( q/ Z. h8 w RX_MSG_PROTOCOL buf;9 x9 w: Q+ v, L9 V. f
! h# O% q9 S+ p: i. F- r4 E( U
buf.a = pshreRAM->a;
. [" y) v- q* v" R5 z4 _! w" x buf.b = pshreRAM->b;
, e0 ^( [. u; p* K d; D2 s7 @# ] buf.packet_cout = pshreRAM->packet_cout;# p2 [ U# _9 J4 _6 R
& ]0 U/ D' `3 b, Z z if(buf.packet_cout != count_copy)
7 n' T/ ^# g D, |( D' n {
) s; g( w. j/ D2 u printf("a is %d\n", buf.a);" b, B. q7 }5 A
printf("b is %d\n", buf.b);9 r) Y, h: e/ _4 g) B
printf("count is %d\n", buf.packet_cout);
% I* o; g5 F) x8 o count_copy = buf.packet_cout;' A0 V+ J z; B2 q6 s
}
+ n# T$ s% O0 d# e else
% Z, y v$ f- \( A. I; n5 D* _ {! r1 s$ v. P/ m5 Z8 }
printf("No effective message!");& u$ y+ V$ X" x- T! V9 h( f; V5 v$ K
}
7 v$ _$ G1 y6 M9 l8 v}
, I x1 j* W# u7 G) {: j
% \& P+ K3 w; a5 ]- I
& q* `0 |! w! p1 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 n9 V& K0 m, }+ J4 b- N
使用下面代码,对内存使用了mmap函数后:8 E& B5 H/ S4 ]$ q
#include <stdio.h>% U. x- h# j' z/ O" G/ F
#include <unistd.h>
7 J5 J1 }5 P& [2 W" T#include <sys/mman.h>
9 P2 q \ W/ J6 l1 F: L#include <sys/types.h>+ T) B" V/ @6 m2 \
#include <fcntl.h>$ E( ]7 @5 r& R5 i8 ~3 ~* ~) k- W4 ?
1 Z/ z, l% n$ ^9 z+ u#define SHAER_RAM_BASE_ADDR (0x80000000)
6 M+ x4 y& D) W" K* u+ ^#define SHAER_RAM_SIZE (0x20000) # Y ^5 U; l) B4 M" @
4 e7 p0 E2 s W' D9 D$ x* N4 \4 S9 atypedef struct! j$ P& |; c2 A+ y
{4 @2 p6 D/ {! ]8 L; n- Q
unsigned int a;
m+ L& B! b5 D$ `& Y/ J' \ unsigned int b;
! s) W/ Q( s3 B% M6 E unsigned int packet_cout;: q3 f7 ~. @* K8 U/ J$ S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ?1 v% u4 Y; q$ T' e$ P
- _. L8 ]- B) y3 M$ i" U( V- [0 B% Nvoid read_MSG_buffer(int *baseaddr);
5 V6 U7 T7 o+ {5 ?. Munsigned int count_copy = 0;7 ~ t: G0 h& J' t5 m+ H
& I" f4 n5 E" T9 \, _' V% o7 O9 {( m
int main()4 `6 y2 k, O) O) d: L y2 L" G
{- ^9 H0 Q" r3 z
int fd;* J. ]' |3 l" I
int *mem = NULL;6 \8 r1 K8 U+ E ~- i- _
0 x2 T" d* D8 ~- B# S% [) L& Q if((fd = open("/dev/mem", O_RDWR)) <0)
3 _& B. ^: I1 L/ m) M1 Y+ u {
. L5 F1 u/ n; o9 v0 f( H% } perror("open error");+ W3 x% z1 y# I/ J* m! F
return -1;
: w, l% Z+ R. u' Y6 e }- F9 u, u6 P+ y* ?/ c
9 G2 ^' l ^5 w1 Q mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. P0 ^! p1 B" o m% x) t9 k+ y) N. L0 s' K! _4 [4 `
while(1)
9 q" B# z7 Q w$ I K; i/ s, z {
3 e/ t, X" l) ^% p( h read_MSG_buffer(mem);& o, K( s8 _4 Y* g! u R
}
# L9 U# r7 c9 E, h}1 T3 x. U4 F3 j
, g% h) B& Y1 L: C
void read_MSG_buffer(int *baseaddr)
2 ]' s v$ ~6 ~ L" t7 S{
, q' |) _6 k' p& z/ Z pRX_MSG_PROTOCOL pshreRAM = NULL;! C; [4 f' e+ R+ k5 a9 O
# e+ m9 I. \3 j pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 S5 V% y2 j T& B { x6 w; l. j0 r# h O/ l4 H2 X
if(pshreRAM->packet_cout != count_copy)
, p9 W0 [5 M3 J/ { {, Q' E. _$ n) {9 R( g, X
printf("a is %d\n", pshreRAM->a);+ ~+ U, Y8 O' C( X; K0 r
printf("b is %d\n", pshreRAM->b);
8 O) y( A7 F7 V$ n+ h printf("count is %d\n", pshreRAM->packet_cout);- y9 v1 W* A( H6 M5 J& Z( [
count_copy = pshreRAM->packet_cout;; ]! V1 L8 \2 `$ X. g
}% @% v) \1 L7 o; j$ f- m+ o _
else' ?6 m" p: A, W( p$ E# O- G# J3 ^
{+ m. h* b0 V# u$ f6 V
printf("No effective message!\n");
3 l1 j6 S1 P1 M0 Z/ A$ d }4 Z0 n6 N3 j, N4 i8 f
}: N* g% T Z; a
& Q' P! i' Z: V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 b: a# P; a0 ^6 d: _: L9 s' W2 `( @+ G( }) f T
& i* y4 v9 ]4 m8 N- a! s; u( D4 r0 g0 ~! ~: l% \) e
5 {4 k) z/ {4 q+ X% u
|
|