|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' j2 {& Z% G/ [, w) p7 T# L
: L1 J, X$ z0 c; t1 m4 a- }$ Z4 V9 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: [1 h' l* N7 ~, e7 u6 \, Q* X
#include <unistd.h>
7 c) `( e* f! ^; E* ~# I#include <sys/mman.h>
; ] n$ U! `1 I& L8 N#include <sys/types.h>+ o+ e3 }+ g% g3 e2 ~ K' F! L, \
#include <fcntl.h>
2 M, f9 O/ @" y# A; Q% b9 B2 ?8 r- h& [, H F8 P/ Y& [# ^
#define SHAER_RAM_BASE_ADDR (0x80000000) [/ n4 D4 X* I, |* r. R: P( `
& e- w$ n Y0 J* b" u& E- c: W' l
typedef struct$ q/ P. L# d, K, j7 ?' n- A* s j6 m j9 T
{
3 L' N# T( J% N* `$ o. M unsigned int a;4 C4 q2 D7 z, J
unsigned int b;
6 m7 b& R! X0 G3 _' l( K0 l8 `/ I. P unsigned int packet_cout;% }4 H8 }( W6 C, | b* O/ n5 y- n* b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ p# l! _' z" L0 L6 V( s
( s, E* ^, i5 o2 a @; z9 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) C0 T/ r9 b5 |/ x$ r6 Vunsigned int count_copy = 0;1 p, N+ l/ k% S3 u9 X& h! C
) B0 y. |" z5 C3 H
& G# p6 K8 L W" r( ~& P& N8 L/ _$ k
int main()
1 Z$ d/ z4 @7 s{
" }# ^; b7 X# G- w5 | pRX_MSG_PROTOCOL pshreRAM = NULL;
. y' Z4 _6 q6 F% Q6 I pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ h+ n1 Z( R( V# G% t, e9 \ h3 W( ~6 m0 \6 W
while(1)
: K" ?% i: T1 G1 R/ D/ o {+ `/ h" z* _ v
read_MSG_buffer(pshreRAM);: B. m9 w6 P; S
} 8 S* e0 j* S5 f; e9 X2 I
}
" |4 I8 L: c- h: C) D; M5 j
8 w6 y! U; n+ Y9 X! kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( g' o( I0 z4 T* C5 @
{
, l7 [: @( Y0 K1 l( T, h+ ] RX_MSG_PROTOCOL buf;5 x, X4 Y: R5 u
+ T& i, K& I8 V+ a; q# T
buf.a = pshreRAM->a;
, v0 `/ u) q4 K" ^/ b buf.b = pshreRAM->b;
3 K' `3 x5 E1 K& q/ U; _' c buf.packet_cout = pshreRAM->packet_cout;- K: `# c7 A4 P7 W6 L+ ?
1 H0 f" V& i: `+ X if(buf.packet_cout != count_copy)& {7 Q% U' h8 c
{1 R; P- b, p2 o* [
printf("a is %d\n", buf.a);
* m) T) [+ }3 W3 }6 O. j printf("b is %d\n", buf.b);- C1 y" [+ w% F
printf("count is %d\n", buf.packet_cout);
% y& g* d1 g5 o/ r2 U! o3 g count_copy = buf.packet_cout;$ E( Z: K% D# {3 h7 [0 l% ?
}
9 U; W, }7 _& { else
8 U$ ^* _9 V: j4 s5 }$ x {
& ?1 i) i1 ?0 f' f& N* J. G1 A3 s1 m printf("No effective message!");: ^$ {) S/ K& n+ I! P
}
% h- D- v+ M( w}
' }$ |6 j `3 g5 V, S) o+ [. t, I1 d' z( I
- P% o6 A2 R2 a2 C0 v* f5 q$ a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ ~4 k6 ~9 \& S" S
使用下面代码,对内存使用了mmap函数后:* x/ I' t( k- x% I9 T- x
#include <stdio.h>
0 ] z# \, m1 M" P( k, h4 N* m#include <unistd.h>
+ r0 P$ }1 j4 S#include <sys/mman.h>/ `3 i8 E9 J. e( `. \ h5 U* Q- s
#include <sys/types.h>
7 I( ?5 E& Q+ g5 V% n1 m' e#include <fcntl.h>) f& U& g- d; N) _' j D9 q) Y
+ A8 z6 Q- n2 ?5 I' e#define SHAER_RAM_BASE_ADDR (0x80000000)5 c( t* [6 B, o% u4 P* i- k" t) N
#define SHAER_RAM_SIZE (0x20000) i3 {5 t2 i- _% V( e
) S- k) c0 B! c/ y: A& Stypedef struct) o4 Y* w3 M$ F0 s
{) g) W/ ] y! Y! u- t1 s) D* Y
unsigned int a;7 ?6 r% @2 R9 J- \' `9 e
unsigned int b;
9 h1 r; |$ c+ |3 q. w, E unsigned int packet_cout;
4 v" p$ R& O. {5 j" Z4 o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' l1 @1 n4 u2 I# X, N/ r E s2 h
) W9 E' t4 Q: ]7 Jvoid read_MSG_buffer(int *baseaddr);* E* I4 P, d1 K
unsigned int count_copy = 0;
% a9 ^# U E9 \$ ]/ z/ c- W& h) w
$ G; I0 S9 q4 ]( u$ qint main()
1 V9 S9 i* i, |7 I& s. p2 _; f9 X{0 i+ d) n1 |- e, |' Z
int fd;
# r0 n* ^/ i, m! E% P0 t int *mem = NULL;
, \# X3 o: B( `7 W1 b- a) Q
: }+ E4 d. o! ?& ?% H2 ^" D if((fd = open("/dev/mem", O_RDWR)) <0)" S3 _6 {8 N. I/ N' J
{. i/ K; ?" Q: j3 d5 W
perror("open error");7 A( ~! S4 I0 a: F1 P
return -1;
" Z8 [# o6 V- J- V, s: S- t" @ }( H1 C4 R* M3 N7 v3 h
: Z( P1 {* O( |7 r+ b" E8 o! u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" m' u/ [: ]8 Y$ H/ n
9 i2 _' B" ]. o0 T6 L while(1)& _4 K0 r2 u) M- V! h5 K
{% o: [" r; J- ]
read_MSG_buffer(mem);4 b. M1 k l) `& l6 ~8 c2 R
}
( q4 Z" Q: i& r1 {! A$ k ~, [}
1 l! m. q+ z `) X! l W3 I! d0 V) o/ d$ x
void read_MSG_buffer(int *baseaddr)
+ S6 {2 {0 t8 U6 @. z{( O/ N& o% H7 E/ G' `
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ }7 K; n# |$ O8 z$ ?+ n
+ X2 ]' \1 A2 X4 X" H5 n1 B$ H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; U+ P: p! H# m! @9 {1 l
& }2 z4 O$ T2 m# R3 z7 \6 H
if(pshreRAM->packet_cout != count_copy)! Q+ d9 t( d' |- K* D d. r7 J- Q
{8 z" d, r& z+ T' L
printf("a is %d\n", pshreRAM->a);+ ^/ H, [7 d3 G+ q" B( Q
printf("b is %d\n", pshreRAM->b);
: O$ _. N$ \! f. u printf("count is %d\n", pshreRAM->packet_cout);
+ F! p; Z$ B3 o) G count_copy = pshreRAM->packet_cout;) F2 {6 d- ~4 z' J5 X
}
K( u- C0 i7 n8 { H else0 _$ K) f9 h+ H5 B' u+ _- `4 X
{" x# v& Z: c. ?, g
printf("No effective message!\n");% f1 z, k' j+ C
}
5 f, u, Y/ Z; H7 T) {1 J}
% p) ~/ v2 N+ d D/ ?- t8 E& ]. S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 Z" O- n1 {7 L% W2 j( }
) u( Y; t4 Y/ s
% o# S: l) U5 t# H( g7 P; K3 V! u; S& A8 o2 o6 \- f* K! R
" N/ U: w8 y( U" E: t- d4 v. G
|
|