|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, V9 g# H4 W* `# a& O, W" j J9 ?# V/ p0 d9 @, U3 b1 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) V8 }( ^4 s8 c7 q0 s. v2 M3 q
#include <unistd.h>( r2 Y4 D/ m+ v8 Y
#include <sys/mman.h>2 C! }/ _3 z9 ~# `9 H
#include <sys/types.h>
X8 @( _: f( L#include <fcntl.h>/ t5 ~( ?9 B( z
2 S* x0 r6 G: s! L# N5 H% x2 w v
#define SHAER_RAM_BASE_ADDR (0x80000000) ! `5 e# j& {6 g7 }; g
- u3 }. D8 S* `2 r% k7 m- r! dtypedef struct
% O% v% `7 ^7 h( E' O{* z0 G. o# w, N" J) f; b
unsigned int a;% k E: N* V( {; {# ?2 a2 l
unsigned int b;) @/ O2 m* u- J( x+ p& P
unsigned int packet_cout;
" J" i; u. P3 \* b! p8 p7 K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# @0 C5 m% Z" J8 x
3 s$ q) X8 n1 m' O( @' Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; U9 m' @% f: V9 u7 vunsigned int count_copy = 0;3 E6 N& v# I- B5 `6 q
4 h/ ~% M2 }% h% t
. W% R1 F ^4 Y' P9 S0 F# Wint main()
- Z: P S0 q$ E{, p3 S& `* u1 @+ o2 a' k) h+ G! W3 k* X; w
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 `) H4 f8 E; f6 m1 T# U pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
Z# f: R- W! X+ ?/ ~! E; e' d
$ W7 E4 i4 K1 z& D) t2 q) o1 m while(1)6 }0 E4 X0 p* T, d7 ?
{: ?3 y, i7 u! [# F
read_MSG_buffer(pshreRAM);' h, ~) ^5 ]) w7 h: h p5 N
} ( ^: ^3 H7 T; Y$ Z0 }
}
" V+ h# H9 t" O8 H
* m6 M9 ^( d9 I3 ]- K- a8 I/ Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* o. _5 Q2 j* T$ s/ h. I' L{- g5 K) r M+ `! W3 P
RX_MSG_PROTOCOL buf;2 R- ?0 e& H+ r7 e3 q3 V
2 ]$ o) c5 a* t z0 u$ E buf.a = pshreRAM->a;5 M& c8 q- w: b+ Y
buf.b = pshreRAM->b;
& [+ C# D) J4 W6 a3 o buf.packet_cout = pshreRAM->packet_cout;
/ K/ o/ @5 _2 }; k9 n4 k& U 4 x3 c3 s* O; T* R2 T% C
if(buf.packet_cout != count_copy)
: A' t5 s5 R6 @3 l3 T {
1 w% r7 m) {' T L5 x, G printf("a is %d\n", buf.a);
' S8 ^4 }$ K7 J5 U @8 M2 c printf("b is %d\n", buf.b);2 [+ Z; d% A G. |7 ?! p
printf("count is %d\n", buf.packet_cout);1 }+ p1 d+ W9 m
count_copy = buf.packet_cout;
' K" m4 c0 H1 I/ h+ N! y }0 w1 a+ v/ I0 v l+ X
else
& q: M5 Z% g. B' E, ?4 g {
0 P6 o* x/ O+ E d. z+ M4 ` printf("No effective message!");
7 k! b4 v. H6 _# }7 B+ A }& ?* G. L2 z( y% M
}
+ @5 J/ X+ D: k! e; H: `% ]% p* K# W3 B+ Y7 ]
0 T0 F% y& D+ ^; B. Y: @7 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* d( b3 R7 K w0 m9 O1 c( C
使用下面代码,对内存使用了mmap函数后:' _: K5 ~2 B- e3 S& G
#include <stdio.h>" P) u' ^1 v% K
#include <unistd.h>
$ `$ K: s9 a) v H: u% b#include <sys/mman.h>
6 X4 @6 X# E! g2 V. n#include <sys/types.h>' H# c6 N9 H3 N' f! A
#include <fcntl.h>
' ~) ?5 o5 i1 q! g1 \$ A' b, T8 c8 I9 w. _9 E5 ~8 h& w
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ W- _ g* Q7 k9 ?) {( J#define SHAER_RAM_SIZE (0x20000) 5 B6 g* j. B2 w! @9 M* k/ U
/ U' H2 I. d1 P1 y% B8 t4 L" s9 d5 Ktypedef struct
" P% {! s5 i( }0 j( ]8 [{! @. m0 E/ X; l7 _% B9 t
unsigned int a;
/ |; R- d T2 u1 _0 [ ]5 Z( s unsigned int b;
6 Q& {3 ?$ X6 B$ N& Y unsigned int packet_cout;" L1 X. _% Z6 C8 W) |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 D5 m& |! U2 p2 s
6 @! m, W; ?; `/ ^) O$ \void read_MSG_buffer(int *baseaddr);
+ ]4 _- \% M- |, F0 m- K/ Cunsigned int count_copy = 0;1 N: @' q0 F: _3 n
/ l* w: T9 N8 |$ u: V# ^
int main()6 ?" O2 }! k, s4 L0 f8 }6 W
{. R W- `* o; {+ V2 d% w, \/ a
int fd;
* P. ~8 r/ W1 a; t int *mem = NULL;
" g: [5 c) ~; o2 ]% h& M
% X% |& f: }6 R3 s0 a if((fd = open("/dev/mem", O_RDWR)) <0)/ H8 O' f2 M* w" J9 f
{
) o5 N% c) N* L: t5 ~ G perror("open error");- E7 {' p9 N4 j
return -1;
& P4 A0 A6 \, z S, ]6 ? }2 G2 ^4 M1 o' g/ C9 ~# |& }
# S& p, k( C" ~- [: n( u% Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- \- o7 ?7 V/ c0 |" _8 _! X- ~
. z7 k6 N1 l7 E; P6 e# ~1 S: h
while(1)
& {5 ~" w. {: Q1 G( f* P. G {
) F" [# a/ {) K9 s$ {! q- ? read_MSG_buffer(mem);( g( |8 M0 n8 N" S) k% I# Q
}
; ?1 O) k! D" A( V; g& F' e}' B, `. o% k$ ~& B
- r- F, G; z' B# K( svoid read_MSG_buffer(int *baseaddr)8 a- C3 Y( f" c$ M) h
{
1 L1 a! O4 z9 {9 X& b7 R# e pRX_MSG_PROTOCOL pshreRAM = NULL;
' g! @8 y$ A" o9 O j2 R8 H) ^! b9 B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 C7 g* J2 J3 r0 \/ e& M, c
z4 H; `: p ~) W& J if(pshreRAM->packet_cout != count_copy)
+ r p: j, f% j7 ]0 q {
# {" Q9 y% z5 b) E! L8 N8 x: U printf("a is %d\n", pshreRAM->a);
$ h4 V6 b/ I H- N* e printf("b is %d\n", pshreRAM->b);
6 k( G! r4 X' H7 e0 X9 c printf("count is %d\n", pshreRAM->packet_cout);
' `* ]" q0 B' ~5 H count_copy = pshreRAM->packet_cout;3 S$ A E) ]0 A0 S4 ^
}( \7 f/ V6 Y0 \" l3 ^
else9 p% [. l. }) Q0 F5 U7 A/ @+ G
{
2 q r; e& R" q7 E5 k+ c7 G5 Q+ ` printf("No effective message!\n");
. h' B) f& J- W3 e }
U& [: V1 {& G! k}
! u" I8 Q m( ?
3 I7 h& `7 G& g# i, ]! C m$ I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* G' z/ Y1 e, A
% s% J6 O | ]" u! Z. u/ h
2 q% U: W" r2 @/ e/ T! G, d2 |1 z
' Z \# ?# J/ J7 v3 y9 J/ A/ o0 T8 j( e+ ?9 W
|
|