|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! b' R) h3 W+ g4 L1 D4 s
0 a% \/ h5 r3 V1 m0 W; B7 ROMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' Y; }7 Q4 z: B: P* b
#include <unistd.h>& g% V1 Z# ?$ q3 T) s
#include <sys/mman.h>$ r1 P& Q# d! D6 y" @3 T8 M
#include <sys/types.h>
. S' m P9 h2 P: [6 l& k8 L! p5 o% U#include <fcntl.h>9 l. H# V' B5 ]5 V. \
' m7 U! J* J9 p#define SHAER_RAM_BASE_ADDR (0x80000000)
! H& M. v& @, e8 z; B$ n6 G4 H0 I* b# m7 [9 |
typedef struct
3 d* t" [- K# I{
% }% }' i3 L9 `" `3 @ unsigned int a;
/ z d( M- i# n6 R F, t) S9 S* O unsigned int b;
6 C, D' O( U7 \8 b- j unsigned int packet_cout;% ]: t7 [/ w# ~/ ^0 B! z+ t B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. l8 g- M6 c" M3 E- q
' _( U$ p5 O, e3 v j: ?; _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% D1 Z$ t4 a' W- `unsigned int count_copy = 0;
M* U& z$ \" y, Z. e
4 _" h1 `" _3 @- q) o1 T a4 B( d0 i0 A
int main()4 {( {* c2 H, b; }% H# M
{
$ z: l* ^. l7 A' r# { pRX_MSG_PROTOCOL pshreRAM = NULL;
2 ] j$ w( p. f, |5 }7 C: F8 g pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 @7 N( k6 }* N# n' K8 B% M: r0 n2 k; i9 Z, K
while(1)
2 c- `5 G6 k: }' v+ C H" u( K3 ^ {
% c% o/ e- `% G read_MSG_buffer(pshreRAM);
( @" C* p2 Y5 `$ r- Q& m- e }
# N! R8 x. \, r}' n0 f) _' x+ t7 b8 n; Y% E& z
- R- I. t% I7 n2 {9 H' c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* x0 P6 k* \3 x
{
4 Y9 f- z- n" e- O' A RX_MSG_PROTOCOL buf;( a0 U5 o) c$ V! N* F
# S/ R3 w2 ^* L6 Z i$ h. R
buf.a = pshreRAM->a;1 u0 c0 W$ G: k* t6 Z- K7 f% l$ P
buf.b = pshreRAM->b;) ?" Y' f, s5 ^. l4 a3 x4 u% L
buf.packet_cout = pshreRAM->packet_cout;, J1 w$ ?( }5 w( p; R) s6 `2 G# M
" B0 [: A: R) Y! |: N; d if(buf.packet_cout != count_copy)
; a& f {' t- l# K {' A5 V5 v! S0 q1 z- k% n$ O Z
printf("a is %d\n", buf.a);
, Q0 x: d8 c4 L1 L6 T& a* ]( h- H printf("b is %d\n", buf.b);" K: M: l& P1 ?, K
printf("count is %d\n", buf.packet_cout);) E- j3 C3 S4 m
count_copy = buf.packet_cout;0 u0 x2 y, K4 T p; B
} L: V) G3 u" C, S) \
else6 w% ]! X2 s s
{
6 e- x2 Z4 j( E6 Z) g8 Q printf("No effective message!");$ `$ G$ J. C* K
}
. e+ k6 \# L' R( ~% Q, a2 }/ z}4 a0 i8 S, L9 O R+ E5 o5 T7 {
. T8 X# q' Z2 O; R% z% Q5 X
, @4 W/ S6 w" l) o% z+ i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 B; ~& @; N" N \8 q3 ]5 F使用下面代码,对内存使用了mmap函数后:
F% u" @2 E- [( V5 D$ L o* y1 J#include <stdio.h>% x: S. W$ @3 U) \# c
#include <unistd.h>& e( d5 R8 `6 ]2 x3 o) O
#include <sys/mman.h>8 N2 `- g4 S! d* l3 f, D7 r
#include <sys/types.h>
E. m3 j/ h5 {5 u7 B( E& E) m#include <fcntl.h>+ X+ g/ h4 b/ ?+ S5 D9 Z8 g/ n
( v; `! w: D/ }$ W#define SHAER_RAM_BASE_ADDR (0x80000000)
/ b/ e q/ N5 f" g6 ~" x#define SHAER_RAM_SIZE (0x20000)
% B) v2 M" v8 Y; B: ^" a( Q% p2 z- K7 Y5 \# Y/ R2 _* C
typedef struct, A. K3 \2 D! e/ o: s$ y# R0 e. N" K
{' T9 `3 ]) q& e _+ i2 ^7 i
unsigned int a;" b" @: c- L- ?* L5 i
unsigned int b;
0 i( T; B8 ]3 S. }6 C: w6 F unsigned int packet_cout;
# S! `( b- ?2 {. q/ \2 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, \+ L" c1 N* \+ m' k) q1 {0 |" Q7 T& E) r
void read_MSG_buffer(int *baseaddr);
4 y. P: ~. g7 qunsigned int count_copy = 0;5 V: M8 v0 Y, f1 h( k
: G" c! W1 ~# t1 B) c" `8 A' H
int main()
: K. N6 _$ d2 ]" t& A) C7 r2 P{
' e3 J+ ^5 b2 [' h int fd;' e6 w: D3 n( o+ i* o* p% _* j
int *mem = NULL; z Q, H: ~) h' M( B
! U4 ~4 a! j" t1 ?
if((fd = open("/dev/mem", O_RDWR)) <0)
! D0 |. I; n5 R) |5 ?" y- ?! j {
+ G' L8 j3 b. {* \! `" n# E8 J perror("open error");. {* C: T0 S8 ?" [: Q5 M
return -1;
% v" w/ F1 `* G# q9 _" D }
9 Z" k- v! K! L' R3 R7 m. R" Z
! {7 m+ E) c# k* [- @ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& p9 l0 j+ v% o' ]% Q) E9 n: e- F0 i, ]! w8 }
while(1). _8 \" ~2 p( F8 X
{: C+ C1 l$ q( e' g; c
read_MSG_buffer(mem);
) z4 H6 f1 t9 r1 k3 O5 L }
. y0 |( N0 H4 P; X: v5 ?}
- O7 N0 p! \' w8 t; V& @
- _7 X' N8 a; y1 h& J: vvoid read_MSG_buffer(int *baseaddr): D. E( e. c$ m8 t$ B! y* q
{% e& R6 N6 }2 B
pRX_MSG_PROTOCOL pshreRAM = NULL;% Y# v, t; g8 ?1 C, @) M
) Z) l3 Z! M/ n- ~) K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 C: `' {' j6 K: G* U g& m: `
' S6 _7 E6 j3 W6 \
if(pshreRAM->packet_cout != count_copy)6 q \/ ?6 b( Q4 A* x/ x0 w
{
- J, q" e' ^7 h1 G( E6 {. T: j printf("a is %d\n", pshreRAM->a);) d$ b; z' G% x% U7 `' ]
printf("b is %d\n", pshreRAM->b);. J. a& G' m* @, | m! c
printf("count is %d\n", pshreRAM->packet_cout);
, v8 V' { S2 l! h& `, ` count_copy = pshreRAM->packet_cout;
O2 Z0 l3 Z1 v4 g& ? }6 `: B# `; s7 @8 l8 m* d
else
3 k* w4 k# j& H% x' M1 { {
% p$ i- T) G" w" B! @1 J2 \ printf("No effective message!\n");
% O6 s U' j: K9 ? A }
4 N, e# w$ p" w$ M}# b, B/ A9 B7 L2 k4 b; Y% z8 f8 f
0 u, @0 p5 O/ ]3 u" }1 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 C" k! ~4 ]$ ]. ?5 w# z4 r) i. A, @
$ l% J/ V+ r' Q% R3 M! L4 z6 \; h: y
$ H2 m' o% L' L6 l4 e; _$ T2 ]7 C4 g# U
|
|