|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + j5 B5 E. j3 q0 U5 ?( p
. a- T/ ^# b9 B" U4 I2 y5 ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% N5 h$ G5 |" a% Q; ?4 ]#include <unistd.h>
+ |; f& i$ Z% f' P& V#include <sys/mman.h>
9 E' w. Z) v- C2 {#include <sys/types.h>+ u1 p/ ^: b# _3 v# h4 {
#include <fcntl.h>
4 y) J2 K. u0 z/ d/ `' A9 r! c# p- U( J
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 G. Y9 n/ @" J% v" X5 d# F) |
. v3 R- @# G- ~. { Ttypedef struct) l c H- O* k$ d7 a
{
5 c/ H' s% j) { ~ unsigned int a;
+ Y4 w) d. F R" r! ` unsigned int b;
" V8 }* h2 F0 x* w unsigned int packet_cout;
5 D% p" `+ ^* |5 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ A' B' }4 j+ G; D
: ~: A4 d# r+ {" E( E8 i: Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- n o8 p- O& `* funsigned int count_copy = 0;7 w* A7 k" m2 [& J% S
/ K) n9 r7 B7 s9 Y/ Y6 ?4 w0 q; Z# v2 T- W4 [- ^2 K* f5 w C2 W8 @
int main()
- g, u% m' }: g8 U+ O{
0 B% Q, l+ @' s4 m/ r pRX_MSG_PROTOCOL pshreRAM = NULL;
4 T: N& e7 ~! @, h0 i3 C pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 b$ o) ^$ A* c# ^% ]. q+ `- F9 t5 x
while(1)7 ^5 v8 V7 u7 l& u0 s, E
{
$ V5 d8 z4 j" U6 i5 v- [ read_MSG_buffer(pshreRAM);
+ E+ U9 G3 v$ N& I8 y } 8 ]+ Z$ D( e4 j4 X" Y6 y- X
}
7 W0 v1 b L2 [) @* G! h# ~8 ^1 @$ J( q) A7 j6 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ G8 K i) D- o{/ m, N2 M' ^3 Z2 X/ z5 i
RX_MSG_PROTOCOL buf;7 C: U5 a |* ?; T: h" B
+ s; J. F( J B' ?7 q buf.a = pshreRAM->a;
) I( A: A: z/ _" h1 T buf.b = pshreRAM->b;0 _6 E. H" J, O) r
buf.packet_cout = pshreRAM->packet_cout;
- p. U9 r% a- V3 }% p5 d5 [( L4 M# S8 c ; j" E9 o( F1 b
if(buf.packet_cout != count_copy)9 c2 w! b+ _) J
{
) s$ B3 @( F1 D X: U8 M9 d printf("a is %d\n", buf.a);7 q5 f) T" f# U' ^. e
printf("b is %d\n", buf.b);
' b% _, D6 `5 l6 u printf("count is %d\n", buf.packet_cout);
- \. S" S6 e0 u; V: K count_copy = buf.packet_cout;3 s+ x- W t" @9 a! E# L" a! I. ?
}8 R# o$ j& V- m7 U4 R4 t
else
; S7 K' Q! G! _0 u; W4 p {# ]8 T$ l! c1 C& N! E
printf("No effective message!");
; T; i$ {3 Y. W2 i }8 @/ x; h: t" _1 c$ a- W6 O: s
}: b9 {# A8 F% _' y
" x- Q$ `2 F" q4 }" g. w `+ E ?- }: R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 n& A& ^! i5 w$ j3 J
使用下面代码,对内存使用了mmap函数后:; Y0 e( {- ?2 C |% o- i$ o
#include <stdio.h>
% Z" G2 {7 Z! f8 q0 c4 m0 v#include <unistd.h>$ }& a1 D% ]3 u4 \
#include <sys/mman.h>$ l0 ]5 ^) Z. Y* F+ T
#include <sys/types.h>
# u9 g# k. r. A; c y8 f* W#include <fcntl.h>
$ V* L" _7 u+ A" o8 `. F" @+ m1 ] M; O |3 y
#define SHAER_RAM_BASE_ADDR (0x80000000)
" \5 ~" e/ r& ~. t#define SHAER_RAM_SIZE (0x20000) * J/ |% e) d/ w- y% [
/ _; ?3 f! Q6 {' u% H( ytypedef struct
# {! W5 L3 ~& ?( e6 C{7 N( M5 x1 f2 K" e
unsigned int a;
" U0 N% V1 Z: ?5 \- X5 O unsigned int b;3 a* a" {$ g; |. F5 }* x0 ]
unsigned int packet_cout;, J6 C3 ~) x0 H4 v5 c2 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 A- K$ d1 R6 g1 a
! r5 R1 A1 C2 e* e* x
void read_MSG_buffer(int *baseaddr);) c+ J, c& | H2 L @1 o8 ]
unsigned int count_copy = 0;
6 g2 ]9 C& p) m. G; u! B2 h4 E7 R7 C2 R/ G4 K
int main()9 n W T- L& R4 l" X
{/ n: Z$ ]$ ]6 B- `1 g& k. l
int fd;3 q" p( p7 U3 c, W, R3 i1 B- c
int *mem = NULL;
$ k9 J0 ~. y% H6 a1 u+ P d n% ~$ _* A- n; s% e, c8 F
if((fd = open("/dev/mem", O_RDWR)) <0)
& p& J! z' g* B1 P$ X4 @" \ {
7 c2 J+ }3 ^/ l1 p perror("open error");# q4 X' n1 B3 B* a& _" P& a! M
return -1;" L5 ~, Q/ u, k/ y: v _, D0 E
}8 {! c# Z. t c' e/ J t8 |
" B) T( \" t" i* j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 g# w* j( b- A% @+ g W2 Z. ^
4 T6 n9 \+ s' a/ M while(1)
6 x7 S- X! `3 |$ W {
* F+ w/ D& N5 G1 [- e read_MSG_buffer(mem); n: F& I5 v8 \1 Y
}
# ^7 C& W( t/ ^}
& L! X- T4 }1 d* {/ k! @; }7 T8 M, G! Z" n% z/ g1 u+ M
void read_MSG_buffer(int *baseaddr)
& w( Q2 \% B5 M- K{& E' i1 _4 o3 d: z; u8 x1 n, l
pRX_MSG_PROTOCOL pshreRAM = NULL;. O4 H2 J7 _( D4 M3 w3 y) `; N5 H
" N/ R o, w. l- Z8 G+ ~4 Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. w& }) j8 c" q" b0 T/ B4 ~, q6 c# k' U
3 u& H' {% E# _; ~% N1 `- w1 o8 g if(pshreRAM->packet_cout != count_copy)4 Q; s+ \/ Z# |: \! V: t
{
- e, ]' H( Y9 _& B2 O printf("a is %d\n", pshreRAM->a);# u' d b# \ K1 x
printf("b is %d\n", pshreRAM->b);' m; n# {9 e' f$ H# x* s- V9 T: s
printf("count is %d\n", pshreRAM->packet_cout);; j5 G: A. k8 r4 ~5 E) j9 x6 O
count_copy = pshreRAM->packet_cout;. J+ Q/ r! ?2 T- W' l: L3 N; o
}
# a, Z& R7 n$ H3 M `7 _9 F else* k# F2 O) E% M1 T G2 s9 b
{. ?- K$ M6 H5 o ], ~+ [
printf("No effective message!\n");! I% v$ o) i8 |" S3 G
}
# e. M3 r; I( J. @} B, }; |. ]4 |6 @1 Z
) Y4 M+ w, B/ X+ ]2 o! [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! s7 S5 {' @5 f
/ [/ r- ?4 } k) m) X0 j- R9 c9 G% Q1 S9 N. p/ I( y' x
7 c& O+ j3 T9 u# ^; p- E
% l5 ]( x- Z! m& ~) o! ^" y$ j |
|