|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 i4 V% F/ Q& r' w6 h
) h( p4 {/ }) q1 t5 D6 dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) f; l1 E$ E1 F5 k8 {. a#include <unistd.h>
7 O0 p: h2 f* P Y1 k, o% T#include <sys/mman.h>
" y8 x/ N& l7 z#include <sys/types.h>2 Y7 R/ G8 E4 s, u: A
#include <fcntl.h>
# Q. e. Y9 {1 X3 D
# i0 \$ V" j% f/ e! F/ Y, ]#define SHAER_RAM_BASE_ADDR (0x80000000)
1 p! c+ f. v: i" _8 r: U8 I! r& E7 m$ ? y' N
typedef struct, j: A- H4 P# A, e& ~6 L( e) n
{
a; ]/ y k7 j8 V1 @8 z d7 X$ f unsigned int a;
7 n. G& W* C# v9 A4 U" q0 b" u unsigned int b;+ l- n4 G$ M! N3 o) i& m. a r
unsigned int packet_cout;& d* n8 ]$ u$ V3 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ]$ {8 \: y: W; ?9 K7 `/ n2 X
8 |" g1 c( N5 Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 r$ S' |' E' [8 n7 \7 u0 F
unsigned int count_copy = 0;
( M* G# K2 O- ?( {% j& s
: f' \! v I; T$ R3 _, w6 U0 s/ W* c% h6 @+ ^6 Y
int main()
4 B) q* i8 @% y9 G# u$ i1 f{
/ x3 o) }& I5 q4 u- f pRX_MSG_PROTOCOL pshreRAM = NULL;
/ B: s, m. t4 o9 Y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 A; f4 o) I' r) c' J2 `# Z0 T! q$ D$ R$ e1 p+ R
while(1)
3 V/ ?, \6 Q% H. r; g" B {
8 ?2 J) Q- W" y* u/ W8 _ read_MSG_buffer(pshreRAM);
' j& A: Q# s( @# n& |( x } ; i' \5 M& M7 [" H- h- q( W
}4 i" d# S, @5 y8 w& s
5 ]) y- u# }3 X- Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' V: f w: E1 ~2 G7 p5 M
{
) P$ R6 a; Y C3 x) p4 O$ N' [4 e RX_MSG_PROTOCOL buf;) b9 O- ?. M0 G8 I* B
# l! i3 J8 I* @! U" w buf.a = pshreRAM->a;
2 H# J8 w* A; i0 B& |, u# J6 F, a) @. q buf.b = pshreRAM->b;. G4 ]( A B- u, S/ r1 @! ~5 p, l
buf.packet_cout = pshreRAM->packet_cout;
( W/ Z8 }: P1 N2 Q0 s ' j1 s9 _% b4 K7 w0 a; R9 T' P* Y
if(buf.packet_cout != count_copy)
) L8 U$ y0 K7 I! O {
0 L/ W- M; j4 l printf("a is %d\n", buf.a);
2 z: q% Q/ R" b printf("b is %d\n", buf.b);7 w7 o& |4 T, l( o; t0 E" B9 Y
printf("count is %d\n", buf.packet_cout);
1 S5 |4 T6 e+ `7 h count_copy = buf.packet_cout;
# a) D! t2 c. i2 ^$ ^' A }& V7 Z0 r; z4 e, _; Z% r
else
. C$ g# W2 I' w% W, V {# J/ g6 r. q2 [/ p. P' s
printf("No effective message!");, B+ T0 M% Z; T! h* w. d" t
}
# t9 I' w p- O}! O/ ]: H7 l G8 P; S: P
3 G# ]# N8 Y4 I1 B- w* A% W" X
! R( O: ~9 V$ l, R0 A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' M/ j) I; S0 H" r
使用下面代码,对内存使用了mmap函数后:
0 c& O5 {) ], e2 |1 V& K; t#include <stdio.h>6 O1 @* b5 j, A! X& v( b
#include <unistd.h>, u$ f- n7 B# f% O
#include <sys/mman.h>
8 N( @7 Z! q3 ^/ a$ t2 O#include <sys/types.h>7 n# \0 N5 j4 W( ]5 H ^; |
#include <fcntl.h>. A0 L# X' p1 g( T) }# A( A
5 h, T! j8 s( M0 B, x3 Q! Y#define SHAER_RAM_BASE_ADDR (0x80000000)
- J( B& E5 d( {1 |" x#define SHAER_RAM_SIZE (0x20000) & S0 t$ S0 g& j
( t9 Q5 r( a3 F% ?
typedef struct
3 K, B% d X8 c6 o3 X{
0 \$ b4 {$ X1 p, W ]8 [$ b unsigned int a;# V, V) t. ?: Q* a8 P( W7 S; G
unsigned int b;9 ]. F1 h4 ?. T6 p
unsigned int packet_cout;. T" Q& _6 p u% j6 g3 R5 _% `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ f1 b$ v/ t3 G9 {2 y
$ i% E w" H% ?* J) z( O) y7 ?void read_MSG_buffer(int *baseaddr);, B; @/ }9 r8 }; U, A7 N" u/ C* H9 ~
unsigned int count_copy = 0;
: n4 F& X0 y# v0 m1 p! N. J9 y4 t5 l, p% U/ r6 h1 ?8 K
int main()
+ q8 G9 F$ `0 r, w D& t: I{
' i: r5 N2 ]6 q int fd;
$ y$ Z; p9 U6 }5 N1 a% M int *mem = NULL;
8 n. D( C+ F' I) a
$ r% j- L! N; J% a. \: B y/ e- h if((fd = open("/dev/mem", O_RDWR)) <0)
A% q$ \, b# X+ ]1 Y4 L) W8 z9 t {9 K$ W" K# `; O8 u8 U4 _6 b7 H
perror("open error");$ _' n, b* ^ a% ^
return -1;, d: e& _& \* v) i
}
, A6 {7 u/ r" x! {2 `9 u. O 4 a5 f- {1 c8 L- v! S/ ?, |" J) A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ }; O( r1 L; ]; L/ V
& `% {+ `7 ?8 }$ z while(1)
" H) x0 O) @0 J- ` {
: f2 o4 t9 l7 T/ d# T& F read_MSG_buffer(mem);5 y; ^; [6 h: O1 J- A. W
} " B' Y1 C7 l" V( o1 x
}
- S3 G3 i# ~3 ?8 \
7 J0 D+ M4 c9 Ovoid read_MSG_buffer(int *baseaddr)
- J' i8 \$ E$ W: ]% o( V2 B{' ~ P: l- h# W @
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ n" L) ~# S. C; {$ F8 i6 R' U" o. G8 M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 J9 t$ p' N+ \# g% V& w
4 H' w# A1 m% e w& k4 c
if(pshreRAM->packet_cout != count_copy)/ u3 a) q3 H4 g' ^% K
{
3 J/ R- F2 ?5 G3 q, \( B printf("a is %d\n", pshreRAM->a);, o0 C* L: s: O/ l
printf("b is %d\n", pshreRAM->b);, P& a6 {9 I. _
printf("count is %d\n", pshreRAM->packet_cout);
3 M8 }$ K! @7 Q9 p8 P/ X count_copy = pshreRAM->packet_cout;* L1 C: |" Z" n! W$ g* l8 `- T8 E
}
7 x1 i# c' q; F, R3 t# n else" M- q5 A+ q) s) n. p/ n5 L
{
& ^1 @2 b3 v+ T+ G6 q/ K( |- e4 U printf("No effective message!\n");4 o) i, x/ c7 t, |5 F% p) f" N
}
# [/ ^' @! q" S, M% s}. L( h# Q/ U& d2 f
! ~+ J# x) _: J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, w% N: Y: A$ a) O9 C4 _' `. N0 E4 @ O1 `: h, [% w" C h
3 J, M* g1 R+ \8 A
& z/ A+ W6 J: F0 X7 f7 d- h
3 N: i# b. ?: R. H- P% M E, b |
|