|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ f( _& V8 S- J! e$ a/ N
2 F0 `+ O+ D" l% VOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, h- A% b) \7 ?#include <unistd.h>
& ~& t* ?" L& R2 c6 F#include <sys/mman.h>
$ j* s0 Q, r9 D `1 P#include <sys/types.h>. `* R: D! ]3 e; X j
#include <fcntl.h>
' B+ Y7 L/ \4 u% o$ O
/ k. q3 A7 L# V1 i, }( f y, c) O#define SHAER_RAM_BASE_ADDR (0x80000000)
5 H/ J1 |( C% i. \& k. }/ X/ m* a" e. a* d7 |- P+ v E
typedef struct
+ Z6 G3 o- ]: m, l3 ^0 l6 e{
0 X+ H2 `' ^5 e w, M unsigned int a;
/ D/ n( J+ ?* ?9 e: F" R7 o unsigned int b;' T5 P4 w' M s( @& }
unsigned int packet_cout;5 X$ d3 S) l/ M! ]% S& g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ }7 ?) l, u; K' f+ M
1 c$ ^4 c% {2 n& o5 V- {- F5 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% u7 V8 `5 _$ | ^' \
unsigned int count_copy = 0;
& ?1 O/ ]* x: o/ ^+ _$ N, b& |1 e: m/ D+ V E
, ?) `5 t E) y/ v m2 q
int main()
+ U) f# ]- T: e; x$ T7 f{5 k2 h6 Y7 u9 t" V( Z7 Q& `' B# X
pRX_MSG_PROTOCOL pshreRAM = NULL;
& e1 B8 s9 |( V( W" F0 ^& W pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) {. {$ j/ v h7 K# T
7 A5 B# H0 u3 y2 g/ |/ o. P; F" _9 ?5 i while(1)1 s9 l: g! _$ e2 L& Q- a
{
1 \- H7 Z5 b& e, U2 k8 `3 ~% A2 F read_MSG_buffer(pshreRAM);
+ d2 o% a8 A# } }
1 E% o! Q% O, {& @+ B6 c( H}9 y, y% w l2 z! j7 C9 W2 ^
5 d( N1 y& D0 c0 M/ H: k5 s0 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 r; w/ Y5 {/ q# \& d' `{
' I& Q' o& i n& s RX_MSG_PROTOCOL buf;
8 s( g% m* h4 A* k1 P3 q, P
4 q% l) d4 x4 s0 J( X' p# O3 Y buf.a = pshreRAM->a; h8 k8 X5 y6 U
buf.b = pshreRAM->b;
( u4 S7 _- X( |0 a buf.packet_cout = pshreRAM->packet_cout;
' p+ P4 w7 i$ S" W- J( c
4 q j* L9 |4 g( g; L! n' v( t if(buf.packet_cout != count_copy)
" \5 G1 I/ X0 A7 W% R2 u {; Q- z t0 ~1 a2 @" N1 Y
printf("a is %d\n", buf.a);2 G3 O+ h* T" t# f/ U5 t
printf("b is %d\n", buf.b);5 x# G' \, z0 F; r: k3 y6 }& \ U: U
printf("count is %d\n", buf.packet_cout);/ `5 A' N4 g) k% i$ F- ?7 t. f2 f
count_copy = buf.packet_cout;
8 v: A* J# `7 j3 U) P$ l }
1 `0 n: U7 N; {+ l else' d8 g2 F+ o2 }6 A( y2 n, l
{9 J1 p! e# _' A& f4 {
printf("No effective message!");
% R& x& Z% g2 q. I+ m2 U B }
1 B6 j' w T4 K}* {! f: Q5 o) j& @7 j2 }6 W4 i6 E
3 |& T/ ~2 b1 F% ~$ Y
4 R- S1 x: }0 ^4 o' z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 E9 y0 ~0 M6 ^2 B& V! S
使用下面代码,对内存使用了mmap函数后:
6 B1 t* @( G( ]1 ~8 u#include <stdio.h>( P6 h) {' w' S, K: R
#include <unistd.h>4 A) Q4 H% l6 L0 E* N }% P8 E
#include <sys/mman.h>6 J0 |, _; w# U6 B3 |1 y6 a5 J' T
#include <sys/types.h>9 ` `8 H8 O/ v7 r0 M! |
#include <fcntl.h>
& R! ~, d4 A# `" j, P- k( F' h" ]: T( Z) V4 ~( W9 k: v3 R+ @% ^4 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
' ~6 ]0 ^ @" O2 A/ \; H8 D#define SHAER_RAM_SIZE (0x20000) $ p; D& f$ \3 X1 N. y. G5 l
! c6 K, k s0 ytypedef struct
7 x7 k/ h8 l' w7 L{' h$ M: K' M C
unsigned int a;# {& h4 r4 r% ?. m
unsigned int b;
% }- H0 l8 n) x4 \' S4 s# R+ C unsigned int packet_cout;
# \. I1 K( J8 p( |* o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% i# W4 d7 R# G( o6 E2 J* U* b' Z. p
4 X" i( X( t/ |void read_MSG_buffer(int *baseaddr);, J. n% k6 H2 A# l" ~* w
unsigned int count_copy = 0;3 _2 J7 z- m [$ q
& H2 m' r: S5 N; U4 ~4 n
int main()! c% a% W! ?# F( k ~0 T
{: h h0 Z2 W9 q0 P# u9 p
int fd;: L: w+ A% Y& L: b
int *mem = NULL;
' \8 B' ^& H4 [1 p8 @
3 j* d; T* C7 s8 p0 ?) F0 Z) e1 P if((fd = open("/dev/mem", O_RDWR)) <0)+ C& T6 r! w" b. u% s; Q, `7 C4 g
{
: L* \6 n2 c% N! p perror("open error");- s1 G8 _. A5 u! r/ u
return -1;
2 g8 ]0 V, T4 } }
4 s( w- q5 b( v6 F) t% C7 Q4 b ' j( O/ h4 ?9 i% I- I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 S/ V* f0 y2 ]; D% X' V; ]2 H- f; X
while(1)
7 b& n1 l# j+ d' X+ r. F {: ]3 F7 U( x% ]; F1 l
read_MSG_buffer(mem);
1 c% A8 m0 N- A) n }
# G; M1 k' E8 M( k; X8 C}$ e& C+ f$ }" u( f( o i8 L$ J
& v* C4 Y, b2 O1 H$ u/ x0 q
void read_MSG_buffer(int *baseaddr)
- ~, n0 ]/ o) y$ Q: `3 p3 A6 [{6 N. @; a% b0 o1 j
pRX_MSG_PROTOCOL pshreRAM = NULL;) b6 {6 n/ P$ R* r( w6 p" j
L$ B: d/ B; `/ ]: ? pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 C8 V R2 d9 H, c1 M2 v& K, g
' c3 o- q7 ?: H: P: A9 J& G
if(pshreRAM->packet_cout != count_copy)* F, [4 G/ V" o- Y& l9 e `, j
{
0 X, a4 a) {6 y9 ? printf("a is %d\n", pshreRAM->a);4 O$ n' e2 T. _3 F0 D! j6 t7 m
printf("b is %d\n", pshreRAM->b);
: }- U# |- k2 r" a$ w J printf("count is %d\n", pshreRAM->packet_cout);
# T2 }5 C I4 K$ A4 \& l count_copy = pshreRAM->packet_cout;8 K9 N9 x! K. a8 L
}
( C) R' {- X' n8 u) U% V* D" ` else
- p! B5 }8 B0 I# Q; G8 |, S {) B: W: }4 M+ O$ |" `% g
printf("No effective message!\n");
& f5 e4 C' @0 ]" X, S }0 d, g6 U( v3 E7 J. ^. i
}
1 ~9 [3 d/ r+ V, A/ g
9 g- T" k5 h. F: E; J% k+ E- ?4 @5 t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. P% w$ p( X7 i7 F
& O6 n2 ?( ?0 ~7 w$ `5 L4 `9 L8 n/ r0 F+ Z& c! B
$ e6 @$ u T2 R& c0 I1 W% }2 \: [$ ~- U
|
|