|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: u4 a2 z6 \2 g: M9 m9 J0 ?2 k
2 W! s8 P0 C: L: T2 i) uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: D- I7 X* O, _" d" w#include <unistd.h>
. x! n% U, s1 t& a- D$ c0 N#include <sys/mman.h>6 k) C' T' b" n7 \) L+ l
#include <sys/types.h>% F% ~) C; Q1 J8 [' m
#include <fcntl.h>
; d$ P, U0 h" O
3 l' Y6 m4 U( D5 H7 g#define SHAER_RAM_BASE_ADDR (0x80000000)
+ V0 w; Y$ M/ `+ i: B) e
9 H; I a( d8 Q' ?typedef struct
0 q9 ?' x8 |* o& m/ r+ V+ E! n8 d6 [, t1 j{$ j0 P1 _7 S# T$ y4 F5 U( _& m
unsigned int a;
/ D, P1 C& j( t! y unsigned int b;5 a4 v5 |0 b+ M( z( G8 b+ `
unsigned int packet_cout;
3 ^8 X* s6 y& Z/ U! V3 _+ z% K! h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) G: _5 c* w0 i2 n5 |
- J) \! B0 Q& B! Q7 o# Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ d m" ?4 o3 ?4 L5 S" o! A& I3 s
unsigned int count_copy = 0;3 j- l$ f+ J: `
4 o: h7 G( I y9 p5 _* ]
" S; x9 C7 z: I! q6 b" k* qint main()
' N/ t$ \. w- X9 _) B{
0 U( `2 o4 Q, [# n `+ I pRX_MSG_PROTOCOL pshreRAM = NULL;
7 M2 S. b; ]* [+ Q$ ] pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 d: v: I1 x4 [9 ^6 K% o* W4 t- v, n4 N- G6 Z$ u7 n8 p
while(1)
( ?. I0 a, i- t/ M; G2 ] {
6 t0 |3 r5 n9 E7 ` read_MSG_buffer(pshreRAM);9 I- e1 [4 d; n; Z4 ` p n: t
} 7 J! W" o+ {3 w E# {: Y
}
3 ~2 t+ f# z q. d2 B2 G' Q% v* z, d6 l+ ^: o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 e( q$ E- H' k( i8 g6 t{
6 O( {" e7 p6 h6 |! Z# n RX_MSG_PROTOCOL buf;
' {/ `. p0 q1 T% C& _
# } k9 w( f* n! w+ |0 |. E! Z buf.a = pshreRAM->a;
1 l0 M: |7 D/ Q: @# O' i buf.b = pshreRAM->b; e( u- c" T% Y3 ?/ a" Q: K
buf.packet_cout = pshreRAM->packet_cout;
8 {% `) b8 ~( h: v; j ; N. n: N# _0 p* n
if(buf.packet_cout != count_copy)
) Y! ?% I. S; Z- ? {, S/ X$ k" W8 F3 [
printf("a is %d\n", buf.a);
, R% X; {! B3 `( h/ x1 a( S2 A printf("b is %d\n", buf.b);- [2 E$ p; T6 Y# D* f/ d
printf("count is %d\n", buf.packet_cout);
+ Y" D* j* d" T9 r" g count_copy = buf.packet_cout;
. x, v* c! ]- | }
# Z% u/ {9 f+ ^2 X3 ~ else
/ |# y9 k& k) B" v {3 a2 o3 C) N' u5 o) F4 l
printf("No effective message!");4 s5 P3 t2 D4 x: g/ d6 u9 M/ }& ?
}
& z6 n3 u% n1 S1 X}
3 z7 c. l \$ q; F( H9 o
, i7 E7 J& |3 p4 C/ x8 E
, a: s, ?. A0 G7 ~+ z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 Q7 A& e+ o, l+ ^" y+ P
使用下面代码,对内存使用了mmap函数后:6 Q8 g8 x. t; w" q" I8 ` Y; u. I3 v5 z
#include <stdio.h>. Y8 B, {- J9 G7 b3 d9 P+ Y
#include <unistd.h>5 k4 m: k; V7 Q: h
#include <sys/mman.h>) I# b. d! y7 n5 O& k9 J4 S! M4 [
#include <sys/types.h>
& c4 C8 B+ d* d1 S+ T#include <fcntl.h>
1 j7 B8 F8 W3 t ~* ]- z3 P
' N l7 ?2 P2 W K% J& f#define SHAER_RAM_BASE_ADDR (0x80000000)
+ x4 x+ D5 j: a8 t1 e. r#define SHAER_RAM_SIZE (0x20000) 8 E6 t8 ?* t0 U: g+ |3 R1 R$ D7 g
* V& J% N6 J, h8 E. @typedef struct- i! R6 [5 S. {- {8 T( u
{6 A# K$ A$ ~: G, p( q
unsigned int a;
4 r0 f. I# a) z/ k: n unsigned int b;
. j& F4 A& t3 Y7 Y8 n unsigned int packet_cout;. p* p# B9 q5 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
g# O3 ?5 ~" s% _6 y8 n W5 m8 i- \ d" Z- ]4 ^" e5 r1 n
void read_MSG_buffer(int *baseaddr);5 [: g1 c8 m/ I0 [3 Q- p% @% W
unsigned int count_copy = 0;
8 w; M0 P! Q* _8 f# e* C) l" w
2 G I0 F: y7 k' O$ Kint main(): R/ N/ s9 N3 n) ]+ ~
{
) w% U2 p- ]% I+ r) {5 |( o2 s int fd;
; s5 i0 ^& J7 @! {( C int *mem = NULL;
4 Q3 A8 g- U; O# q5 K) y
: l8 ?3 @. G; I1 S if((fd = open("/dev/mem", O_RDWR)) <0)5 p* m: {/ Z0 |* Q: `$ l: K J
{
! E9 a7 T M" b; R: p, k perror("open error");# q9 P4 _6 Q6 j2 u2 b
return -1;
' ~) C. Q/ k! Q" T }7 w- l+ z. d' c) E/ I" O, I/ ?7 w7 q
+ c6 p5 t+ G( @& S mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 {& \ D- C# ]. o1 u
6 a0 i$ P8 R2 X" Z) x while(1)
- z: e @$ r% {6 c, Z {6 ]6 ?+ v) n* ~; [6 V( f P
read_MSG_buffer(mem);
" i& x5 B& N8 x5 Z2 h$ X. F } : x9 A" Q5 }& d2 J
}) J0 x! ?' a$ D: C& y* }7 s# n# i
; E1 h1 R5 @. x, O4 u; S( F9 xvoid read_MSG_buffer(int *baseaddr)2 x, z2 K1 P2 x& E
{
, s* ?+ y' O/ T+ y" I pRX_MSG_PROTOCOL pshreRAM = NULL;
! T3 W4 n a7 C" r
# V- ?3 N% T' g0 b- v* V pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( N! j- i" d/ G2 Q
7 t9 j* I! t3 d: C( @ if(pshreRAM->packet_cout != count_copy)
( S* ?$ Y$ D } {
$ d% i2 y+ F& K% P O4 o printf("a is %d\n", pshreRAM->a);
5 r9 }+ k! x7 f$ o1 U2 t$ E printf("b is %d\n", pshreRAM->b);: y( O( f. m, X
printf("count is %d\n", pshreRAM->packet_cout);
; E5 `$ @& s0 v' e+ J# G. q3 c count_copy = pshreRAM->packet_cout;& H8 p3 U+ i( g# z9 K
}) }9 Q( |6 ^! p( ]) V" w% x
else; _- z! |( R0 \& J3 L+ [
{# O5 v4 q# n5 {5 M
printf("No effective message!\n");3 Y! ?+ n7 h1 z+ y5 h5 i1 O
}
$ @% a5 G& k& b" X! `8 C}
9 D8 `4 j1 T* s: \7 u1 f. n. {& u. e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% U. o+ F7 M! R% q: n( ^
N4 p6 T9 h. Z9 N; \! p
8 r) u g; v" K: g0 ]
- o5 [" ~. s! D, Q! L( ?
7 n' u; [4 R4 h( o9 @1 P |
|