|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : v4 a5 G* X+ t: H, Q* P. E& V5 y: L
0 n: k' [: }3 K7 f' d4 F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) F8 T6 F& M. b# q y, Y& @5 _#include <unistd.h># R- C2 B/ a7 w( E6 e
#include <sys/mman.h>+ v( E0 Q: N- h/ Y
#include <sys/types.h>5 \7 w, N+ t1 @ f% M6 }
#include <fcntl.h>' Q: X* O, I) b
5 l7 S) T4 I3 D
#define SHAER_RAM_BASE_ADDR (0x80000000) : `# M. L; S& l/ o5 v' J3 A
1 u" E" \' m& p9 z/ mtypedef struct
) D. F$ D1 I. B8 A& }: [8 H{; S, A- l3 _, v: O& ^1 u6 [ d. x1 [( u
unsigned int a;
% T. V* F% D3 s/ \ unsigned int b;7 C3 P W- r( K X
unsigned int packet_cout;( G% h, a8 P; z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 P( ~# ]# z. Z- v0 n6 z8 ^: C# g
* V& n7 ?7 k& S( L- k' q1 N& V( Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 L/ U7 G9 H# H5 L( j- v
unsigned int count_copy = 0;7 K& p, }+ i7 ?4 W
: E0 ]8 W$ z% ^( r! b5 `( G' T) B7 [9 a9 T& l
int main()$ n) e' G1 }$ O" y2 j o
{; e/ {% I6 R1 l1 i. [
pRX_MSG_PROTOCOL pshreRAM = NULL;
* ?) E6 v2 S8 B: u6 Z z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ j" E: M6 G: ~- o3 S
" l' g* p& g' K; A# N; ~! Y& {2 ~ while(1)3 a) x0 Q& x' s' w ~
{
7 q j1 u, u. h8 W0 Z" q8 p read_MSG_buffer(pshreRAM);0 m ]* Y/ {! n6 K. F$ ~
}
, h9 ?$ O) M" z5 y8 ]}
4 n6 \. C3 l5 {% D9 g$ P$ {" K3 ?3 a+ |5 N' ?0 e" a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 x" ?9 p, e, L, q, S$ O8 w' \
{
* o* u7 [/ o/ q" i" b/ y) C# i P) h L RX_MSG_PROTOCOL buf;
# l$ E8 \/ c1 A* r* Q. w
& T: P4 }& ?. B, c& r2 W* I6 ^ buf.a = pshreRAM->a;
m4 p2 d7 Y! ]6 r2 H# N buf.b = pshreRAM->b;
; l' C+ G" i( j) I+ J q n7 I) D( h buf.packet_cout = pshreRAM->packet_cout;
% g6 G+ [0 b+ u9 i" S3 }: d) D8 h
* s) ^9 P; \( w" q7 @$ R7 z' w! ]1 { if(buf.packet_cout != count_copy)
# ?2 K9 h) s# m; L* I {
( r% s# K6 o& G6 t( g printf("a is %d\n", buf.a);
: W' ~* ?4 N6 N& T8 T% m printf("b is %d\n", buf.b);! T0 ^- p$ e6 j, C7 _+ H0 J3 {
printf("count is %d\n", buf.packet_cout);# B- K0 U& E& B0 Y- x% J
count_copy = buf.packet_cout;1 L/ M3 `) H6 |$ G
}
8 {) s" R% q5 p else- H: ^" j7 t# o. X* U
{
" k3 e3 b) o7 C$ j printf("No effective message!");
; I! B) k! P/ @9 v }
$ w7 W+ l$ `! Z. o}
9 s" f1 F) F2 H. O
6 _- `% }/ Q+ |6 b5 i" l' F" S; [
% Y( L4 r( S# N! M8 w1 F/ E: W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ Q$ [) Q7 J, y3 m3 E6 F4 V
使用下面代码,对内存使用了mmap函数后:
' }6 p {5 n5 a, T" e' Q. h#include <stdio.h>* {6 Z4 L5 a- E( M+ ]$ V) c
#include <unistd.h>4 \2 i9 W% z0 `4 f! o! |
#include <sys/mman.h>
6 `% \# P2 C4 @* h. m- \% l9 M#include <sys/types.h>
2 T! T8 I) ]3 n, y#include <fcntl.h>3 [8 D" V8 N: y: o/ q: u: l6 K
# C' K' H5 F. ]#define SHAER_RAM_BASE_ADDR (0x80000000)
O H$ t+ K: s8 [9 L0 |#define SHAER_RAM_SIZE (0x20000)
6 ], V) U( Z2 U- W7 A' h; M$ W% O
: [- p5 Y4 L/ s; j1 Qtypedef struct9 v j5 r$ N- W
{
8 P% K! P0 e% S unsigned int a;
& P; h# N" G+ d$ R0 j( [0 K- X unsigned int b;/ p- s, h- N4 j$ P2 V
unsigned int packet_cout;
# ^1 Y# {# z! h3 z: e0 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, \8 k; M/ Q/ L# |6 |
, b5 @: }) P9 b5 N
void read_MSG_buffer(int *baseaddr);& H; g, r2 o/ e% K7 h
unsigned int count_copy = 0;
; d/ Z2 j! J: @/ {
& E. ^$ F+ H4 U$ k/ H1 p% Y0 |int main()1 V1 T5 [* X5 G
{# V3 z0 z$ G/ \. G5 K. G$ A f+ Z# T
int fd;/ X: A! u& O! V! p
int *mem = NULL;( N0 b6 T x3 @/ e
1 g2 w3 n }* k8 G2 ^, D. H if((fd = open("/dev/mem", O_RDWR)) <0)( i# j g$ R! S, B1 j
{. B9 Q3 c" o5 g$ e$ x
perror("open error");0 ^' _) u" @2 e, c
return -1;
( S0 G0 Z: q2 u7 l }: O( ?1 x( z, ]
9 M( }' b3 b G( Y' \4 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 N5 @* n. [" @8 b" W
' X! s% i: K" F( o; v( M while(1). G( x6 p9 B& [( g r& r; x+ t/ g2 s
{' o/ l/ j* P+ v+ u1 G$ B
read_MSG_buffer(mem);9 _3 r# v: R* E6 w2 C
}
2 d3 b& s' M& Y$ p# h}5 y7 E: N: L, C$ m1 l6 Y: U) |' q; v0 j3 M
* _2 Q1 ~3 ~, m* h `4 I B
void read_MSG_buffer(int *baseaddr)! \, e$ m0 ]% n! F
{& c4 d( S. }, F# d D
pRX_MSG_PROTOCOL pshreRAM = NULL;
* h2 l, R' I" n% `8 Y1 h! z# p/ [1 S4 L- Z7 K# l* ?4 [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' X! v# f* l7 j$ [9 \
9 M% W' G- d4 T: a if(pshreRAM->packet_cout != count_copy)$ e: c. s! d* X
{% n# r; Q' _5 m$ i$ ~) M
printf("a is %d\n", pshreRAM->a);
0 E, v1 y1 J1 d5 [ printf("b is %d\n", pshreRAM->b);
0 P" A" u6 @8 ? printf("count is %d\n", pshreRAM->packet_cout);8 W& q5 |; O# ~ H# V# [- [- ^' ~' j1 j2 S
count_copy = pshreRAM->packet_cout;* g2 y) \* H6 J& q6 b& A
}9 k+ V( |% D/ k5 e
else# B1 }/ V2 w1 L, T
{3 I5 j: Z" x/ } w: g5 M
printf("No effective message!\n");
% X' y" n( h* l& A }
! Z& q: T, H2 u- Y9 x6 q' p}/ ^4 o( p/ T* j" Z8 d. ~
) |+ s+ ?: r2 ]% O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; t7 |7 ~6 X2 J4 U6 P, t9 \9 R$ U" p" M) A" a, Z, l6 [
) ~9 M! p6 @# r8 K# R
! K7 P+ t6 w7 @9 s# ~
W: X- B& s9 [- v
|
|