|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 {6 K1 ?2 n. y( {* c( i0 D8 s
: ~" F' i! C6 o; KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 Z9 l9 ?% ?( @#include <unistd.h>
! H0 ^+ E0 o' Z5 A4 Z! i0 ?#include <sys/mman.h>
; W" R) [% o* L# Q2 j, H#include <sys/types.h>! C9 P) `% U( `
#include <fcntl.h>
: F" S9 w# |; k8 o" O9 o; u! ]3 b' z' |8 I; ]& ^) ~) F
#define SHAER_RAM_BASE_ADDR (0x80000000) & n1 F8 t* t8 F; }# O
& O$ d2 }3 g7 d8 j* m, e5 u
typedef struct5 Q* y. T3 n2 @7 [6 ^! f
{+ U( d& b/ ]. H8 b1 f o
unsigned int a;
; R& q* z8 n' l) z( @, x2 H( L unsigned int b;
5 v8 u/ _) T4 }+ L" c0 ] unsigned int packet_cout;) A' ]0 ~7 ~2 A5 q! S# v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- h+ _) `( @1 C) d+ e4 I
' g6 G0 \7 ?0 V4 Q7 g1 Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( u) |& T q! `& q
unsigned int count_copy = 0;
6 H) T9 _* v. @8 x& p0 {' L& @# @* O; D/ l
+ ^# w$ ?, ?7 Y! v! w
int main()$ Q( {, ]: L3 Q6 g
{
; h8 L$ J" e$ `& Y pRX_MSG_PROTOCOL pshreRAM = NULL;; x0 [. u8 e2 V" w* t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; k" ~; z( h) K4 ~3 A
6 K7 P5 ?+ ]9 L" C7 j) W
while(1)5 X6 X7 i. f! I7 |: N' }" A
{
2 Y' B4 S7 w& C* F7 R' t( _ read_MSG_buffer(pshreRAM);, I- ]: H6 s% ~+ n
}
6 B f1 T+ v( @5 z}. _/ N0 o: z' G: T* [ r1 M
1 f9 `; ]: @! H" tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 R( C! F+ q. |, ^% Y: f
{, G! L) {- ~1 a& B
RX_MSG_PROTOCOL buf;) y# m- S/ L0 J3 ?) e
/ j; \. O* K1 z2 j buf.a = pshreRAM->a;
8 i* {8 O, |7 D- x7 p! s buf.b = pshreRAM->b;
4 l1 ]3 ]2 p6 t" X/ w2 G" W buf.packet_cout = pshreRAM->packet_cout;
4 E) C+ J' @, J 8 p6 K5 ^6 m2 w* y3 ?) k. O
if(buf.packet_cout != count_copy)
7 g9 v4 |8 F7 E2 W; O {. l* @: u6 x) _ A& N
printf("a is %d\n", buf.a);0 { h; T: j. ^% k9 z8 ~
printf("b is %d\n", buf.b);
# ^, |- z4 o9 h4 I) s' Q printf("count is %d\n", buf.packet_cout);
k8 p, U q1 M K- {( I' q count_copy = buf.packet_cout;; p C- P T$ [# v6 ]; ~
}
( U0 w( b7 F: x& n else+ f d/ Z4 D, |4 s6 _
{% }! c( ^% o% ^* t2 o
printf("No effective message!");+ t: h8 |9 e h# N8 b, N% D" l L E
}; i: s1 W3 C: x7 K0 c
}
5 Y! x4 o$ n! O# Q/ C4 G$ f% ^
. J7 n; y# ~5 r( h {. Z- ` T2 S; c5 q* I0 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& @# { i5 g$ H5 |# g. @* U
使用下面代码,对内存使用了mmap函数后:# n+ ]9 }+ I0 B' E' a' V& p; K
#include <stdio.h>
o' d, U* N5 {6 u#include <unistd.h>
0 {2 t5 q% Q$ d#include <sys/mman.h>' f& g3 L) M+ S9 G8 R2 t+ s
#include <sys/types.h> f% I# W# T( l) t* j' p
#include <fcntl.h>: ]9 R4 A5 [1 ~: V, ~8 ?
! |- ?* C- Z8 k; s( V, u
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ W: ~* M4 G) j7 k$ v7 m#define SHAER_RAM_SIZE (0x20000)
% o7 @( Z' s6 c/ {& v0 h1 G. c
" l& U: T0 F G: atypedef struct2 B5 R# K; u3 o
{
2 T9 r( c4 u8 v+ s unsigned int a;
# L, i7 U9 ~. U) v unsigned int b;
' w+ ~' E# d8 P0 n" f) I# w" Y. \9 j unsigned int packet_cout;: Z6 A' f1 A0 `; G4 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 R' b8 ]) S! }$ O9 y: j/ b' E
! R# Z {4 J, A4 B! X" ivoid read_MSG_buffer(int *baseaddr);
, @8 X( r7 [9 K6 }9 \/ V, Lunsigned int count_copy = 0;
% s7 L) k$ {8 n. S; \8 ^* S" G8 }% N1 p
int main()
8 C* F4 q8 t" w; n# n& ?# c4 l# z/ n{
' W9 Z* p) m: ^+ D/ M int fd;' O4 T( a: f0 q4 K/ J2 c7 ^
int *mem = NULL;( K. p& Y! L( ?+ o; p4 E4 L2 i
5 q6 s* q% @* T/ K
if((fd = open("/dev/mem", O_RDWR)) <0)
; L8 L: f9 z y2 g. g/ c* O4 i {
& B/ e1 k4 p4 c* f4 w perror("open error");
) q; Z! @) P$ b$ e/ l: `, R return -1;. S" U; i7 `6 D7 }0 f6 C
}
0 ` _) r: @. j/ P! x* N % L% o3 u. Z+ p. Q! l4 u0 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! J" |* N, N+ ?3 R+ T
+ l! Q/ o9 o4 U& K( ]6 @1 [$ Z while(1)
' `/ p" V$ m5 [8 T8 s6 e" p. x {
J8 P$ {$ n7 r read_MSG_buffer(mem);
$ ~7 ?* q3 _3 p0 j/ [) `+ _. \' u } # s5 \2 c% ]' a1 J9 w/ c! `7 C( j
}2 }/ d; B/ v* |, T) C8 X
( ~- Y4 z0 H9 B( s4 R: svoid read_MSG_buffer(int *baseaddr)
0 }- m: x4 {, h$ D' j{
9 k) u% b1 v$ k: G pRX_MSG_PROTOCOL pshreRAM = NULL;
- { Z' i/ J- v4 f" {5 f' D' H0 I
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 x1 N$ C0 I6 U) h( v( m% h
. h, ?. Y9 w1 A+ r. ~ g( @ _ if(pshreRAM->packet_cout != count_copy)3 r4 V) e. p6 X
{
7 ]9 I L$ w1 ?, v! N printf("a is %d\n", pshreRAM->a);2 G( s) S7 ], o% f# e/ F, a1 F
printf("b is %d\n", pshreRAM->b);
) t2 m! G! H( i9 M printf("count is %d\n", pshreRAM->packet_cout);
" s: k1 M. |( N7 [& s count_copy = pshreRAM->packet_cout;
7 {. I/ A4 ^7 K3 @5 f3 e }
0 I! A: L, p* B0 Y* h5 F+ R else
* U( Z( c) |2 h, X8 Y {
. `3 f/ a# p( \7 T5 w9 W printf("No effective message!\n");
2 N# B: B9 c8 X, t6 R' \ }+ M6 q5 c# a' `+ Q8 O
}
0 j+ ] ~2 F. U T$ \7 i3 K9 q) z- ?% A& K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" U; X& O$ Z1 Z- Z7 ~2 k& K5 l
' Q" T" X8 [. N) n4 U3 }
f1 x& |. s% Z/ ^* T6 e" u6 n* M" y
" x8 w: w3 K' K2 n- Q( U6 x
5 J: j/ b" y( q |
|