|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 E L* ~$ i) g
{; s% C' b H, G9 fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 X' B) d2 C! Z, I% ^- U
#include <unistd.h>
* F, G+ S/ A$ k- E#include <sys/mman.h>
. y6 J+ v7 h. s) j#include <sys/types.h>
1 `: Y) l7 n4 G5 \# p! y#include <fcntl.h>$ I9 ^5 P( e; D
! m+ U% `- }4 M
#define SHAER_RAM_BASE_ADDR (0x80000000) % g4 J3 d. N7 m- {9 v n b
4 w2 \/ x0 t8 N$ Ptypedef struct
( y$ p/ c" ?0 Y, E' R% C; C% ]{
3 R' I5 z: l' [. `1 t) G1 ~2 k unsigned int a;6 t2 U$ w7 C. R! r% I4 z
unsigned int b;+ J& I% a- D1 G* L
unsigned int packet_cout;! p: T% X$ s% i! `7 w: S _6 ^# c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 s' i! k1 M# w' L4 p- I' U8 _: I9 ?: l/ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ h/ b' m9 V6 ~7 I' m) {) B
unsigned int count_copy = 0;" _5 L( t# B& I8 ]1 x; I6 }
3 d" C' p6 x; S3 ~' g2 S) Q3 L, S# L
int main()
' ?- f/ q3 n: C3 h4 g{$ |3 a8 o4 v! F! T3 c
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 h4 {+ {$ S* Q4 K$ i# Z+ G pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 [5 T+ \ a$ w* ^9 e- f7 j
2 w% \5 ~5 f0 I+ g; F0 { while(1)
6 C2 S1 H1 I8 ~9 o+ w {
4 \/ E0 M5 J/ B& \6 q1 Y read_MSG_buffer(pshreRAM);
7 |* v8 z" T6 E4 \) S }
1 _! {# ~! W8 M3 U/ Z: D. }6 [& V}
% O2 l3 h. m: Z. T9 k0 m8 b+ ~0 l
& s# J& S- ^4 \8 R; C, |; w8 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" `" }, {& s1 R( Y! m8 {0 t
{
6 V& q1 C6 j' a+ r" g g1 ? RX_MSG_PROTOCOL buf;0 ~( U) ]" d! }
- I" X+ |: r( Q: \" e4 h$ G
buf.a = pshreRAM->a;
. d; P7 y, l+ L \* E, t buf.b = pshreRAM->b;
4 D# p* t- A- [/ H9 \" c" z7 {6 H. J buf.packet_cout = pshreRAM->packet_cout;! g' z" X9 Z5 [: X; j; ^
1 ?! y/ k/ x; T- _* x$ K& \ if(buf.packet_cout != count_copy)
k/ Y; h, z" V9 h1 ^, D {0 J6 R5 b& ` O# ?
printf("a is %d\n", buf.a);% u/ d) {/ l: Z
printf("b is %d\n", buf.b);% Q7 l( E9 [ @- A" T
printf("count is %d\n", buf.packet_cout);
1 C6 @, f- V' j: X count_copy = buf.packet_cout;# d% _" J- K9 ?; z. ^2 v
}# j' Y. B8 M# B) ?" U7 T
else
& V6 u7 m' r& o6 L$ M% n {9 }! \% R2 E- L$ Q9 g
printf("No effective message!");
3 r& u. V6 ?) l0 w }0 u5 F! f m! X( l" {1 s1 e# a3 S
}* U* _2 V+ [ X! b
; `. H$ @0 m3 M7 m& C8 P# G6 u! D9 ~1 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 E; x* z" t6 n2 s# x' B使用下面代码,对内存使用了mmap函数后:
% } H; Y. E% m3 m#include <stdio.h>0 m0 F3 N3 g' ]
#include <unistd.h>! W9 q+ f# h2 s; v' h) v
#include <sys/mman.h>
- Y- Z8 Q; V* ?! ?7 R8 J#include <sys/types.h>
+ C* o9 G j' P8 K! T7 i1 B. |#include <fcntl.h>
0 r ` P9 Y: b$ v* j( v% g r- c. }9 k) ^
#define SHAER_RAM_BASE_ADDR (0x80000000)( K& r* V) d, d3 P6 ]! f* G
#define SHAER_RAM_SIZE (0x20000)
+ L, b: |* _; y. W ~
; X* V% l- r5 Qtypedef struct! j( a5 _- v4 d. W: q1 f
{8 [: x- P. C! e J# R H/ r9 d5 {+ R
unsigned int a;7 }6 R0 ]& K4 y ?4 V* |# X! R
unsigned int b;: Z/ c& s, ?+ S5 V6 @8 M
unsigned int packet_cout;
1 }$ g+ Q- f, |- o& h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' W6 r; T5 B) q7 C2 s+ A) g* }; s' k& J) M# n8 p- u* Z+ j2 ?
void read_MSG_buffer(int *baseaddr);- M" u7 V; A* K8 V+ a8 M: `/ i
unsigned int count_copy = 0;8 S: N, ~5 Z! v) @5 ?/ a+ N
/ S9 m N% z6 C* p0 v8 e" i4 N7 m
int main()! T6 z' \+ I5 x3 j) I9 y+ ]0 T
{
9 I3 x" Z" P( a) o* |: y+ K7 c9 j( v! ] int fd;5 }4 J$ \! ~6 Q8 A3 ]
int *mem = NULL;8 l9 r" b: y+ Y2 ]. o e
# z- g/ G+ _+ a T j7 G if((fd = open("/dev/mem", O_RDWR)) <0)( L) c9 j4 k& f* m/ O2 y" T7 Z1 x
{
! d5 y2 X p2 \0 `" `+ S perror("open error");- A0 x/ t0 \/ y( P& v
return -1;
: u4 _* t* i! o1 }& Y; e }
" h! @4 A$ U" R$ c; z" Z- z; _ - ^" a' r* M' P& a3 n4 |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 _: o% `6 J1 P% o: C0 D
9 B! D$ ]% P2 E while(1)+ T% H' m+ ], v4 V
{' I- K6 }/ x# O- T; q; z
read_MSG_buffer(mem);
% k, N) z; j1 A1 _! }3 b2 B } 4 ~( _- f0 }* g( t! {
}0 U$ x' j) M! _' y6 @! }$ r1 \
0 c- p' M* s3 r! H
void read_MSG_buffer(int *baseaddr)- u% a8 [1 R2 ^3 A" E$ e
{: j" |; A% }3 F6 _) o; S/ t
pRX_MSG_PROTOCOL pshreRAM = NULL;8 _. m( f: c) a0 k8 ~- \: T! {, `! _4 B
( s$ f- z. L- ]/ B; r9 Q+ ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
W5 K2 _& \/ u6 o; v
8 y# o+ e! r% v k if(pshreRAM->packet_cout != count_copy)
1 [) f" L7 b" G, |# C% _7 L" a {, w% [& f' O) j8 k4 E& t5 D; B
printf("a is %d\n", pshreRAM->a);
7 Z0 j- M0 v7 v7 C' J3 y9 d- v printf("b is %d\n", pshreRAM->b);
) J3 ^! Z; x J L7 l4 O printf("count is %d\n", pshreRAM->packet_cout);
7 d6 n+ U' \8 [% t/ H) |% w count_copy = pshreRAM->packet_cout;
) f+ \$ J& @" G) N5 ?! { }
' W& p6 A" G! }2 ^ else
H8 z" @7 t( M, C {
6 ~1 b6 \3 k* V7 F% d, ?4 ~( B printf("No effective message!\n");
0 k+ ? t6 d1 O, _2 C# I% Q6 b5 x }) W( c; \! w. b) D j8 v3 |
}
/ r0 m5 I! a; ?, e) z' c3 F+ D. D7 Y* `# R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# D4 I, J+ u7 f+ S7 Y" U* A. B, }$ q& Q; j4 i9 e6 ^2 d8 T+ l
' _. \6 k: R: \. i4 b) m
3 f3 b2 ]9 C% q- g7 G% @4 i2 \) M1 D( l, F/ {
|
|