|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 M5 e: T. d9 g' l- q1 n4 z8 s- a
: N. U: P! T) c; A8 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, H7 I4 [2 w9 [6 @' D5 W#include <unistd.h>
8 j$ r8 U" X; t- L4 k#include <sys/mman.h>! g, J. E: E! z' o" V
#include <sys/types.h>
2 n6 |7 A- q R. \% t. u. p: ~#include <fcntl.h>
4 \2 {5 ]% w- Y% {8 g
, M& ~# v( e0 U- ?#define SHAER_RAM_BASE_ADDR (0x80000000)
4 P1 V7 N. d/ H! x! D4 d# y7 | z8 ]3 f; y, n: p
typedef struct
0 A( s2 t- Q. g- c _{4 l0 I* G/ e# m" ]
unsigned int a;+ B$ T7 i' R1 T0 ]8 U* U/ B
unsigned int b;
9 J" \0 z1 B7 y4 c) s, B unsigned int packet_cout;' B6 j) ~% u( o& J# w& c, r R$ q& V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: X$ R1 @+ |; @# U8 [. k
; f8 o: i; S- j% R) q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 c8 p# P& r" `* E" E+ Qunsigned int count_copy = 0;3 n4 F6 f; _( N& g2 L# H
2 u" v7 W! b2 L/ g
. ~ D% n# k- U: q/ v
int main()
( h1 h/ e% s2 F& Q{) t7 e" c2 I) X' c, }
pRX_MSG_PROTOCOL pshreRAM = NULL;
! F+ b- Z3 L8 r. {8 ^: i/ ^ pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# t% z% F0 \3 u1 n% t; g
) r2 h; p3 J0 B0 g ?. P
while(1)! y* {: v% r# T8 @& y, `6 Z, k
{7 w, A9 s/ h* G
read_MSG_buffer(pshreRAM);
' g0 Y }; P: N* L! k; E+ M } ' y# n$ @# L5 i4 D' [! q
}' K- T+ u" c+ P% V. c
& _6 P* u4 g8 T3 g$ z. V/ Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" {1 ~8 L+ X7 `* y" g! s4 f
{
& T8 V: G7 T8 y RX_MSG_PROTOCOL buf;
6 D& g Q7 D/ e. {+ i2 Q 3 f* X: S& t/ c, L+ T
buf.a = pshreRAM->a;
% J' L) ]9 ~8 H buf.b = pshreRAM->b;# C) @- {4 o1 A; x8 w) M
buf.packet_cout = pshreRAM->packet_cout;
- i% y) C3 @% L4 N, Z w. Y
s# K' R( j4 G7 P# x0 B5 N if(buf.packet_cout != count_copy) h( k" l! s, P0 O/ O5 z
{
% _8 O3 `: b6 F) w printf("a is %d\n", buf.a);2 K1 b1 U! I, P- M1 I
printf("b is %d\n", buf.b);
0 C0 \* d0 h! k0 u1 { printf("count is %d\n", buf.packet_cout);" K* x. t4 W k
count_copy = buf.packet_cout;% w& l1 X0 N; t: L$ c
} }& X4 @- |! V9 S! B% e
else: I' c* T/ u. _* D
{( H% S/ U8 Z7 o
printf("No effective message!");( l9 i: ~# d2 p6 `: s+ t
}3 N9 }1 |4 ]1 s: d/ j7 w
}
# s! h! k* ~ a' q2 y8 o2 g, z9 A# o
' x% n. }+ ^) y6 p1 L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- [0 _; C: M- Q% a/ j
使用下面代码,对内存使用了mmap函数后:, Z; p' a- e; D- K. x
#include <stdio.h>
! A# }$ z2 ]& G' X5 ^8 F#include <unistd.h>% N% X* y& p3 @5 L$ y) e
#include <sys/mman.h>6 T% |) K( X1 D3 S" |; H
#include <sys/types.h>6 N, |2 B! Y; X9 J) S6 y
#include <fcntl.h>- w$ s$ y9 G. H2 }; l
/ D p# d. x! ?7 [% s
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 g3 ?8 z" D* m; F: Y#define SHAER_RAM_SIZE (0x20000) / \8 p5 }- L5 y3 j5 ] Y9 h+ K
* r7 d' f* `5 {. l- dtypedef struct
$ m$ o7 ^8 Q& ?6 _/ E! L/ w' B& P8 u{ i: h$ X. D8 Q# @7 O3 v" u: X1 B
unsigned int a;
$ B2 t. }" E; R# N7 u& L unsigned int b;5 j) S* {0 A( d/ X
unsigned int packet_cout;
: P) z V; A e) y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" U5 q- ^# @1 ^9 o% r9 c) [4 k
) y8 f; p. @* N1 H7 E1 ]8 ]! H
void read_MSG_buffer(int *baseaddr);- F F# m8 y7 i# x5 P
unsigned int count_copy = 0;" g( C+ w8 g! f0 l% C* e
5 x( m: n" @3 h, w3 m
int main()# g, A$ {: r( q$ p9 ?. w8 {
{
4 C2 Y; \) n/ Q' Q8 q% \9 u int fd;
4 G6 O- D4 q0 _: x0 Z int *mem = NULL;
6 H- N/ r7 s- l3 w. U8 W5 n+ D t. V
if((fd = open("/dev/mem", O_RDWR)) <0)4 }7 S8 y' P6 L+ G ^4 H! M
{
6 G' ]. @4 {8 u perror("open error");* v3 V7 C& O2 b' @0 z+ p
return -1;
; _( B8 a" T: \+ D& Q. w }
1 y; k5 @: t; `, K ' R- B- k; G8 k- F, K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 r" v/ S8 h( _2 _% q! E
. i. a6 D1 o( C7 Q0 P while(1)- J$ f5 X8 a* k `5 X, H$ E+ L4 g
{2 P6 Z8 ]5 F+ ]3 O* d+ b
read_MSG_buffer(mem);
1 x7 t5 i7 U$ [4 O+ R F7 u0 `- L } + A' ?9 |0 o! E# ]
}) _, l+ N! k1 }" D5 i8 f+ \- H2 I
# c& @* z8 `$ U2 mvoid read_MSG_buffer(int *baseaddr)9 m/ K0 I0 O) s/ N
{
+ b1 {* e. Q4 i, X pRX_MSG_PROTOCOL pshreRAM = NULL;7 M) \ U- S& F& S: V
1 j" N& ^# j9 R0 y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! d6 ~( S i( f' p
1 k$ {. `; X1 s/ F! k, O# B if(pshreRAM->packet_cout != count_copy)
* O+ B! K( T9 u" `3 n {4 v" q3 n! O; U) e4 z! v' B
printf("a is %d\n", pshreRAM->a);1 h. O# f, X E- Z) B+ [& E
printf("b is %d\n", pshreRAM->b);
5 {3 ~6 }3 }9 n" t; h* x: ?) N) ? printf("count is %d\n", pshreRAM->packet_cout);3 @# o2 o7 @( P7 J- T" S
count_copy = pshreRAM->packet_cout;9 M8 L1 Z1 p5 |; c5 {1 ^- l
}. m& d$ l) X8 p7 n2 {% }
else
; Z7 ^* f! t8 W4 W {: T5 k, }- H, ]) @
printf("No effective message!\n");
/ g: o2 x3 }5 R }5 U: [ x& Z- S1 V% r+ y1 }
}$ w7 G R7 _) _. b9 O3 [8 `) K
+ t) ^) p3 b, Y; n* U+ L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) F. i ]0 w; T" m( |: c8 d! `- C- U- E* i. r- g8 H. H1 _( n/ R
5 t0 ~ [' {/ I) `" c$ V
/ k# W+ N- F1 Z5 G
% A1 z0 A- ~9 }4 q |
|