|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( k/ |" t8 C, [7 X J
6 g3 o* @4 Q3 m4 [OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! R1 ]; T3 @+ f+ v A#include <unistd.h>
+ l0 Q$ z3 k* M#include <sys/mman.h>
" C \. H. t' ]" v# k- D+ D#include <sys/types.h>: I! e* r4 P2 B# E
#include <fcntl.h>; g% N u# ^* r Q% i' |
4 J* C5 e- }2 ?; h% W% C#define SHAER_RAM_BASE_ADDR (0x80000000)
E" ?3 K6 B' L u- @! c; i4 z3 _/ C( t, _! ^6 T: a
typedef struct# b* _- p1 }5 W; c" T# v
{- K' G8 s+ @0 m$ |
unsigned int a;
3 E0 s7 \% f& G0 y* `" v9 C unsigned int b;
! @9 g' i8 Y1 W* N unsigned int packet_cout;# ~& _8 n \2 m E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& T4 U, \3 |' b) e! x& Q- Z0 [' @( V- f: ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! I1 v$ }- ~- V1 I6 u% m, w2 B
unsigned int count_copy = 0;7 ]" D' s4 w0 x5 e; W* I
7 o4 I4 |2 n' ?7 _/ A/ \1 b
* e2 I! m2 `: D& A. Q3 ^int main()
; J9 p% N* e' J* V9 M8 X p; L{
- [ w5 [( g( l) N4 z% i pRX_MSG_PROTOCOL pshreRAM = NULL; J3 H; k: m* O. t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 W6 s6 ?/ n' Q. i
5 l& t. s% e/ t while(1)
& ?* r# n. W& X# X2 S0 z1 w) T {* R8 A' z/ Y! X; g; O* G
read_MSG_buffer(pshreRAM);0 r U+ r3 } c* |# b: k7 F6 G
} - w \/ R! E1 A, L' j+ D) z/ c
}* N/ `5 Y; ~, w. v) I4 ]3 k3 w
' P+ Z" T0 y! ]( ^# Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- W$ |9 d2 h j/ C2 f
{2 Q& b6 E9 p- @( d5 }
RX_MSG_PROTOCOL buf;& c+ l. Z* k+ o# U4 s* x
( z# [2 B. ?2 u+ o! I1 ] buf.a = pshreRAM->a;( A2 j1 Y: r- [5 x' p) L
buf.b = pshreRAM->b;
. H5 h" x" d9 ]7 k1 o4 M buf.packet_cout = pshreRAM->packet_cout;
7 y+ X, D4 H5 l {) k6 w) `
( y/ C ^/ @6 B" E if(buf.packet_cout != count_copy)
- W. Z' ~: S1 {, y w/ d7 a {7 f) M. S& z, I. K" g4 ~
printf("a is %d\n", buf.a);
( z& \% y! ?" t5 w' S& ?7 k8 u printf("b is %d\n", buf.b);
+ ~0 C, k; B) R1 E2 y printf("count is %d\n", buf.packet_cout);
; ^) O; {$ t4 ^5 L count_copy = buf.packet_cout;- R, m9 q; e) z9 g1 l
}
8 |: i" ]( Q. r" L/ O% G else
/ R, P3 K) ?- E9 p- m {6 I+ ]: [8 R/ U, r: f& ]) i6 E' C
printf("No effective message!");
& L6 W2 N) m5 u }" p& }1 Q4 ~' o3 t1 L( ~
}
- _1 H" H. r+ f$ @% D j& o! ^2 x0 b5 s. ]0 e* V. `! h0 n
& j* }3 X, I& i+ J9 T! G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 e# m! t& i3 y# `
使用下面代码,对内存使用了mmap函数后:0 V& j2 w7 _+ D. Z1 V8 s1 x
#include <stdio.h>% x" _* M# P$ v
#include <unistd.h>
) y9 R. c6 c& L# T4 t#include <sys/mman.h>
& N" R8 E, Z9 k N" _% x3 b. c#include <sys/types.h>, k/ ` R4 Z) N3 H# F9 Z
#include <fcntl.h>
. K) k) L4 Q$ |! S t+ I6 k( C: _: f
3 T' {- V! s" }* @1 i#define SHAER_RAM_BASE_ADDR (0x80000000)
8 V! D' [3 @* I#define SHAER_RAM_SIZE (0x20000)
" z5 d' P# F! \- c1 C( a4 `# y( U/ e* A; h5 z2 u: t5 M
typedef struct
7 @0 B% b) i% d{9 @2 N" A1 a: Y5 x! B* E6 ^' k4 S
unsigned int a;! C: o' @1 B& }. R: t6 B
unsigned int b;
; }+ q0 D% s/ y unsigned int packet_cout;7 v$ n- `" q/ Q7 ?+ F$ c3 f0 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
V6 c+ D( Z; c# G1 p) L4 H+ t, u4 ~; ^% M, s* K) d7 P
void read_MSG_buffer(int *baseaddr);% L; R% b0 s2 g; }6 T
unsigned int count_copy = 0;
R" c4 I8 ]# \5 X9 w8 g7 @: C5 y G
int main()
' k7 V; G3 R; D+ N{
2 u5 Y. l0 O5 x3 a7 u int fd;) t0 V+ @" O7 N$ r9 o3 G, ^
int *mem = NULL;* r) W% L9 v8 I: D* v7 U
& r( _6 `8 M- q& S8 p
if((fd = open("/dev/mem", O_RDWR)) <0)
7 S. g p2 T5 A: Y# I! Z7 u, s$ E {
; O" C! V" F8 Q: c0 N: g perror("open error");/ D, I+ Q; z% b7 Q/ q* c! k
return -1;7 X$ E; s! T ?' R6 D2 ]
}
8 E N9 b7 p" U0 ]- v% [ 8 G$ L: l- K( Y1 P" c. b) X( C/ f. O
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( b/ `, z& `9 n% d7 y
6 t, x9 ]- m2 v. V while(1)" y8 _0 U! J% K. t9 w/ [
{, U( h% `1 x. ?- e' ^, g
read_MSG_buffer(mem);
& A6 [4 V- k/ U6 R8 ] }
" x/ U: d+ m4 [7 ]# \3 h}
$ a% n3 d( f, m, V! m0 X% T
+ e% Y6 c8 \4 e3 d2 k9 t' Qvoid read_MSG_buffer(int *baseaddr)
# W& V: D' j6 ^: p{* h5 v: V! Y6 Y3 g, C* | B ^* t, [" S
pRX_MSG_PROTOCOL pshreRAM = NULL;: Y m# B* l6 {4 m( l
( M! a' ?1 w# R pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* T% x$ H; Q7 F
' }% r8 E6 W5 Y if(pshreRAM->packet_cout != count_copy)8 Y' p+ R- s8 d
{
( j, g# |& d5 y printf("a is %d\n", pshreRAM->a);
& ^4 {) w: h/ o2 c a% e printf("b is %d\n", pshreRAM->b);
$ ]) T# |5 ]4 P8 ]3 F) |7 d printf("count is %d\n", pshreRAM->packet_cout);
" W( ?: ?. ^8 B& V6 K; F count_copy = pshreRAM->packet_cout;. h: o w) H' ^& a
}7 A/ Q) E" q: i8 v2 X- q
else/ D# r; n6 `: O! `2 q5 _9 }8 k
{1 m! v( q6 q) |
printf("No effective message!\n");
4 k1 F- \# O1 O0 l% e2 S }
# j1 t0 }/ o0 b4 X% e1 O}9 ]" K) T8 u$ l7 @
7 A9 C' w, I3 l3 D S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ g% L; U2 ?, ~ M
. I9 K. U/ F, ]: \$ [1 T6 U m I3 B2 T& y1 p4 l
* c/ A" k* C7 z- z9 m( ~ `
% \2 L! Y7 r( H* D3 k) o9 X6 o3 U |
|