|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ t# a. Y. E4 Q; s0 v) w- S9 A) A5 u& j1 D: @2 Q" S$ f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 ?+ p, j8 ^+ [#include <unistd.h>
* L K' ^# C- a; C#include <sys/mman.h>
6 t9 |$ e& w4 B' N6 o: Q#include <sys/types.h>) y* x4 u3 f# c) I1 f7 O( y
#include <fcntl.h>
% b) n J* [, x, _( i: i6 {- v5 j+ j. Z$ N2 x
#define SHAER_RAM_BASE_ADDR (0x80000000) % _- } N5 z& `7 f g
0 n2 u: h- K# A# y, X& \$ Etypedef struct% }0 r& ]4 O$ k1 k9 k' ~, j
{/ G; N s& p6 ^6 N% h0 z
unsigned int a;. u6 G6 T; b+ V+ |/ c. e6 y i' T9 U
unsigned int b;
9 G! ^/ L; k" ^ K" ^$ z* ~: ] unsigned int packet_cout;3 G# }5 K' }# D" c& m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL; O C% [" t3 m. N8 u5 \
* p9 k. @5 s) ^; m& M4 N5 i! Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 [6 ]. t# i2 l2 ~% P7 \" X
unsigned int count_copy = 0;
, g5 u6 E6 r r0 _) y' z; P& ~# R2 b: E# M8 @8 @! z3 X7 V
, @4 _- O( n1 t$ q; Eint main()3 v$ q" Y$ v/ T
{ f5 f4 Z& ?7 F
pRX_MSG_PROTOCOL pshreRAM = NULL;- g$ ^2 H- P3 }3 ?: B' o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 p" z6 X$ p% ] ?3 b
) O9 O1 C- S4 t. J& f+ j' n while(1): t3 x! q2 s9 N$ P x( N j& j
{, I7 e0 K; I+ G: D
read_MSG_buffer(pshreRAM);! e8 V( K( Z6 s5 P8 Z4 B e
} G/ t3 N2 U) `# y( P5 ~
}/ w! Q9 c6 J$ N* B
3 d1 N0 h9 J0 u8 F. e. ?1 N, F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 ~) c+ [& w/ q) C
{
- l9 ?" N4 d, |; n: G* h/ { RX_MSG_PROTOCOL buf;( E4 y' r4 H" Z; h$ w
% r4 M$ R& B. p$ j. f) d- S9 `
buf.a = pshreRAM->a;
$ _/ ]% Z8 ]! D* n buf.b = pshreRAM->b;
8 j& l% K8 g/ U+ C1 N buf.packet_cout = pshreRAM->packet_cout;
; X/ Z+ ^1 U3 m" y, H 8 }$ J4 E) h' f
if(buf.packet_cout != count_copy)
$ R% i7 N/ D& U6 B) c% G/ b) i( x* c {
% [6 B9 X3 h& e3 m) D printf("a is %d\n", buf.a);
+ F0 a, u- P/ C6 q printf("b is %d\n", buf.b);6 a* O7 Y' D2 H
printf("count is %d\n", buf.packet_cout);
& D8 G* h/ \1 ~% i$ I count_copy = buf.packet_cout;
+ c) V0 N3 R5 a$ P1 ~+ h9 L& f }6 t3 m$ f) T+ c- i# I' U
else& h' R& \- W8 v' V$ A5 J% N" d
{0 O. U/ X+ \. D2 Y' u
printf("No effective message!");
+ O+ n/ p! `7 l+ P7 B }
1 Y' s3 y! w- f- E U) T. D3 W}
2 X. u& }" s: }# N; N* S( ]( q# c7 h+ V6 E: c9 ]0 s+ {
* c% [8 [1 b6 W/ g T$ i! n) L* Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 k4 X3 J }3 Q+ }7 ~: W% Z O, \使用下面代码,对内存使用了mmap函数后:
$ V; A: j( U1 ^+ K- q3 _' D#include <stdio.h>
" O9 f1 ~5 z: k8 Y6 b#include <unistd.h>. F3 [3 ~+ D/ E( C) R$ P5 z3 H# U
#include <sys/mman.h>+ s# L; r* T: l$ t, v* Z2 b4 l
#include <sys/types.h>
0 k m: p% _2 u# V' k7 c#include <fcntl.h>/ g, E, D. p0 i1 E) z& o: Z
( Z# ?, L6 Q/ a3 H1 d#define SHAER_RAM_BASE_ADDR (0x80000000)9 [" Z, t+ m0 ?- Z' I
#define SHAER_RAM_SIZE (0x20000) & X6 n9 D9 w, w8 d8 x+ g
' I9 O4 G ?9 E3 Z% k
typedef struct- R# b9 R! D X( @/ l3 d# Q: o
{
7 I, x4 ^2 w! n3 v& i+ \ unsigned int a;. c& U' w0 ^4 G
unsigned int b;5 T: Q6 t, Z! P. D$ M6 S
unsigned int packet_cout;
. N p0 j; a" c! O% H. c3 D0 S1 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! |4 N0 J3 P- D
: K1 u4 f0 s4 }8 Pvoid read_MSG_buffer(int *baseaddr);
4 V$ E) c( A8 V uunsigned int count_copy = 0;
$ I- \. N; T- ~$ w% R2 j/ d) W$ Z$ g; g. c* Y
int main()
& t6 z, f; a+ D' J{3 m3 \* z3 B" G4 p/ c
int fd;
Q. y7 j; h+ A p" l# H+ e int *mem = NULL;
5 K3 h$ ~/ d6 \& {$ `$ q. s
( r" Z1 d' Q: J3 O% D+ a if((fd = open("/dev/mem", O_RDWR)) <0)$ c9 s5 R; U) H' Z' d* L
{
$ l% e2 j$ W6 y) Y0 k9 u- Z9 _ perror("open error");
% }/ M3 N7 d% b8 |& M P, j return -1;
* H( T. ^+ m- M t0 Q8 b& s }- R( e9 v) |9 v! h0 O
& p, q9 I, f. X6 p
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" ?- V, _4 k% g6 _" [6 U2 K
! A2 M: P, ]8 _ l) l
while(1)
0 N. _ P9 y( d' {1 I1 K {! e' ?* d% x) `$ ?" r7 J- Q
read_MSG_buffer(mem);
+ a: Q5 c- T& N. Y$ B5 U+ a } 0 R; u; u% U, w7 V' E' M
}# S# T. M2 \- ]
, i4 e% }6 Q9 m' `9 t. Hvoid read_MSG_buffer(int *baseaddr)/ |$ t1 ? t# d0 O1 A
{7 U' p9 V) ~2 H, \6 l& n
pRX_MSG_PROTOCOL pshreRAM = NULL;
- b% j& S' _+ q% [; s a2 o- D0 t4 Q$ }6 N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; Z0 z6 X9 V2 {8 s/ @$ V9 b% ~
& J% O- R5 m( @( |# V if(pshreRAM->packet_cout != count_copy)1 H, F) h5 ? t4 n2 U; p
{7 q# L W, j f! c$ y3 e5 c) F4 {
printf("a is %d\n", pshreRAM->a);
3 y3 U3 ~: }" R* l7 u& {7 i0 W1 `+ { printf("b is %d\n", pshreRAM->b);6 T1 m2 {0 p- O' P0 l7 K7 q
printf("count is %d\n", pshreRAM->packet_cout);
/ f( L0 ]+ O9 m1 u. t7 D count_copy = pshreRAM->packet_cout;+ N8 M- b( I) Y1 X) f4 P u
}$ x) T3 x& f' ]$ _" N
else# ?& h* N5 X" G# _
{
4 X/ l! W& y7 e- L2 X printf("No effective message!\n");
' z( R1 q/ d2 q2 `3 y }
# [1 f: H+ C7 y}8 ~( o6 M4 M7 y9 R) ]) j
/ l' R9 v% r4 L8 R4 T2 n$ P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 n$ M# f$ i9 O4 A: O
$ U4 Y! l3 [. v. |$ u6 T2 v3 {1 C2 C! ]5 d# ?
9 o6 Y8 ?* {6 I( M C' N Y. m# D) y' V9 ?7 D6 w0 P
|
|