|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & b9 S$ ~3 O& n. `" O6 l# {* m; m/ r
) U9 D `' ^! w' X! a% N# K8 Q$ nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 U' l {5 z/ {- _/ `#include <unistd.h>3 P* h2 O1 `% q8 F
#include <sys/mman.h>
9 O& b" x- ?# f# t#include <sys/types.h>
0 W; e# N3 w8 Z; O9 L#include <fcntl.h>
* y: T% V1 V$ f# g3 R9 {, i
+ L4 v' I6 {# j/ X K6 I- M#define SHAER_RAM_BASE_ADDR (0x80000000) # i* w: q, h8 x# m. u* x: d0 ]
@4 p. N: p- K3 ^typedef struct
- w8 {* ~0 C' T& v. O4 {) ?3 X{
5 M* c2 G% n6 f* a2 d- b unsigned int a;
0 p1 z1 F0 X( i. }5 X# B: l unsigned int b;
* _( N/ U M* O0 R( U, w3 K' @ unsigned int packet_cout;
9 b1 |+ p8 `8 s" f& J4 p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. C6 l4 {6 ~, J D7 k1 x8 C9 o) K" C4 f0 B6 j5 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: C1 ^. Z( z3 U+ W' @1 `! ^
unsigned int count_copy = 0;. ~& D2 d) b* A' [2 g/ L. t
" E1 k$ \4 p3 S3 m& P, w% V8 Y, m' W
int main()
$ ?; L8 D m) @4 K# k1 |7 p. }. s6 n{
& c7 Q2 a4 r, r" u( B) M0 ~1 C! k pRX_MSG_PROTOCOL pshreRAM = NULL;1 M( g+ i2 E4 u2 Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 A7 B! ^5 f% K) h! t6 e
; _' t1 j+ f$ H
while(1)
6 u% e- Q" L# h, w; a$ T: c {
& I6 F6 r$ k. Y) v7 } read_MSG_buffer(pshreRAM);
% Z$ K# s6 B& R+ t. \) L } 3 j7 R1 \' [. y: g+ c6 t
}
1 j1 C9 G9 |/ p2 b& @: V8 T2 q. n4 |. P1 d0 c( I9 C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# Q, O2 ^+ g7 o6 a{/ E! k/ h0 P' D
RX_MSG_PROTOCOL buf;
; q6 D* N$ O! g9 v8 \
2 y% P3 l4 N! @8 v buf.a = pshreRAM->a;% x, O0 m' P( V0 P+ |/ J) C
buf.b = pshreRAM->b;: S g' B3 W% l# G* a( O
buf.packet_cout = pshreRAM->packet_cout;
( t J" {6 [( H$ r . b& [, Y, _$ t* d6 m
if(buf.packet_cout != count_copy)( B/ l0 \' _+ T
{5 f/ a3 b( j6 H1 T
printf("a is %d\n", buf.a);" _/ B/ b% `5 {. G# H: g
printf("b is %d\n", buf.b);5 E7 w: v+ B4 q1 j
printf("count is %d\n", buf.packet_cout);/ G# @: c# Q) U# ^
count_copy = buf.packet_cout;
! T# g4 u) Y( w# l: L, x- r* [ }
, r+ ?2 {! L% p else: V$ u( o M, W0 W; O
{8 z. x2 x7 _; D1 i% L; y
printf("No effective message!");1 k* ` s) l& [0 I4 G
}* ?# G! Q( E+ D; f* U0 b; t+ s
}
/ D* v8 p8 p1 r7 F: T7 E# s
s$ o2 X8 N2 z* n$ \& T5 E8 u0 o, D+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; u) v! i1 t) K8 _使用下面代码,对内存使用了mmap函数后:
E# v1 v) h3 ?9 A& U#include <stdio.h>6 m5 v$ r: w. Q, }
#include <unistd.h>- e8 J. L* H6 ^2 p6 c
#include <sys/mman.h>
1 }" q8 _1 T- M; k#include <sys/types.h>
+ U3 y5 d6 H& M" m" F#include <fcntl.h>
: C9 q2 U5 s1 {) t1 ?& ]
% ?4 q& K; F! j5 a" v#define SHAER_RAM_BASE_ADDR (0x80000000)
1 g! x% g- J. I0 I1 B+ N#define SHAER_RAM_SIZE (0x20000) % ~; W+ M. W, ~! G" A" f( \
+ j6 R( `7 O' l8 Q: {3 ~$ R. Rtypedef struct; }+ a; @4 `, E) t
{
0 M) h I$ u8 h% U+ ^+ n unsigned int a;: `) n8 ]; T0 T* V% Z7 d1 d
unsigned int b;+ A: @9 }; |: i" U0 Y
unsigned int packet_cout;0 J8 u% Y2 r% b6 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) D+ A- ]6 p/ c u9 R6 Y
1 k* i/ N9 G+ Jvoid read_MSG_buffer(int *baseaddr);1 y, L5 G1 K& a! q, }. N: M: K; u
unsigned int count_copy = 0;" J" ~% x4 F0 }+ k; g9 w( r* z1 t! J
( Z' l1 g9 L0 S. ~4 ?
int main()+ F$ W' E9 _8 O. m+ p, \& [
{
* p+ T) |6 O& J( D/ T8 r; j* {- ~ int fd;
/ e# H# f1 G- f" Z m4 h$ A int *mem = NULL;. j6 U. i. ]7 U- J7 E- T
8 t" i/ e& z3 }' ]0 L! c
if((fd = open("/dev/mem", O_RDWR)) <0)
" P0 F8 d* F- M$ O {6 R" R5 w) r& y
perror("open error");
5 @' x/ e$ z* [ return -1;9 @* H7 d- O! }/ q$ D" C4 n
}9 b3 |! g! V% M1 X- H/ w
& ?' }4 n3 n) I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" `' M7 ]+ \; f d' {
) b5 x8 o/ X: q% Y# q: z( l* q while(1)! O4 ^# I: G; O+ s+ G3 }- O" t; x; _
{' \. `& j5 Q9 [$ u! w8 h6 u3 A, o
read_MSG_buffer(mem);
4 F1 o0 c' ^& V; ]! }( s }
& P; M- L) d! K: Q) r. b( P}& ^ f% B& X% h
# z( t; B% o A$ G8 l9 Y# Q* k8 svoid read_MSG_buffer(int *baseaddr) I% n1 z& N8 E; G" h4 m9 J6 l
{
) [. ?1 w, F% I' ~5 J pRX_MSG_PROTOCOL pshreRAM = NULL;: ~ I; ^# M# Z3 f. a! ^7 F
2 }" X! N/ Y; k- I" l. O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" E; Y' }- H" i$ `7 i0 t
4 d# D8 [; q t' c% F" [ if(pshreRAM->packet_cout != count_copy)5 h! S0 U b6 `" ?% R8 z
{7 y) }+ j3 E9 F+ [: a% ]
printf("a is %d\n", pshreRAM->a); o N2 D6 ^: E0 P5 \$ E
printf("b is %d\n", pshreRAM->b);+ i! u) f8 Y/ v) k' G5 w; o8 E
printf("count is %d\n", pshreRAM->packet_cout); X+ X5 x# a8 x- o& F; f5 e
count_copy = pshreRAM->packet_cout;
Y3 p" |- |, I/ }& p }
4 K; e: e/ v. E# @( Y( i) m* @+ J$ S! o else$ E: i5 }# [& G' m* w
{
& Y: a! m. r/ D3 w printf("No effective message!\n");6 k- i2 x9 K! J$ d! D% T) L
}
$ c' {- t3 C7 _: p3 s}
n: Q# O- Z/ C1 I( D: G
+ b2 p* \& X; i& r r R4 ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ e- d' O2 v5 a' W5 E- H B0 W
% ~# h7 |- X4 k& I1 c
9 q' o% y) E( C0 b! D" Y
% R0 F1 N& g2 H) h! O/ m3 y4 F( g
6 v! _$ g) [; ?: C" L# O5 M
|
|