|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- t5 o5 X. W6 V! U* Y5 b6 p! q
( d9 R E; Q9 R4 R, a1 P K6 aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: N* c$ Y1 Z" Q6 ]7 M5 G#include <unistd.h>
5 ?9 ]% y& K& d6 F2 t. i+ U* G& p. l/ z#include <sys/mman.h>
: R2 v- P) d7 R, a# N( e#include <sys/types.h>- U% j6 |% K/ ^3 _/ U! }# G- A
#include <fcntl.h> I( i* `: r1 Q$ E
- _& Y& h% M2 J3 }% |
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ p" e! w+ n8 d, {; H: N1 v" t5 X! v: j; r/ \/ ^( {. }4 E
typedef struct
9 K6 h- T, i* |7 K{4 ~5 a/ H2 H6 n1 N" Z' i
unsigned int a;1 }$ t1 v' k0 f: H4 H; @& L7 n
unsigned int b;
3 L! D( l2 v: i( M4 a unsigned int packet_cout;( ]( B' Y, O2 b9 b: G$ }4 C4 F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 _7 h7 A: K; N! F
! T: M3 ~3 W2 A, C |. Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* h) z7 U. S( \# N5 U3 H. ounsigned int count_copy = 0;
% a5 R- Y$ b5 `
: e& o5 N0 I8 U+ a6 G7 n9 @+ f. H6 ~* c9 o+ r# p: _
int main()4 G R& v) C2 I- \, w
{
6 Y! I& J, n2 M& [ I pRX_MSG_PROTOCOL pshreRAM = NULL;
$ o) s& F, y% a4 u pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; Q& v% {! n5 p0 W7 v5 w' N: v* ^) ~7 g& h# B4 T& i+ ?" X. G+ f
while(1)
2 l4 w! b: y( n {
% b/ G8 b# }* s" C! o5 W/ H read_MSG_buffer(pshreRAM);
8 g) m% B) s; e: y: X1 c5 X } 6 m8 ~! Y& F5 D; D+ Q
}+ c0 |( w! [& G& z. H4 E$ ^* y
r, D1 e6 Z% mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 O2 W/ C W( t, Q& D
{
2 d) z: i" O/ q. M/ ] RX_MSG_PROTOCOL buf;
8 u* R# f& z" k4 D; i8 I( {
3 _( p1 u( t3 T, @7 `2 S$ l buf.a = pshreRAM->a;# }- m( a! m7 ^: u, O
buf.b = pshreRAM->b;
0 K) m* G7 a9 C/ o K buf.packet_cout = pshreRAM->packet_cout;- ^: r# e$ _4 k8 E( e
) v, a6 N5 \3 n# ~2 w( H
if(buf.packet_cout != count_copy)
: ?6 A; R' {, m- B% |) a {3 `8 e) Q* p: K8 {" f
printf("a is %d\n", buf.a); a5 g6 W+ |: b. Y' K9 M3 [
printf("b is %d\n", buf.b);3 Q$ `. i9 N% ~) G; u5 P
printf("count is %d\n", buf.packet_cout);* q! B6 x; J! ^+ ^
count_copy = buf.packet_cout;% }3 Z$ U% r: L6 ]5 [9 p5 d
}( N7 Y1 Q. {1 n) Z5 Q. ]5 _
else, K7 x8 Q& E" e; L; b
{8 g+ |, o; R" e
printf("No effective message!");4 `* r0 I# j, u- L7 h
}
' o8 P3 @5 ~' g( [}
# P( O: N: ^2 C* ~% B- _. R8 R! s# n2 R* J$ Z
7 F1 `3 F' j8 d+ Z5 i- S9 u- W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% m2 F' I* T$ O1 M Y3 e: Q9 b使用下面代码,对内存使用了mmap函数后:
% m/ T1 b& [: ^9 J+ I! E! k3 q#include <stdio.h>: \; B/ X% }% J
#include <unistd.h>* ^ \9 c& s, R. M* a
#include <sys/mman.h>
+ M% }) @% `( [" e. F% q \#include <sys/types.h>
0 I! S, u4 n2 s+ G#include <fcntl.h> ^0 R" ~ |$ x, U2 T, P& D8 @
0 k3 ]' f1 y% f( U, O
#define SHAER_RAM_BASE_ADDR (0x80000000)2 O9 o3 J( ?. ]) t
#define SHAER_RAM_SIZE (0x20000)
. ]- N+ }$ M, o
% L7 W7 _1 N# x' w! Xtypedef struct9 h: ?2 A q% |! T0 I* g
{
+ U: R8 W7 l3 D- k. t unsigned int a;
$ M7 H: `1 |+ [! p" G" E# h5 D unsigned int b;
8 d: K' g U5 _% k& v" _ x) ]$ } unsigned int packet_cout;
: a' E! }6 q2 `1 g3 O% u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: a1 w+ B" L% t" c
Y x c T! x1 ], [* t+ Lvoid read_MSG_buffer(int *baseaddr);$ g- X/ ?& K. w, y
unsigned int count_copy = 0;
" ~ Z1 T5 |1 ]/ ?- X/ Y! E
* f' H5 _; q; @" o" {9 aint main()! I2 ~" G7 F4 a
{8 L) b2 p! N' @: | N( j2 l
int fd;9 L9 Z3 P @+ y+ H
int *mem = NULL;
+ `* p, H% \- F% s6 i: G# Y5 w& h- ^
if((fd = open("/dev/mem", O_RDWR)) <0)2 \6 J. h; S) ]- C/ Q% K, r
{
8 K1 Q* x" C, n6 t perror("open error");+ B7 _' c# ^& U' |% b% P+ m* S* s
return -1;+ j" ]+ o/ A5 J/ _/ z
}8 R) \- M" h: ~. Y/ A
' _/ z6 d9 B8 k# U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 t* x+ e" M6 ]' S( b
& A& m, O# s& g& C4 B
while(1)) V- I1 z9 z' T+ h j. W; c% @+ B, X
{' N. a# @) m! d/ G. e8 G
read_MSG_buffer(mem);
3 b3 k. k9 z1 B) ~, L9 g } 5 K8 ^% \. a \( l
}' S H; {! e, |1 y+ g& P O
2 [8 X+ W- J' p R( Svoid read_MSG_buffer(int *baseaddr)+ b0 X) b( Q# ~- j
{
- f3 C8 V& v: T* U pRX_MSG_PROTOCOL pshreRAM = NULL;
6 g5 R2 \; l9 B! p( v( q) f$ x, c
1 v& B# b' w4 F+ o) S; ^ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; d) {- o0 q# S) R; ^; }
1 u; J5 o5 i! [ if(pshreRAM->packet_cout != count_copy)6 X# R4 \0 K8 ~& Y* c; M
{( Y. P$ z% T6 o/ x
printf("a is %d\n", pshreRAM->a);
) @# c/ X( z# D# k6 x, v, q ~ printf("b is %d\n", pshreRAM->b);
+ s: M( \/ a1 c printf("count is %d\n", pshreRAM->packet_cout);5 d2 c B; x+ y7 r
count_copy = pshreRAM->packet_cout;
8 K' J% `( A. }9 u }( W: A y* e3 o% S, O( p
else. G1 Y1 X# U" r: B6 C- o
{5 M6 W) G! D3 G" D, F
printf("No effective message!\n");( k" Z/ M6 {: C F& i9 t
}
+ y% [8 w2 n. d, j) O% h}( O8 G: P/ [+ v3 `
* d' e, P4 m( t' ]) a% w& P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 `- {: z: `& K# A4 l
" O# O0 [: V" \1 T% ^6 A' o
& C, X4 t( V# y( ~% v% z- M1 @
) s" [- b5 L9 c& o( T' c3 V& \5 Y0 E% ?; L
|
|