|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" v8 E' d$ U" _# k; F' e. F" N
. c/ a! C/ U0 f6 G0 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 o- k1 q, S# h+ m0 v3 F, {- Q
#include <unistd.h>6 }2 d7 F3 Q- I# Q/ w; v4 A: [
#include <sys/mman.h>& w7 o" r: h7 k" I
#include <sys/types.h>) a- w: w$ D) L! O) o3 B _. T
#include <fcntl.h>0 b* |" ]) v. d9 a# `
4 R- d `* r* V' ?* j#define SHAER_RAM_BASE_ADDR (0x80000000)
3 u* t0 P1 @, g$ I! A4 i' E! E/ X* L$ ^, B" [
typedef struct) R& S- t D$ k
{
* Z9 S: Z3 g0 H" ^ unsigned int a;
! a8 R; Q+ d7 }9 c% ` unsigned int b;' h' Q0 Q, f1 v, K; ^' `4 K0 ~& V
unsigned int packet_cout;
3 X. M* h' T. b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( F# `- Q3 s3 c7 ~
% j' @2 o R( s+ vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; ^ W$ `" g0 S( P) O( ^8 C" N
unsigned int count_copy = 0;
6 V5 `9 S% N. e) Z+ N" m
% _$ Q; q) k! R) }4 \6 ?/ |! d* P. z; ]' {
int main()' y3 R! G9 g; r! M! w }
{7 U6 s/ u# s2 ^+ |; o. w
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ [# m9 A5 `: C7 B5 U2 d \ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 N& c$ r# V* i/ |, l( ?0 l8 `
( C/ ?5 |/ W0 M while(1)6 Z* h' i4 Y+ H4 E# m
{
* I& N5 a' g: ` read_MSG_buffer(pshreRAM);( a( ]" j5 W8 ^7 o$ e+ {9 {
}
$ I" U K: t, y" ]; J}% U! e8 _# A3 }% I" d
$ `$ F, k% u- E$ @- P; G; E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 t- U9 d- J: G. i* `% E. `! Q{
8 N! r) k) w" }8 C- U RX_MSG_PROTOCOL buf; g3 S+ N4 H' n1 V/ O; @
( h7 K1 Q0 M& F7 ?0 b- S buf.a = pshreRAM->a;9 B7 B. K' ?9 G. S h: d
buf.b = pshreRAM->b;
2 m. D! [" M1 [. }8 S# P buf.packet_cout = pshreRAM->packet_cout;6 p2 T) k- S/ R: b
^2 ^4 t3 }) |3 @1 J+ Q
if(buf.packet_cout != count_copy)9 {& x& Y8 k/ e5 |4 M& s
{ s* u" ~' \7 o* r
printf("a is %d\n", buf.a);
. p! j8 }7 \; T3 g9 ?) | printf("b is %d\n", buf.b);2 B+ m/ U) b: U% J" C
printf("count is %d\n", buf.packet_cout);8 y0 }; N% p+ O9 u" z; x) B4 f
count_copy = buf.packet_cout;
# i( ~- J# Y4 X% o }+ _0 }3 \% ^1 v, Z% A$ _
else/ k- \1 k6 N8 B2 `! a! q
{( [* S8 v* ~. L& E, g7 v
printf("No effective message!");& e: M9 t5 ]( F* t7 ~* ?! c
}
1 p1 ]3 {7 t, F) M! H, |0 U}7 s: D5 D5 w8 E
! d* j3 B" R; J# Y. ~* ` v) C0 u v( N+ f" n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 b2 u5 Z( \* z6 |, P2 J1 ]/ [" O0 b2 r
使用下面代码,对内存使用了mmap函数后:
; n; f: N# G |3 c" u( e4 M3 S( [#include <stdio.h>
- j) F* }: X b g#include <unistd.h>
6 O" R9 z( ]5 `! ?( H+ U4 J#include <sys/mman.h>
" y% W* l+ b* c' s0 w4 V#include <sys/types.h>3 k# A" s! U5 f! u# Z+ e( J
#include <fcntl.h>
" E* I: l& [: d- b' b: t
# k3 Z# [3 c4 z# o2 _' K0 i#define SHAER_RAM_BASE_ADDR (0x80000000)
2 R3 P: L/ R2 R% x7 F#define SHAER_RAM_SIZE (0x20000)
* I3 `( a3 v; {( z" a0 Z- {/ I! W' ]3 L
typedef struct4 a$ h8 |5 b1 s/ a s, x' O
{( P7 T8 z, e# h8 y; ~ n
unsigned int a;
7 w! L/ B; G Y3 D) N& t unsigned int b;+ i! p% C, G1 H+ V: ?8 T
unsigned int packet_cout;& f' ~$ O$ W7 E! E3 u! y3 |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; l; A3 ]3 }' m2 `) R. Q- L
# u# j0 I! |/ s+ _3 Z9 cvoid read_MSG_buffer(int *baseaddr);
/ V0 ^- v7 R, p/ Munsigned int count_copy = 0;( _! f( L$ K+ N. }8 m8 }# E! B* M5 X
G7 g" M$ W0 z6 M* d/ Aint main()1 V6 _, @* f; X4 z9 W
{4 T, U6 K2 q6 c3 O/ b
int fd;
2 A4 p, C6 f. F8 u5 ^! z2 P: t$ B0 ^ int *mem = NULL;, p2 o k, X, i. d& V2 c% S
# e' N5 n8 f! Y1 r if((fd = open("/dev/mem", O_RDWR)) <0)6 Q% P0 o& S6 w4 F- |
{1 S; s2 f0 F' |0 l+ p, p% u9 I6 _0 l$ x, [
perror("open error");
# E, r$ R* U3 A4 s return -1;. j2 m. l" m+ f
}
0 G. b+ t" G) \6 x! [; k( E 1 W5 H' V: A+ p' G5 |* |3 C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# h: e: N4 b7 q s$ t" Q4 o! ]) w: V
+ O0 a9 H: u# M while(1)
9 [ r% l/ }$ z/ p$ d. ?8 q; j {
1 ~( ?8 D! H3 s: _0 {1 {1 p, O read_MSG_buffer(mem);
. Z2 u- i8 S& e9 ~6 M: Y } 9 ?3 v/ A4 M" s) t# J3 ?
}% m/ t% ?- L* w! S% i% F0 r! i
8 k$ K1 R p/ O6 n( ?2 f1 O
void read_MSG_buffer(int *baseaddr)
' a9 v6 r$ Z/ D3 D5 l' {, e5 {3 Y6 ^2 [{
8 ]; ]. A7 T C& U pRX_MSG_PROTOCOL pshreRAM = NULL;$ ^' V6 m! C* ~9 z1 m
. x8 u& k+ a9 Q- O' k4 u& n! S0 Y! G
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* c4 V/ P7 E" O! `- r! e+ B% e% r
. ]$ \6 D" Q) m3 H2 Y9 R, p if(pshreRAM->packet_cout != count_copy)
. G" M$ t$ F& V* y4 X* d0 m {7 K* z; ]0 _1 k: l0 p/ f
printf("a is %d\n", pshreRAM->a); f3 F1 n7 ?: d8 m* F/ J
printf("b is %d\n", pshreRAM->b);
) A+ s5 I ^/ n% p) G% X printf("count is %d\n", pshreRAM->packet_cout);+ {% N+ g. Z; R* T
count_copy = pshreRAM->packet_cout;; m9 \: o# l) Z) e" K; w
}
+ q, ^! Q( n# |/ I- ^- B! I else' F/ \& G7 ]5 X) ]
{
6 B/ P, c" I% y+ U9 X printf("No effective message!\n");; h* k* V( i6 b$ e7 |; `8 }
}
6 S) P* i- l2 g! Y}
+ U( y& O3 x# b2 Q0 i7 g$ r* f. C9 f! |$ Y. ~" m0 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& B& v" s' f' | w# a! [3 }
7 d5 H5 P$ C5 }) c9 X0 P
+ J% b5 m- v& k8 q! {. |
$ @& e; N: O' g; y5 Y! w& C9 O6 ?& [
|
|