|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& W8 I; h+ B+ f. t( I' v
' Y2 D: ~6 |$ r9 }9 L5 P: ~$ cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ F& K g- B* B- B- v1 D# h#include <unistd.h>0 S. i l: V, {# X( }
#include <sys/mman.h>7 ~3 S& h j8 ~6 _) b4 I
#include <sys/types.h>$ P# S6 M: Z8 }7 j0 }/ L9 `3 F
#include <fcntl.h>
2 P8 D8 H! \" a/ f4 x& W5 }
# O9 N) l% g$ j#define SHAER_RAM_BASE_ADDR (0x80000000)
: ~4 K( {2 `) ?% B
$ h( V1 y6 N9 i/ p9 g3 Ztypedef struct* q# q2 f( t3 A# H+ e
{9 n) ]# Q/ q: A7 Q9 f' g
unsigned int a;: _2 F5 P* H$ {. R
unsigned int b;; l# L+ c# K* d" K
unsigned int packet_cout;
6 p4 m* Y8 j4 a" ]( P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- M1 o/ p6 Y ?" o* r _, O, N7 A
8 U: q7 l# T% A9 P2 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; {! U9 G# t9 H: f l
unsigned int count_copy = 0;
5 Q' E* z5 }! P0 `: }" Z5 p( p4 ^ W) T9 @+ X, B0 @
9 a& I' r% k+ j0 R* o7 z" ^5 R9 T
int main()
6 k6 I D( g8 @! m{0 {. e; ^4 }5 r1 N
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 k4 H1 h+ V- B% f7 j4 l1 H: M9 Z pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, C6 @1 c3 H) \+ H
1 n, j f f* w- `: |6 t while(1)( p) n* }8 u Q/ l" K
{
- \/ o$ D9 [ H read_MSG_buffer(pshreRAM);) ?0 k# h% Z* W
}
! L$ b+ b% ^/ i7 d f. }6 ]}
3 X" F+ `5 R" G. b. c4 ^" H" x$ u6 t4 m$ L2 @! v2 c5 u; d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 b8 F$ `1 u1 A% m
{. v1 d; ^9 `% C5 P8 ?
RX_MSG_PROTOCOL buf;6 Y9 t7 f8 j# X- V. W$ P1 G8 Z
& c4 |% i$ a+ n( X- a/ V8 f buf.a = pshreRAM->a;
$ `8 @7 z4 T- C: o# T: e buf.b = pshreRAM->b;
8 j# j# k5 a- Y' O6 {: i) o- Y& h buf.packet_cout = pshreRAM->packet_cout;
+ i, g+ ?7 K% i! i; D4 W5 @ 5 m! d' ?. C' }
if(buf.packet_cout != count_copy)
. Q, B @, G/ P% J6 k2 O {% v {( ~8 g# n
printf("a is %d\n", buf.a);
9 N5 Y6 \5 m" [" ^' C printf("b is %d\n", buf.b);1 z @3 R+ [, g1 D5 c/ q8 x/ q5 a
printf("count is %d\n", buf.packet_cout);
: M% l+ K) Z! R: o, S* z y) p, V count_copy = buf.packet_cout;; x' I: @$ `+ {" a$ d+ L7 j* T
}, M* N/ E$ t- f8 }. l8 ~
else
; G# p9 w/ |1 Q! ]4 s {9 f2 e$ h; M7 q
printf("No effective message!");3 J& K( A' R# B5 _3 Z: y3 w- }
}: C1 i1 p% d& m9 l
}, Z4 o" C) U3 l& u9 o
y1 ^9 M2 ?% S& ^0 \
( t& p# Z& k/ ~1 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 V4 M4 r' H/ Y( S" v( y使用下面代码,对内存使用了mmap函数后:1 O9 t1 Z$ m0 y
#include <stdio.h>
: J ^1 D) h2 U#include <unistd.h>7 m! T5 y% ?, H# U
#include <sys/mman.h>
! B2 F# {) d1 E& O" c$ ]7 ]#include <sys/types.h>2 K/ g+ c) C" ~5 t2 n0 k" ]& f3 N9 \
#include <fcntl.h>8 o! L7 F2 z* k2 M, \3 \: c' B+ V. ^
8 C" A1 \7 N3 ^1 C& J! [#define SHAER_RAM_BASE_ADDR (0x80000000)3 @1 A# c! q+ P0 C# P/ `
#define SHAER_RAM_SIZE (0x20000) ; X, f7 y8 w3 z! b
) i8 Q! d ]. _2 N# O- ttypedef struct* F4 T$ [5 Q' G/ _3 p: v$ A
{
( k \2 ?$ X( Q" I' O unsigned int a;% |3 |0 Z1 r. F3 R' D6 o
unsigned int b;5 u4 R/ u: H6 t) Z# n& n
unsigned int packet_cout;3 _# v5 w$ N6 q2 x( {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 @: U$ ^7 Y9 \" g( h0 ]8 k. k# n7 |' ?4 A( ]7 ~
void read_MSG_buffer(int *baseaddr);3 ?8 Q, j+ B/ t7 C& M
unsigned int count_copy = 0;' g, S# t. [# I
; ^8 `) ~/ }4 O* |
int main()
4 I. y# @. Q+ C5 r& e3 Z{
& R7 Z5 I0 f, O3 m7 t7 L; W int fd;! b* |- _" \7 w g/ d( h/ z) z
int *mem = NULL;
4 k5 n/ y, m* z9 U
7 Z5 @2 q; l/ Y/ n if((fd = open("/dev/mem", O_RDWR)) <0)1 ?, j+ n- ^: C& R, f
{) Y) i# k$ G% Z# E: n0 ?, V
perror("open error");
0 C. v3 s' x$ ?4 Z8 x0 g return -1;
- N% n0 v0 r& m5 b0 V1 _4 {) F3 A- ]4 f }
0 Q, y6 ~* a# c: y
0 u8 R$ V& k/ A% U- o1 G mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 Z, m: J' U( U6 B1 A( f2 U( h: ^
7 _! O! a8 R) i" O
while(1)8 |5 O; \5 U! ]: V" Y
{
. b6 p0 E) e' |* P a+ a6 @ read_MSG_buffer(mem);2 ]) r2 V. r' Y: o# f
}
R/ n9 W* V! M0 u}9 x) F" K! u7 E, t- E* C, t1 X- T0 l
! S: H' u+ O. Z& ~/ x0 u V+ j
void read_MSG_buffer(int *baseaddr), g# F" k5 N! h, @% p! o
{
9 F4 y" p1 [1 ]2 i( P pRX_MSG_PROTOCOL pshreRAM = NULL;/ [- P& [- R2 W* H) u
1 x- d# z; _3 ?
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 I; I' @! f/ [& ?
0 L1 v/ d7 ~4 }) g# m
if(pshreRAM->packet_cout != count_copy)% o4 D/ L+ y, f I& p( O( c* I7 G
{
: P( [* U" Q0 A( Q2 ? printf("a is %d\n", pshreRAM->a);
) w. e: p2 g; H9 J8 c6 R printf("b is %d\n", pshreRAM->b);. _/ z' B- D) Y i- {
printf("count is %d\n", pshreRAM->packet_cout);& Z# C' I- W* E$ A4 w$ ~7 j
count_copy = pshreRAM->packet_cout;& X: d* v$ ^% ] g8 R
}
6 X {3 \* ` V else
2 r0 {- h, V( m' l {
( [$ o1 H5 [& K7 Q0 Z# i printf("No effective message!\n");
. Q4 K9 t+ Q3 v& C4 G% V6 i/ F+ A }: |, F, y5 o/ A
}
; z6 w1 W) u1 t: ^: l! M
1 b( @; A$ n' a1 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" V& i' x! g7 L4 C9 L5 O& S! e1 V0 r* h/ q4 {+ h% H/ Y
; _$ `8 w) N8 R4 ^
2 c8 K; s. O8 `* e$ m! N5 O9 H: `# G
5 Q. g3 c) } D, w( ?" l8 u' O |
|