|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 T5 K( D; W( [5 Q, P: N+ J7 Y- L4 R; Y$ o7 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. \! x. h; S: I/ z#include <unistd.h>4 S, P9 ^4 K, \! |
#include <sys/mman.h>* h1 [+ B6 r- H' a
#include <sys/types.h>
7 N* L% @) l9 F+ C2 Z#include <fcntl.h>' B4 n+ y7 R5 R
( x2 m. u1 ~) s: m3 \' Y( n' L2 i# ?7 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 {. b! y" R) ~' \% H- k
# s; h: `; w9 Y% b9 O1 u3 Rtypedef struct
9 E0 g( L3 X' r4 D{
$ \ T& P0 i5 x4 [ unsigned int a;; _ ]! g {; ]: s. x7 x6 {
unsigned int b;
8 r6 A/ l8 H- S unsigned int packet_cout;
7 p! V k! M2 I+ g8 s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 g. d& E$ }' o# Q7 J
% {& D8 o: G5 H% b, svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# e( @8 x$ N3 H0 Q9 [% Z$ o# Bunsigned int count_copy = 0;
9 q0 x2 n8 l; O! I- [5 Q
( i: ~( Z7 J( c- s& f2 E
8 C4 {3 K: S9 sint main()# U4 h2 }/ _& `- E2 \1 \
{1 w/ a- q* Z" C( X
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ [! Q/ t: N0 i pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" c/ f" q) C; i& ~8 o/ S) o2 F5 b8 U1 C+ x6 M* M
while(1)1 O5 h' s1 R! l3 C
{0 _7 D: v- ^, U# ]2 y! q; E- _/ d
read_MSG_buffer(pshreRAM);* N$ {: z+ y8 n; {' s7 L, a0 f
} 2 V5 K+ f: B1 ?: K- D
}
4 H* S C) _2 Q4 @: j
, t% n. |7 J! C. Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* @6 x: A( f4 z! N( B& g
{
- o+ Q) x( b. } RX_MSG_PROTOCOL buf;* }2 v: ]7 z9 S5 t- }) h
- r' r% {1 A, G3 h" N/ t. @ buf.a = pshreRAM->a;) p- a! E6 ?+ B7 O/ Z+ t* V
buf.b = pshreRAM->b;
. [, R3 s, o6 D0 m) M3 M0 e/ S1 T1 ~ buf.packet_cout = pshreRAM->packet_cout;" V4 A1 G. S- B g4 e4 f# i5 ~
O/ C& S5 P) D7 x% R; E+ u) A- O% |
if(buf.packet_cout != count_copy)
( ]# I, y% q- n( v6 N8 U+ r' Y {5 F, T# |. r* k8 _
printf("a is %d\n", buf.a);
& s+ E' s! b/ I2 Y2 H printf("b is %d\n", buf.b);
! R0 i0 E2 D. s9 _ printf("count is %d\n", buf.packet_cout);3 j% y: S2 c8 X3 \* S
count_copy = buf.packet_cout; C( {1 U0 ]; T0 e+ Y
}
K( Y# {2 x9 D+ _( Q" p) L6 g5 D else7 L# C6 c4 `& r; T) p
{ b. \0 A: N% n2 W2 T8 H6 T# ^! ~8 ?
printf("No effective message!");
U' Q. G5 L' O' I: L }3 J9 Y" s& {- J4 T0 A& @
}
( m" r U3 W# T! o5 r) n6 D* l/ L @* l0 M, I$ g4 W
E, F( A1 A4 H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ P- F0 l: y4 o/ p1 F/ q( Y( x使用下面代码,对内存使用了mmap函数后: c3 O6 |% \/ h# z
#include <stdio.h># X7 U l; i, V0 x
#include <unistd.h>9 X( ^# j5 G7 v9 Z$ q- {
#include <sys/mman.h>" H( c' |7 Q- @, m; e8 X1 f4 J5 N
#include <sys/types.h>
p' M$ S, L+ X( F#include <fcntl.h>
& _$ d5 X7 f" Q% R. g2 Y1 ^' S! H' c5 G/ c* s
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ v4 k4 U4 T4 g, x+ ]) c* k6 `#define SHAER_RAM_SIZE (0x20000) 3 N8 S) p+ x) o+ T3 f
) v5 v. F4 s5 vtypedef struct
6 o5 Z I5 m) z{3 K: j% h' J0 ^6 [9 H
unsigned int a;6 d( c% m' B6 k( q( s& ?6 f
unsigned int b;1 S. `& I6 t% C {( K+ a, D2 u+ U9 {
unsigned int packet_cout;
0 S' T' y& h) t4 D4 S1 ] ^/ Z' j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ A4 s. q3 c- X2 K# ?8 }3 m
1 J& ^9 m$ f8 N; b- [
void read_MSG_buffer(int *baseaddr);) _( n8 k5 L& C& g1 g$ o% z+ |
unsigned int count_copy = 0;
) F# ?0 u X- D2 N2 z/ X! |
3 B$ _7 Y+ ]3 T bint main(); B( w" o/ d# g9 d7 H9 l4 l
{% o+ l- Z. n4 ^0 a
int fd;- V7 X$ p+ I# Z1 w- t& H8 `& w- z
int *mem = NULL;
2 B& J: L6 X: B. x K. g" E. n! K0 i" n3 C+ T
if((fd = open("/dev/mem", O_RDWR)) <0)
4 [. j# L$ P3 N+ D( k { U) m* C$ s0 ]& A0 [
perror("open error");5 \# `# m2 ]! D5 b! H/ j$ [
return -1;
" s) E. w4 _5 R Y, y( h0 L }
9 i7 K) R- w1 Q% P " M2 O0 P( |3 U! X) B, K- ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( d. e# g/ X& \5 D5 {/ p5 T: J
while(1)
4 n$ p8 \$ ?# T% I5 O9 i& ] {
) Q- ^2 p, i4 j8 ~* i) | read_MSG_buffer(mem);
' A8 @- i5 J- P4 c }
$ Q6 R$ z5 Y- w4 T' {( R}) G; B6 w2 I4 v( _
% j1 W$ B/ |( kvoid read_MSG_buffer(int *baseaddr)
- c1 V F$ d( z( M# o- o{
8 y& b; V! `& X8 N; R, {+ d pRX_MSG_PROTOCOL pshreRAM = NULL;) A; y2 ^ V0 _/ l8 g4 C
& C+ X" G5 L5 c3 s8 \3 h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* h5 l, V7 }" `2 q3 u& {& ^6 \% c7 T
& a8 z Q! A9 A, n! x- L8 d if(pshreRAM->packet_cout != count_copy)
f9 _4 N1 L* g& j5 s! ` {$ X3 K$ g: \( y7 J
printf("a is %d\n", pshreRAM->a);; ]4 p+ ^! r$ A6 |3 r. v
printf("b is %d\n", pshreRAM->b);6 V( N6 O! w8 z) `: G9 Z
printf("count is %d\n", pshreRAM->packet_cout);; c) X' V+ Z3 `6 y: s( u
count_copy = pshreRAM->packet_cout;
" V. o- r; \6 D8 b1 G }* P2 V, }' G+ ^# X3 Y" f" Z
else
7 E% S5 R6 P4 ~* a8 G7 v { n) |. C8 V, ^
printf("No effective message!\n"); o/ w" E. U# B
}
! q- |( J+ W* M0 m! _) G}
/ x& U! Y5 N! i. B* j1 C* L ^- X. p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' N. X: j m% O% X0 V
1 T! C- Z# u$ t) T3 t: V/ r
& I) ]% H8 i/ t1 ^9 I% n5 e6 Z% j5 H8 s( @2 z9 g8 e
- n- I, B( u3 G+ J s) q! s* r4 J' L |
|