|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" K; M" o3 q% z9 K$ X3 d* a& U- }* y; d* m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 f' I9 O( T+ W
#include <unistd.h>* P; `- J0 n. `9 a- v$ A; z# f
#include <sys/mman.h>
s ?& T5 E6 ~#include <sys/types.h>
$ F/ d4 m( [* L9 i8 P, }#include <fcntl.h>
4 Z3 M" C) f4 L( Z& Q, t; C; G; z9 q/ {/ \4 J: W4 \
#define SHAER_RAM_BASE_ADDR (0x80000000)
* ?" S5 e* Y; ~" X2 M8 k' P& N0 _
9 h+ Y9 L6 u9 d1 _* L+ \typedef struct
3 `5 M$ n; s( D$ T) _1 ~{
0 W7 N9 {8 t& l& u unsigned int a;& L; w0 v1 r# r. B7 U; P5 I* B
unsigned int b;
) W7 h0 T) p9 C& a& O. K unsigned int packet_cout;
4 r, X" V$ w* K& d$ w; L: E: x7 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( a, e7 F6 s- Y* K& Q" r/ f3 L$ w' ?8 K P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" F |7 S& O, r8 R5 X+ Munsigned int count_copy = 0;
, u/ K" f! o; O( m9 @! y6 A* X8 t; [- h6 P! V
- d9 ~! s1 }. Q& n
int main()2 \1 M" D q+ V# A8 J: F% g5 s7 z
{
- `+ D$ s9 n5 x4 r8 y. r pRX_MSG_PROTOCOL pshreRAM = NULL;1 h s0 Q/ ^" o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: f* a5 K, z% z" H( z( g, ^; i9 f* c
while(1)
1 c) `' B* [$ @$ \* r {7 B' {, T! ?/ K
read_MSG_buffer(pshreRAM);
7 i0 e' Q9 A0 c+ S. v, F } % l7 i+ S& e! c& b. S) x, w
}0 n$ X; r0 u. Q4 }" c3 Y
- p5 B. N- @& Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 X4 x, v* W! W3 [+ V- `. ?. I{1 I* c% E/ @: W* @, S7 M
RX_MSG_PROTOCOL buf;4 t( H( `' A7 C3 b
8 M% x" Z! g* F# q buf.a = pshreRAM->a;, i& d2 a/ t# N: C s# o
buf.b = pshreRAM->b;- r0 P6 ~; F9 R1 f$ I; y% D
buf.packet_cout = pshreRAM->packet_cout;- A: d( r1 q) {4 Y$ x0 s0 H8 P
l/ d/ E4 E3 I/ x9 n
if(buf.packet_cout != count_copy) P* B2 W" X1 V, ?
{6 Q' c! x( ~: q2 I+ K8 f) g
printf("a is %d\n", buf.a);
$ D: o# H; ~, R3 M: ?' W printf("b is %d\n", buf.b);6 {4 Y6 K( }& ]; G9 t' @
printf("count is %d\n", buf.packet_cout);
1 A: m: H* b2 ?8 @7 ^ count_copy = buf.packet_cout;
% { w7 ], J y# A' c }+ F' G3 v9 }7 I/ R6 O @4 o+ G
else
# G9 ~; o7 t0 p9 ~, J- |3 Y. O {
" a/ t! w+ Z* Z# ?4 p printf("No effective message!"); w4 n1 b( l# f. j- ~1 R4 l$ c9 O
}
( J8 T8 D. `" J/ k# T}
, Z) m' v$ c9 u& z/ h# b4 O0 F4 f
) a! y7 v' ?+ |5 y/ K* a. Z T% F0 z
5 Z5 z; G6 o/ e2 A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
q1 b0 O: k9 O' D' a$ X1 B使用下面代码,对内存使用了mmap函数后:9 O5 C/ E6 @! w7 Q1 X) s6 m
#include <stdio.h>
9 e0 X7 b" e$ G& W1 ]6 X! y#include <unistd.h>/ q- i1 h- [8 y5 @
#include <sys/mman.h>- | C# ?( M8 |+ T4 G
#include <sys/types.h>
( I9 g3 z6 ~5 K# g& S, U2 o#include <fcntl.h>
/ X) } h, Q8 o, {3 ]* B0 i
, p @) |6 i+ r% q5 J. `: p2 g#define SHAER_RAM_BASE_ADDR (0x80000000)# v9 r( x/ J8 p1 z9 s; ]' c
#define SHAER_RAM_SIZE (0x20000)
" V1 G& Z9 |0 m9 U+ {; {4 l/ v6 U0 O/ e% }4 H) c0 L
typedef struct
/ g% _+ M( o$ y! Y{$ |' @" W& A* C5 G/ d6 e1 R
unsigned int a;
+ b8 U! }7 y* t! S& O- l5 W unsigned int b;
' ^2 _3 R, J8 \ unsigned int packet_cout;2 ^0 U q$ t5 G0 M4 n& @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- A2 B$ ?3 L- l* N# P- j
. o1 b4 y( v9 `) r
void read_MSG_buffer(int *baseaddr);
3 P( C3 o6 [5 Bunsigned int count_copy = 0;( n/ P: J1 c, H. X( V5 i
* j" S& x8 ?3 h
int main()
& [; ~2 y& R6 M/ d" q: j{
' q! d6 J0 U) G8 G( V int fd;" f T% b5 P: D# z) B
int *mem = NULL;
' M" h( y G. p5 p# F3 c4 u) n# y6 y( D, E
if((fd = open("/dev/mem", O_RDWR)) <0)
+ [( m" G: J8 m* @! a {
% V& y7 D" D* ?3 P) F6 B( z perror("open error");
9 s/ k" \7 s) ^ y return -1;, w' p! p8 g# m3 j
}
0 I: S! {0 }0 x! H4 u. U1 b4 i$ ^ 0 l7 j# P5 H3 D2 x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 Z z$ A+ B) ]" `. c" @. ]
) j+ w l) ?9 o6 i+ s
while(1)
% L6 e- u6 I8 b J& c {
" ^: k8 m2 e, w' z6 S read_MSG_buffer(mem);
' G) {1 H' y2 \ }
- G5 X4 c4 e5 d: y, Y" E0 y+ j+ ^4 L}
6 l. {- p4 `1 P+ B L$ w4 Y' g9 M6 h: J9 Q! y* Y" ?2 C+ |# p
void read_MSG_buffer(int *baseaddr)
1 a1 M3 `6 \ ~: n8 g{
4 w+ L% n' e7 G* \5 o pRX_MSG_PROTOCOL pshreRAM = NULL;( A: i3 j9 g+ J/ E" ], X% s
8 }9 D' E) L0 U/ O3 \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 F7 j/ U( k+ ?6 h- x: q+ [. M* x% n% f5 A4 W% y
if(pshreRAM->packet_cout != count_copy)- c; R; q; ^0 {. U8 G, Q4 Z
{* `. ? x; f2 A/ q$ @" r& |
printf("a is %d\n", pshreRAM->a);
3 g. f- G* ^4 {7 E printf("b is %d\n", pshreRAM->b);' ]% m! W( z, v' i8 V
printf("count is %d\n", pshreRAM->packet_cout);
+ {" o% ^" J' G1 A# a9 t count_copy = pshreRAM->packet_cout;3 P1 l, u r; k# o6 R. o
}) a' g. S: F% T& g8 F
else
. A& Z1 Y w h; x. ? {/ i' f3 l \8 m7 X
printf("No effective message!\n");
7 X( P6 Y& b1 U3 [' y m }
$ m4 s1 P' V* n" B M5 ]}
, }7 I0 ^& J% S/ [7 A$ a6 B) N3 ^6 q" H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) x- A) S+ ~9 Y4 E9 I0 b% G
/ o1 y: d+ h7 C2 |
# z* y' y- t- T
) V* j3 }( e# o- ~- f* e
/ d1 m; R+ [" Q7 x' M' Z |
|