|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* A; q/ z4 b2 L" E: @# k. W$ `; F6 F' K; E- R9 C. e+ ]( `% B! x2 ^/ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( ]/ S- S7 \; \! b o+ N1 J, m#include <unistd.h>3 e' B" r- D5 e5 b
#include <sys/mman.h>" C0 C, D* K% r
#include <sys/types.h>
- v) V% |; a' U! ^, o3 y#include <fcntl.h>
/ k1 e( M q1 l) T7 I& H i! T4 K. [; z! ^7 T" a0 C- c
#define SHAER_RAM_BASE_ADDR (0x80000000)
: \- C3 k; l- ?/ j( N/ o$ {$ I
& k) o* K0 Q8 W: V. P; m6 Dtypedef struct
6 W B* ^& f0 i4 R, K! E h5 z' U{
( C) \, N/ A- U unsigned int a;
2 ]' d+ [/ C: G- W7 w' P, [0 W unsigned int b;
) y' o" a* ]/ P3 [/ s* w unsigned int packet_cout;7 Q* e% L% V* m4 Q9 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 ]/ A1 i6 B0 c0 ^3 j7 J* H
8 n2 a1 K. v' m9 N4 N- c. Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. U* ^ V: q% I( @unsigned int count_copy = 0;
3 A, K5 w, d4 X1 a7 ` O( k9 p2 Q9 M
9 s$ o, Y. y6 j1 `+ I6 e D- jint main()
; ]+ M1 X% j3 s{' |! g8 C$ i5 A: N* W1 @# `
pRX_MSG_PROTOCOL pshreRAM = NULL;- o+ ]5 F4 r2 o8 o. w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* V, b8 A4 x, c0 ?* U5 P
8 y. [2 l7 H- u, B/ _ while(1)
* k: U% {; p( @# v {
! x: M6 g$ Z& h4 u3 @) h, j% t# } read_MSG_buffer(pshreRAM);
: Z8 Q# d+ V m# j. y; @ }
3 S8 I* c- Q' V5 K0 `}* R- Y) ~# V, R( D; e, |$ v8 G6 V
( Z' O4 f# j8 V8 R7 Z7 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): q" I4 u! C+ t
{
) l. m& |9 z' \& N, Z; _" V. k RX_MSG_PROTOCOL buf;3 v. u" X7 X" Q ^% C. c" N( a
9 H3 G; I. i, _% ^! ^/ ~/ N
buf.a = pshreRAM->a;
7 y# }" t9 B' J# S, g8 l buf.b = pshreRAM->b;
9 v, e# O D8 G8 G9 P3 m buf.packet_cout = pshreRAM->packet_cout;
3 m$ l( Y. l% s" x ?1 I2 ] ) ?1 S% D& v4 J* }8 a6 A; O
if(buf.packet_cout != count_copy)3 x1 K' J& A0 o( l# A8 }( S; {
{1 k: Z8 K2 P0 T+ {% e4 _* ? {9 x ~
printf("a is %d\n", buf.a);
- I y( }3 L( P* ^ printf("b is %d\n", buf.b);
, b) f) l2 U/ v* A printf("count is %d\n", buf.packet_cout);
3 F& |) |. _7 o count_copy = buf.packet_cout;
+ ~" }# Y0 R; W/ `, I; }. h }
0 }: s2 [8 p Y: @6 m6 j& M else
. X6 D% ?( l) s/ Z8 h {" r5 o/ k0 T8 F7 z
printf("No effective message!");
' A, `4 I1 y# H }
1 s3 N+ c3 |* ^' N2 c; w3 S" f" n}8 g# j* r# M: X' I' H1 u' P
# M! ?* e1 r; I2 F) ?3 {
8 \% D0 O) I; @) E9 P. E: w( Z* s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( |) H3 d7 v$ P: h; S. Q( v0 L9 X
使用下面代码,对内存使用了mmap函数后:; U$ |4 |+ a% ^$ }8 Z: Y7 I( L3 @
#include <stdio.h>$ }+ h( E0 w+ m1 t4 q; \
#include <unistd.h>
: z! _% \4 z! V. h#include <sys/mman.h>4 g" L/ E P; }$ R& J& ^+ e
#include <sys/types.h>
& a, y% c8 n" n#include <fcntl.h>
0 \* Q4 o+ X3 |* E: W
# n7 }6 y( X" P" }' T#define SHAER_RAM_BASE_ADDR (0x80000000)
5 Y' L8 t; K: K/ U#define SHAER_RAM_SIZE (0x20000) # v$ y5 V3 H/ M5 w$ @' ]% w" X
8 q" o: \+ U p. U7 K2 b5 g& p
typedef struct7 p x7 p. h# h u! _0 [
{: B. c4 Z# [" h! G# u% g/ c& o
unsigned int a;7 ?$ \5 T1 j/ y& Y! _ \$ _. w
unsigned int b;5 F% c" Q2 r" i$ w1 v; k6 R6 {
unsigned int packet_cout;
; D) F/ `0 G# x) f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. r1 I2 w1 ?$ q: s; W
" i0 s, o2 Z( Y9 T w' V( \# d7 y
void read_MSG_buffer(int *baseaddr);
# |: x' i7 d7 Q5 S) e5 q# iunsigned int count_copy = 0;- N n& x$ V( f; I# @) N
. J) n6 b7 O# fint main()4 N* B. d4 B! j2 y Y, H, {
{
; y; S0 [0 s S+ O& P int fd;
0 @+ G9 M3 O+ Q int *mem = NULL;8 _$ M8 ] Y3 W! z
1 N# x& Y& m% S8 w if((fd = open("/dev/mem", O_RDWR)) <0)
' H5 ]: y( b6 s0 {, ] {
! r% Y; D$ E: ~ perror("open error");& U6 ]; `" Y- ~) d X- |' C
return -1;, c& C( }# ^5 {0 |: s9 r
}9 i( H9 J8 w; F Y
' a7 K* Q# d3 C/ W0 N
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 W0 d. Z5 W( ~! [9 @, b' `% J
% \" }6 Q7 Y; A- m
while(1)* j+ d4 n; T8 ?* e3 a# @
{/ G7 @5 f1 s2 e6 F7 ]# Z
read_MSG_buffer(mem);6 B f$ A) u |
}
& Y, O6 |9 U) {6 k2 v' e3 G& u}
' b7 A4 A& L c' ?4 @* _
f4 h5 `' `2 K5 D% [4 ?: V, ^2 Svoid read_MSG_buffer(int *baseaddr)8 I" J8 L* @8 E8 S
{0 T0 i0 |+ s! J* h y3 x4 i" I, x
pRX_MSG_PROTOCOL pshreRAM = NULL;: i0 h- b5 c2 `1 Q; R: h& L& K8 J) J
' B0 i7 r, E+ y: J9 o1 g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. a6 E/ e1 b( P0 X3 H/ P8 W: B6 X/ D
& p; s/ J3 P2 |+ G% y; V8 }0 Y if(pshreRAM->packet_cout != count_copy)& Z, N4 I8 O' n7 B* i# L5 E
{) d4 q& A! J' b; w1 ~
printf("a is %d\n", pshreRAM->a);
8 ~9 e \: k! @) B# l printf("b is %d\n", pshreRAM->b);
! U0 O3 E: P% }" r printf("count is %d\n", pshreRAM->packet_cout);% o; q' P2 C: X% Y1 ?/ N, J
count_copy = pshreRAM->packet_cout;
7 {6 l1 D; U4 e0 k& c& g8 [! g }$ M! o3 Y; o. ]: N- ?
else$ { @' e4 }$ s- p- p
{
c7 P0 I, x) D2 ~) L1 [0 u printf("No effective message!\n");' b* x* |; {+ v7 n4 m" b# q; j6 m
}3 @7 |1 k/ K2 {, ~" E! J* L
}% D5 f* i/ s: f3 L5 @' C2 {+ i, a
6 o$ j; `' v) m( Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 s3 w' q- y# p: k
$ m9 W2 z: f w* V3 T4 u* h) y
, M9 w0 J7 Y: l+ r. @
1 u, I, o' C7 J% k; G2 y* f/ H7 K2 ]% X" e4 A6 r$ m
|
|