|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
i" q/ N" {" R% G* \3 \7 j5 N8 o/ n/ Y8 q y& @& V1 p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( A P( J: g0 X$ S6 J' x#include <unistd.h>) d$ ^! Z/ I, N, g, |) D* |
#include <sys/mman.h>; ]8 T& Z3 }( T6 ?9 H
#include <sys/types.h>! N8 h7 N5 I& \& m0 Q8 `
#include <fcntl.h>
i# w" v0 p# F- U& L# \
9 ^2 G" `2 r4 z' _#define SHAER_RAM_BASE_ADDR (0x80000000)
, `1 Q3 p; ^" g1 W1 y! w, N8 R# } b% z' _, I* U+ Z2 Z
typedef struct; G/ N$ I) A6 K1 M" h
{
# e$ ?- K1 U4 @( C unsigned int a;
; W/ W7 G. t! j! N/ ^5 |" F3 e- N. i unsigned int b;
" I' m& d0 t' H1 o, s5 c6 q3 Y unsigned int packet_cout;) }* h/ Z1 k g5 V! @6 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ i8 f0 g' N) u3 ]5 L# r S3 l
1 F0 R% K6 G m& z2 A. S. v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 g( H; b( P/ U3 p- Z' Vunsigned int count_copy = 0;* v; G# |7 G! a% x6 ]7 G0 w
5 A! z- U$ C/ K& Y. i
3 u8 ^- Y" F0 O# ?int main()
# `* r) i1 p' k' B7 P{. s, a7 Y% q% Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
: x0 I' N4 B0 D+ Q0 g0 Z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 ]# j K- G! Q+ t) Y
x- ~' Y3 E1 {. l while(1); A+ v" b9 n8 Q M
{
: b3 \5 P( X F! B read_MSG_buffer(pshreRAM);
+ g( A" t$ y' r* |# A& ` }
% s# v- H7 K# G) }4 m. r: @}
- R( f3 S0 g) Z z
5 R! F8 Y0 z) B8 Q9 P, ?9 Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 a. r$ R' \8 _{
" J, G E9 e2 h) X RX_MSG_PROTOCOL buf;4 d9 p+ T5 Q! u1 e- B
, O/ Z2 b' t: ^; X' [/ i
buf.a = pshreRAM->a;
6 ?# X0 |+ K& R! j& c/ N% I buf.b = pshreRAM->b;7 P( u, a7 p3 F5 n8 H9 f' }
buf.packet_cout = pshreRAM->packet_cout;* P4 {2 Q& j: _. r' P. v
- N) j4 N5 Z8 n8 _- q if(buf.packet_cout != count_copy)9 K8 S+ n; F1 a5 l
{+ m4 p2 d0 x9 O/ O
printf("a is %d\n", buf.a);
) h* O! {+ M/ i1 d printf("b is %d\n", buf.b);
7 _& b& G5 A+ Z# u4 L# s7 k7 `- Y printf("count is %d\n", buf.packet_cout);
* p2 K- N1 D4 r# |! Q, v count_copy = buf.packet_cout;
( w" {- D7 Q9 p1 @4 ]- S }1 d/ N1 Q# _4 O9 ]( W( I
else
6 ]8 T4 M( u# X {8 a& Y1 N+ j2 w% W$ `) ]) q7 `1 G
printf("No effective message!");& n/ l- A7 [0 z! m
}
0 J& i2 Z1 H) R) c2 x; w}
* j, l+ w9 A& H: Y! }+ t& ]
- ~' F8 O3 u3 P
) V, h- Q6 d @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ \" B- w1 i* C8 F使用下面代码,对内存使用了mmap函数后:0 v, C" j# i6 i9 q7 }" H- r
#include <stdio.h>' }5 H3 m5 V5 ~; U1 K" r4 h
#include <unistd.h>
6 V. x* C! Z' k- B# ?. o+ B3 X#include <sys/mman.h>
/ E$ K# f8 w. }* L Q& r5 Q3 v- S#include <sys/types.h>
! b- i' x" C3 s3 [3 ~+ D* b#include <fcntl.h>' V$ V& r/ i, K3 {: }& l
6 q% V, C' T, [#define SHAER_RAM_BASE_ADDR (0x80000000)7 Y$ G) U. K. w& S, ^7 s7 J
#define SHAER_RAM_SIZE (0x20000)
. }/ ]5 b# d8 l6 i4 k: u
( P3 b$ t0 A: D$ ]3 x6 S' H. vtypedef struct
4 B3 [ Q5 R7 H. U4 V{! {; H5 g3 h, y, q1 h( d0 ?( h; i6 l% ?
unsigned int a;1 }. s8 {5 Z; r, C S
unsigned int b;
4 I# |* {8 d$ D y unsigned int packet_cout;9 H! f9 R( D5 G. S3 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- b7 `6 z9 G* o7 H/ G
* V+ N* ]- K# k4 M L: svoid read_MSG_buffer(int *baseaddr);9 D- a1 u8 L6 P; H) N6 a& w# g
unsigned int count_copy = 0;
' M( I1 e+ j0 \0 g* U' f& v& r) v0 [4 o8 T N6 I0 S
int main()
" }, x8 y* @4 S/ t{
, V# [' @ ^$ w8 t, G: C4 Q int fd;
8 b0 X' X' d6 t- B int *mem = NULL;
n; x5 |9 Z. d" f
6 P9 y# i$ s8 J8 l7 {$ I if((fd = open("/dev/mem", O_RDWR)) <0)+ g+ U2 L2 A# t& C/ M6 m) D
{
$ g, a+ l) o4 M" L, x2 | c perror("open error");/ m; x" F0 Q( ~' X
return -1;
# f) |/ ?( [2 `' a0 s! Z8 `1 Q) j) b+ |& ] }
' j9 [9 r) t2 j O
0 m2 N' v, r5 C7 Q9 g mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ {% X8 s! f" R n3 [* v0 {" I/ @& O6 F) U
while(1) w, t5 @* n1 g' I m
{) `) f$ O d, D* a9 x
read_MSG_buffer(mem);* a$ Z. b; s8 V& h5 e; e
}
2 n/ G' L2 t$ B7 r, L8 ^& M! _}
4 o8 @' h; s) `- r7 G$ Z5 ~% |
0 [. O" t/ b+ jvoid read_MSG_buffer(int *baseaddr)
' n: C, E/ T, ?# C2 j; y# M0 ^{+ z5 f3 P+ n# k% S1 B
pRX_MSG_PROTOCOL pshreRAM = NULL;8 A/ ~7 x; {2 l. ?: z0 d, |
. Q4 [" G- @: b& n) T( d Z7 d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; M+ Z1 G1 j( A9 L" ], A
6 P7 K, T# ]1 H. f6 r if(pshreRAM->packet_cout != count_copy)7 k" j% l1 T. t. @# Q* h" q. y
{5 v1 r9 B! |; L1 F/ i/ \
printf("a is %d\n", pshreRAM->a);' L& ~- C: |5 h) T; r
printf("b is %d\n", pshreRAM->b);
/ t& w* ]$ a3 J' s0 { printf("count is %d\n", pshreRAM->packet_cout);
y1 Q; V2 W# ]1 B8 j. Y# {$ w: _7 z1 M- I count_copy = pshreRAM->packet_cout;
' R5 k7 w7 L5 ?$ x8 m }
2 d J- ^; r6 L/ R/ h' f. q else
- e; w1 e4 J6 V7 D2 p, N$ e3 m1 h {0 B# Z( t' P; Y% u2 j
printf("No effective message!\n");
+ S& w2 {$ s+ n4 j6 Y7 ` }: p! Q% C j+ D3 \) x) W& {& _
}) x8 r' _. ?4 K
. ?% C( {( \/ T9 w1 r. g+ R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; k6 j- J7 I/ {, B5 r3 z' U
! `2 {: I* s/ c( W% \2 a
3 l5 i* x6 L1 k b2 v( h1 B& x: X$ f( {0 l. D: S& J0 g
0 C" E8 y7 T* H+ J
|
|