|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. t" p. E: C( |/ j+ G! i5 S2 m, h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 K$ j8 ]* A# s5 `$ n#include <unistd.h>
- g8 p2 Y$ @ c! _#include <sys/mman.h>
2 S, c8 ?! k9 t7 a$ j; _9 N- r#include <sys/types.h>
* T1 M; i& T& L- N J3 F6 ^#include <fcntl.h>
0 y8 t* r, N* |' l7 C: {; j8 l4 M( k) u* I: V
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 F; Z0 G- h7 s5 P( \
# K' m1 U3 ?9 r& Y, S5 H" Otypedef struct
& `! W; x' p6 E1 R; p" e( f0 q{
$ Y, k+ X$ A% ~( d+ C$ d unsigned int a;! A; o8 Z- V1 E+ R& S7 r" {
unsigned int b;) P* g8 e6 c; `9 b3 i
unsigned int packet_cout;
4 i% ~' E6 V: a0 `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( b! t' V- K) L' t2 B
n1 {/ ?; f t! cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: ~' N* g# {; H% Kunsigned int count_copy = 0;, A3 W% o; Q8 _, ?7 U9 U
6 N) ? O7 n1 H( ?( c: f- [* y$ K, a' y. [( U
int main()- X4 T2 O3 p; Z! |0 M
{
+ s1 v8 @6 X' |! J0 U0 i" w7 ` u u/ I pRX_MSG_PROTOCOL pshreRAM = NULL;3 m$ |% C8 L8 N, S9 I( ?
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* o; x, i' r6 e8 f3 E% T$ W+ K# }3 T' d0 \
while(1)
( R. z* V4 }1 Z; U {
# e/ `/ z. R- _( x read_MSG_buffer(pshreRAM);, }8 v; v+ \8 X- L& |, ]: k
} * E! G9 U- ?6 ~, X$ B9 U6 D& t0 ~
}
6 l2 L0 `0 ~5 j" d- o+ Y
: Q+ m9 D# U) L1 Z+ R6 {- [+ ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( A4 O/ l! a! [* o4 L! s{0 E6 C' t. V( t9 y6 }, u
RX_MSG_PROTOCOL buf;
; @8 n% v2 I; x+ y. m6 z
2 w. C. t( Q- [3 g4 C9 _ buf.a = pshreRAM->a;
! {: @# v. E* d buf.b = pshreRAM->b;! f. O8 k3 b( p
buf.packet_cout = pshreRAM->packet_cout;
& L- l: W+ `! j0 X: M 7 Q2 ^* o/ s2 d/ M% g, i6 _6 G: E
if(buf.packet_cout != count_copy)6 l! X* b8 ~' Y0 K9 P* x
{
3 o9 t4 {; X) G+ w9 t) U% w1 K printf("a is %d\n", buf.a);
6 o4 m* D' O! z5 b1 s printf("b is %d\n", buf.b);! p9 e2 C! D6 Y+ E& U* I& T! }
printf("count is %d\n", buf.packet_cout);+ l+ l" O# c! `5 x, D% e1 e
count_copy = buf.packet_cout;" O8 J0 z2 ~$ x/ p& O8 k
}# a. c3 V2 P* L% C3 Y0 X% V
else7 }0 r6 a9 c+ V
{
j, J. `/ s( ^$ E: ~* a printf("No effective message!");
/ l" y7 [6 p5 X: Y% ?, D# q4 s' | }
; V M1 l) R/ w! ] [8 {}
$ o( m5 {; O) w N4 |1 h3 b4 `$ [$ M \) |+ r; K
8 d) T' e" e4 Q! r7 x/ F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ j& R7 u ]6 K# V; A使用下面代码,对内存使用了mmap函数后:8 |# s' ~$ C B7 j' E( @; L' `7 T
#include <stdio.h>
/ O" p' s# B/ A: d! P% h#include <unistd.h>7 ^0 n" i5 @% i- ^
#include <sys/mman.h>( d6 M: S( @) g3 @) |! q3 q! ~
#include <sys/types.h>
4 D* a; Q! c' j) s& U#include <fcntl.h>5 M8 ] P' F4 M3 x8 Y& d5 |3 v
, r7 C' m9 H/ o/ g/ S& `7 I
#define SHAER_RAM_BASE_ADDR (0x80000000)4 o& `! D2 }$ ]1 M9 j8 ~# M4 ]% y
#define SHAER_RAM_SIZE (0x20000)
y$ N* v7 t& A7 D, B1 ]0 f1 c1 J+ M/ i( ]# {" |
typedef struct
& a7 A# u, l3 d/ g5 Z{; C! N9 V. k6 N# P
unsigned int a;
! i7 b; [- q" F9 \4 L, x unsigned int b;
R5 P/ K# ]- r/ V j } unsigned int packet_cout;: ~0 [# F G$ T8 r) U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 Z$ L2 d# [$ s, P7 r v4 V) ?6 @
void read_MSG_buffer(int *baseaddr);
3 M; P0 u M* @0 r! Vunsigned int count_copy = 0;- `, b7 k! m9 w9 t8 X$ c
* v8 A! W0 A. s$ t
int main()
& V- b& q) i" Q/ T; |$ P& f# p$ S{. @. l/ Q) {" r2 J+ S; |
int fd;
4 x# W* o1 @7 e7 | int *mem = NULL;
, V g+ k% R+ f2 W: h4 l) S) d% ^/ j1 X n0 A$ V4 b- @7 |
if((fd = open("/dev/mem", O_RDWR)) <0)
, h0 }8 ^- ~: n+ z0 k- N {
9 y0 E0 b( ?4 c1 A! p4 n0 B" `0 a perror("open error");3 W. \: d' L( D& l Q
return -1;* I7 o, X7 j7 a8 i% [
}
& c& R6 I6 D' G8 X9 N2 Q1 h1 n
$ B, H/ t1 d8 f: O: z6 I k mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 D9 v; Q! S- o; r( a
9 T( z$ H9 N. y4 G; R
while(1)
- S5 P) e8 K9 S# R O. C6 K {) e2 q7 ]/ _" p9 q
read_MSG_buffer(mem);
5 v7 d/ O& l+ g0 Q& u7 E4 \ }
8 Y% h1 U1 [: ]3 O& D, G5 p}
; T. E) ?6 l- ~5 m5 T& Y# e+ K( f! H1 E2 x, N) ^/ Q: }, S1 y
void read_MSG_buffer(int *baseaddr)
/ j7 I) ~ U( I' K8 b$ H{8 u* J) \; e2 Z. o3 a/ _
pRX_MSG_PROTOCOL pshreRAM = NULL;' ]* g# Y- d9 d' ~
9 h5 B( C8 W3 T0 B' u# W, Q7 Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- H" o4 B) T) `, \" W* i7 u, U
6 Z' e. w# c8 g6 c, d% p
if(pshreRAM->packet_cout != count_copy)5 a3 m5 o' E+ P) @+ [/ j, {
{
& @" J1 g. V; O/ f3 U9 w4 s printf("a is %d\n", pshreRAM->a);1 j; J) i$ e- _' x2 t2 E% P
printf("b is %d\n", pshreRAM->b);
/ F3 Q+ s: z+ P- A0 } printf("count is %d\n", pshreRAM->packet_cout);" S; H" Z; p9 \/ l* l# O1 A$ I! Y
count_copy = pshreRAM->packet_cout;
! P: s; ^0 t5 U2 i }" T5 w& i! L- v' H1 _, o+ F4 I) I
else
1 ^# \8 ?; ^; @, H* W {0 q1 W' E" P* |
printf("No effective message!\n");
" V5 X3 g, S; K+ j( i. ^# z# Y# } }) v$ `- r) N" S9 k4 ]- H
}
* Y2 J% Q: E# }2 T$ s$ k% {8 w) @7 l5 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ?6 u: e8 _- V- F$ u0 [1 j; `! ?4 p. F/ U
( F* g$ u8 _9 U+ m9 v) J7 O4 r
# E' [4 ^" k$ r$ O
/ g z' X+ f* A; g |
|