|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * o7 |) K9 q& l Z3 ~; e( j
7 f, K) o3 A1 g+ |% ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* L" f3 N, B$ W8 I* r
#include <unistd.h>
6 ?6 R+ @# f) [$ c" u6 ^2 d& f#include <sys/mman.h>
9 ]( }% @& q+ y9 e$ o#include <sys/types.h>& W# ]8 @, J0 o k
#include <fcntl.h>
- ~4 S& R) ~; O& @
. K6 I" x- N; h/ {) e#define SHAER_RAM_BASE_ADDR (0x80000000) ! ~; S4 u Z+ b' }& x ~* E
6 o2 ?5 p a4 _' ?* H, K! Rtypedef struct$ I0 j' i* I8 d8 ~! m9 T
{" e, K1 s1 j; J1 ^1 r
unsigned int a;
/ q; I/ ?' @# G unsigned int b; A9 T7 ]: C% k: Z7 m% ]3 Y
unsigned int packet_cout;
3 v8 S& I4 V% k# w0 B) G4 x4 l* Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! F& I4 ] G7 a5 T+ P% |( W
5 ?$ z9 V( b# T2 z0 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 ?6 d8 z) A: ^unsigned int count_copy = 0;
5 o% P5 Y% C6 P- D' q
8 E1 N y# Y$ c. n! u, ~# h: }
2 `! c0 Q$ M7 C& p" h" nint main()
4 ]/ ~! }2 B8 R! H' W{
( E. X% i! Y5 L, C pRX_MSG_PROTOCOL pshreRAM = NULL;+ Z; O% F1 `7 F2 J: Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# A5 y1 ~* \% D. F6 k" G
1 W% I. @8 D. b% r+ ^- o
while(1)
! U. [" v5 s; B# `7 X {9 l5 M/ l$ d$ X% O4 q, \/ j
read_MSG_buffer(pshreRAM);3 f @# D3 G4 `+ P2 o; \! x
} 1 }# x8 d3 z" X1 A6 e1 i
}. ~ N2 V/ p5 u) W
- A9 L& x: [) |8 z1 C4 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# g; c% j# Q- x% k6 E) R0 e! t
{' T' F( p5 g- V3 I1 C$ H
RX_MSG_PROTOCOL buf;
3 a- n* r, L# e5 I5 j0 z. v
( x5 ]% D8 E3 j3 r* P- J buf.a = pshreRAM->a;
/ ~9 y$ Z; J$ F _# K buf.b = pshreRAM->b;
9 V0 T2 P( X4 ~& d3 Q- | buf.packet_cout = pshreRAM->packet_cout;
+ B1 B+ k/ P* l
' s* J3 y+ [" {# L- Q, e( ^$ D9 L if(buf.packet_cout != count_copy)
3 I+ t. R4 R& C: D {
+ W; u n! {; E7 | printf("a is %d\n", buf.a);; a+ h$ q% h5 l& g" G
printf("b is %d\n", buf.b);/ f" N! O4 M" f4 D4 |* S
printf("count is %d\n", buf.packet_cout);
+ s4 k$ V8 j8 a$ L count_copy = buf.packet_cout;1 b; O3 P8 \/ O6 j: c6 b6 I6 h( f' c
}
4 R- R0 Y1 R; |- I else6 b+ p |/ q/ B, t0 z% B3 f$ G* a+ X
{
, a) i/ Z! X6 \8 c) s' |# {0 `; h printf("No effective message!");" e9 z6 K$ L& I' l
}1 t5 k9 X9 B, w, R% f/ K0 x! t& U
}
1 y) k5 s% h* b* n% N0 }( g' T
) y8 M! o; P6 B% q' _3 t6 G! |7 B9 C& P% l2 e* R! K5 _6 T* O. D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& k# d8 m6 _8 J4 ^- r1 }: k使用下面代码,对内存使用了mmap函数后:* E, g2 U- V ?3 n2 L
#include <stdio.h>0 U2 v0 l1 Y/ h
#include <unistd.h>
I. `3 l+ o2 ?% g2 o#include <sys/mman.h>/ c& \; E3 D+ {. o
#include <sys/types.h>* T: O/ B/ S: ~8 G* [- n3 r
#include <fcntl.h>
7 ~7 {3 f8 B; X" G" a* _1 }! z2 C7 z5 B# w" ~$ `: I/ W
#define SHAER_RAM_BASE_ADDR (0x80000000)5 M- Y7 x0 Q. F8 |$ x' l! r5 _
#define SHAER_RAM_SIZE (0x20000) ' s# n/ T8 G0 L! \
s( A/ O" V+ t3 U) H: utypedef struct
; _- E# A; ]+ y9 O$ Y5 r: }{
( M2 `7 l K) _9 V3 c unsigned int a;' }. Y1 H' v! o/ \3 k7 |
unsigned int b;+ v( ~1 }5 `* M% l5 ~
unsigned int packet_cout;
! I z/ M1 Z# M# b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 m- m. q! T- o) y' p* j) r
0 W5 n; m# V V5 u' Q
void read_MSG_buffer(int *baseaddr);; Q+ q. ^/ W' J' s% x* l# T
unsigned int count_copy = 0;. X3 ?3 z8 z2 @) W! E% W# r
9 V o& Q$ o( {( m+ Q# T
int main()- A- r* Z6 A6 X: S% x" C! E _
{+ ^) L# ~" J6 d, X
int fd; M* T, }( N0 O. v; r0 z2 l
int *mem = NULL;0 K) D; Z ?, A* S& z
% U" o! d1 z- h; l+ w if((fd = open("/dev/mem", O_RDWR)) <0)
5 F( R/ O' v( `* l- W {
: }- D* v% g% y1 N3 W perror("open error");
0 e; [ Q9 x3 O; H return -1;9 _, H$ L# s2 j% k' e0 c3 M
}3 O2 v' d4 g, m0 r" }7 w6 b
& f6 j. _: k( S$ |% z& Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 _( m/ `$ |" D7 h4 x
- n, D) @8 j( k3 h2 b( X while(1)
, X/ _" R7 a$ U' k {+ ~1 H; R! F% h! M: z
read_MSG_buffer(mem);
! I9 i- _) l9 m } 7 y6 o# X+ Q0 h7 R/ O% Y. }) o
}# ` C% o: K0 z/ c9 h0 A
! |! D, ?' F% Ovoid read_MSG_buffer(int *baseaddr)
; f/ Q) ^- S- d v8 A* I( B/ J{
e% D9 o4 q, h pRX_MSG_PROTOCOL pshreRAM = NULL;
3 L$ s% n$ ]+ {* j2 v% \. ?$ j- |( }# H4 G/ [" x) E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* {" M* V2 ~! l, I8 I \
2 t2 @. j0 Q3 ?- `& s* ` if(pshreRAM->packet_cout != count_copy)$ e0 `! S9 O2 B1 M
{
6 U4 ^" ^) F. {& F, x; O4 E printf("a is %d\n", pshreRAM->a);5 v& t: _8 C1 D. L$ w: ~
printf("b is %d\n", pshreRAM->b);
1 W( V6 [4 Q. }& b I: M; c5 V printf("count is %d\n", pshreRAM->packet_cout);9 l7 _) Z" H9 n8 x8 b X I8 P
count_copy = pshreRAM->packet_cout;
0 ~! t5 l) [# }. \6 ^ }% G' t4 [: y: S
else" e! Y% Q( ^ j+ c' ~
{
7 ?# E+ J3 g) x' }2 T. j printf("No effective message!\n");4 E: c3 v6 x Z' ?$ N, v5 p% V
}0 ]& i0 m% k: H: K
}$ Z; }% Y: }" Z; N+ i
+ S% q* X3 X' {, L; z" M/ F3 J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: h, ]& @/ h1 q0 k
* M0 I5 ~* r9 L4 W4 d$ }+ h
; t* I* R; }( C' |
" }* V: z. }% T- s
* N% K" o9 s% z, k+ }4 z: ` |
|