|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: N* I8 x9 z; C3 F3 r; \
+ [# s& Z, X- t6 d* P/ j( g! C0 fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 M0 H& H! X) r( M; b, d#include <unistd.h>5 [' V/ }! e( R7 t& c4 {7 d- L1 m
#include <sys/mman.h>
( _9 v% o# P. s Q#include <sys/types.h>
" d4 S; h% u! j' ?6 H2 ]" i#include <fcntl.h>
4 s- Q* Q0 y; _8 Y+ i2 S4 l8 l5 ^$ M5 c
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 b! F8 d3 T/ T3 ]& z7 t+ B" h3 L8 @5 }/ |1 K1 A- O' Y
typedef struct g. g; a' Y+ ^1 U+ g( Y& z: _# J
{
& x# O \; L; U1 {0 A' ~! a unsigned int a;
) Z; F* w* a3 t- v0 L2 f- M unsigned int b;/ y& F: B& E: B" x9 G% i. F
unsigned int packet_cout;) H% `/ o. ]4 B- J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 L: ]4 p8 F# l. o; {+ C
5 H! u) O' F# C: G+ d/ b( hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 T) [# Q1 \% l" H$ G% [$ |, g' X
unsigned int count_copy = 0;
' M% @( J0 A4 p$ e: W/ T* P e$ `* p$ R' t d p. g
' T, G0 A) m6 R3 ^, V
int main()
+ B+ i4 X; D! _) m' j/ L$ r$ C{
9 a, ~) a% ~2 H! v5 O% h. K+ t5 |9 O pRX_MSG_PROTOCOL pshreRAM = NULL;3 C k" I2 U& _9 [* _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, H8 `* m/ [7 l7 K; o) o5 U6 R4 A4 a2 q
while(1)
9 U$ h6 u" s9 n" \7 K {5 V5 `6 X/ }7 R: C' }) x
read_MSG_buffer(pshreRAM);
. ~: P1 r3 A0 Q" h' F) Q }
- L4 X6 ?1 |5 A6 c/ y2 W) m}
$ a& a- \ b0 k/ J/ A: s
7 ~0 ~ z& n1 M! gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. W0 s; w' n0 n) m8 _1 O8 X{5 I# \. L( m, B, ^! z3 m
RX_MSG_PROTOCOL buf;% F8 l7 f2 t' m$ A. r' v( f: q
8 M7 L" ]& }, E( s) B* H t
buf.a = pshreRAM->a;
3 K3 w& }" c! N& i! g- C, l buf.b = pshreRAM->b;, [# y X9 C' T0 S% i
buf.packet_cout = pshreRAM->packet_cout;
+ R, {) Z& P- J$ W @ 9 N5 O4 r) s' ]' K# [ e
if(buf.packet_cout != count_copy)
1 G0 w% e) o8 v8 {- F {
M$ k% f* M7 n; v# ~) X4 d7 n printf("a is %d\n", buf.a);& r$ N- R7 |# m q, b2 ^( X
printf("b is %d\n", buf.b);! V5 t. ?9 |1 j/ Q$ ]- U
printf("count is %d\n", buf.packet_cout);( |/ }7 @ r" W) f" R6 I' I0 N
count_copy = buf.packet_cout;/ j, `/ `3 a# Y5 @9 I. w' u
}
: q- ^+ N @- I0 g' g5 H else
# K# Z+ v& I# v9 p9 s {
7 l. U" e9 N: F0 x4 y printf("No effective message!");! d9 b0 P# w8 X F$ E$ ~
}
3 c6 ^7 l& e3 J}2 K' ]. G' h" w" x# B+ b" A
0 m- N6 y$ y! T& w) w, p7 L3 k
! ^9 T: }% |- W) t9 u9 p3 E; V但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 O+ l0 w. B9 P4 T/ J
使用下面代码,对内存使用了mmap函数后:
$ y+ D& ~$ \+ O/ {7 }#include <stdio.h>
/ P3 k8 _/ K9 N, t- c#include <unistd.h>
* H6 j; v$ V/ v/ t2 d7 j#include <sys/mman.h>
3 z# B1 O: \. u3 W+ B. R+ M" C#include <sys/types.h>9 A6 E4 z; b( Z$ o' W! R( `# H9 C
#include <fcntl.h>
U8 S' J. q& a6 U3 x; N" L: D# D& s: e' S9 r5 \
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 p$ j% x( k2 `#define SHAER_RAM_SIZE (0x20000) - Q% h& ?: o5 o( m- S2 l
. a @0 L0 W) E$ W/ O+ F! otypedef struct
! j; V" J' c c{
, ^* c ?7 D: B' q0 G( l unsigned int a;
O6 D, t b1 i! [0 P' ~! Z! A. }) I, i unsigned int b;
3 p2 i) J# t- o: T6 E! B. I8 U- D: n unsigned int packet_cout;1 Y+ H/ a( \+ {4 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- X6 \+ X) x* Z/ J9 ~; g# l- [- l2 X" T- m
void read_MSG_buffer(int *baseaddr);. y" |: {. g/ g, s {
unsigned int count_copy = 0;6 k( f- i9 D9 \0 ^& b/ y
, Z8 l K( f% i9 L7 i/ z
int main()! K( `! b6 T0 O0 q: R+ X6 h% W( D, z
{
3 |$ X$ H3 n X1 t. K* J int fd;. y4 F9 |+ `) s# ^6 S" }# Z
int *mem = NULL;
1 q8 J% w/ V, s6 W" Y5 H
/ n7 j8 e7 _- b if((fd = open("/dev/mem", O_RDWR)) <0)" s8 z2 u! U' w0 B* J1 w. o
{
% k5 o5 g$ J) t& D! ]0 s# h! c8 ~; M perror("open error");! g; H4 {6 x7 ?+ c5 y8 K
return -1;' v6 i! P( h! L. W
}4 e' S5 X( K: j( W4 {
0 d9 p# `+ c# R) H mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 Z' k& ]' C, Q* f0 P0 n- i3 I
0 v8 U$ W; Q R( ~6 H
while(1)
8 F% V* |' N9 a8 x9 I9 b5 U9 E {# V$ @* q6 H) F( K2 q" e$ X
read_MSG_buffer(mem);: m$ g) j+ [$ T Y8 v: _# ?9 s
}
. t& [$ J# \# \}
. K; O* t( a: [1 E5 _2 F5 O/ F: ~' _0 @ \1 A9 e+ {
void read_MSG_buffer(int *baseaddr)% _0 N/ m' K, q1 W
{# Q# c5 S0 @+ N
pRX_MSG_PROTOCOL pshreRAM = NULL;4 |/ D% B% v }$ `: Z& R% P
8 }0 i6 k* [" R1 p pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! P8 j" R+ G6 x
. f7 _1 W. v4 y if(pshreRAM->packet_cout != count_copy)
2 y; \9 p: t! e% n2 D {% `" a! g. q/ ]* Z$ g
printf("a is %d\n", pshreRAM->a);8 d4 |' ]8 y* U) {$ T: k
printf("b is %d\n", pshreRAM->b);- A* E# J9 `; Z) t" B
printf("count is %d\n", pshreRAM->packet_cout);" L. ~+ l6 ^) V n, c
count_copy = pshreRAM->packet_cout;
) ^& v5 n4 L$ e0 B) g; | }
) s5 u* s, k( _, Q% h' a8 k else$ e/ d: q5 C, k- z
{, L5 \1 z8 D( b
printf("No effective message!\n");: o- Y$ R8 b- }3 q8 Q. e' E
}
# @3 E' h" G4 l( C}
/ g/ G* o8 A* T7 \0 }) L, N& r) m) y9 C U i2 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' I0 K; p- a' f) @
+ _: H& N2 K! R+ _$ j7 i0 }/ K9 a$ b8 }
4 t3 ]- F6 }# |+ [; p% }( b# A* \5 e3 F( c
|
|