|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) J U6 _) l4 h5 m; B: p) t8 \
+ t2 j: p0 d# D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 T+ p5 b1 ~; j4 v' Q
#include <unistd.h>, @- E( o# ~/ [1 n1 H
#include <sys/mman.h>1 |, K; v, E! W4 n4 k9 n- E
#include <sys/types.h>2 j' z3 d8 n: b! p
#include <fcntl.h>' S( a$ N6 r6 `
8 B1 V6 j7 A: `/ _& b
#define SHAER_RAM_BASE_ADDR (0x80000000) 8 o! Y+ M3 b) ~5 x# p3 ~5 p
! K) z0 {! Y. a4 D4 u4 Wtypedef struct
( j% E# g, l: H{
, v, s! S1 x' J7 l! N$ c7 _ unsigned int a;
& |& K9 U V3 I0 _5 L7 N# a; R unsigned int b;; O/ o% l+ b8 f3 S' o
unsigned int packet_cout;+ X" ~. o* [: n/ l# Y( C2 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* Y9 r( n, F1 B. @$ b
6 B7 |* s! O" ^4 k. x+ W5 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) v2 u7 V6 n+ Q8 k
unsigned int count_copy = 0;& d" g! `' V) H W0 W( D+ ^; J, B
' G( z% I" u% j" i, X3 P( q7 r7 n
int main()
2 e3 b7 ?! ~* u1 ]: z{" R$ q, [" [- C2 S" i. A
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 w; \/ w7 w$ q; f pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ E$ q0 ^- }- I4 @* x" [5 v I2 B, I' E" B# w) i
while(1)5 ~( v+ b, R. v5 z- a4 |
{6 H. t. ?1 }% A
read_MSG_buffer(pshreRAM);3 X/ o3 ]3 p; F/ j2 |4 D3 y
}
0 @3 }9 B6 j% |' _2 @+ m% @# i}0 q; j2 C( D; |+ }
" @" P8 g( Z; Y2 l( I+ Q+ z3 o1 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% J/ \1 F4 q1 [
{" ]2 v: f4 Y1 Z- t( Z& r
RX_MSG_PROTOCOL buf;
: ^2 I) {/ n# z* V C* B6 [
) f# b4 o' O6 i+ R buf.a = pshreRAM->a;
0 Q) N& Y3 b: }$ i. M5 u buf.b = pshreRAM->b;
" s ^4 p) ^+ e! }) h% y( r buf.packet_cout = pshreRAM->packet_cout;# ]* i9 m: i9 v! Q
1 |1 L+ j9 j9 b) b3 j$ v0 c
if(buf.packet_cout != count_copy)
+ s$ B' Y& h7 H* |/ R {( _5 O, m! I2 t F2 M0 z
printf("a is %d\n", buf.a);. P" I) T1 ]6 z$ a# N) B8 C: a4 F
printf("b is %d\n", buf.b);
9 t) U" Y7 N, `% B printf("count is %d\n", buf.packet_cout);' N1 W# t+ y7 P' v8 d# R
count_copy = buf.packet_cout;" y9 |# X; Y8 w" S6 M+ O( z
}
/ m' @/ E1 {( H, [. U else
. r8 Q* X' M X" ]+ b; \6 [ {
. U, \. G' ^2 x1 F printf("No effective message!");
' t% W" u8 O, z7 ], k- }9 B }8 v$ s( {5 f+ \2 X
}$ x2 j; J3 |# W
% _! q j% ^" v3 H& [- \4 y
7 u9 n0 B( j9 b* C( ?, f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 }7 |* @% i+ L Y# ~7 I8 R8 j使用下面代码,对内存使用了mmap函数后:' p& h% i, H7 [4 x/ H) s4 D5 i/ E; Z
#include <stdio.h>
+ Y, V) o- ]; a#include <unistd.h>
, {+ O8 m5 c2 ], w#include <sys/mman.h> F: Q1 H" q; f
#include <sys/types.h>
3 _& a0 f% e! Q! {- I( ?- b#include <fcntl.h>0 Q1 [$ M B4 T1 `7 L) o( E
$ g7 ]/ T4 z- [+ t L
#define SHAER_RAM_BASE_ADDR (0x80000000)& `; \6 f# p# A( g4 i% [
#define SHAER_RAM_SIZE (0x20000) $ c8 S9 I" j# f2 A0 G( O7 n
. Q$ f& T/ \. b& rtypedef struct
- t' h p- ~& f; q% j/ v{! w+ {; O8 I7 d$ m* u& ?
unsigned int a;
. t( }* L. S* z3 O) [ unsigned int b;
+ J! A1 w7 k8 H6 m$ E8 o3 O# G3 w unsigned int packet_cout;0 s2 a8 L0 y+ @# X" w s' K% _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 P- n3 M: i+ J4 d; W+ J1 s: c0 M
6 v5 Q5 {+ }; k( e* t- \( w4 {void read_MSG_buffer(int *baseaddr);" h& C3 p$ j7 R
unsigned int count_copy = 0;) V# p1 f' h3 C
& Q8 s7 p1 O& ?* i
int main()% \! v7 Z+ x- A* E6 `# [* B5 H
{" S1 d7 [5 i, \, ^/ J# N5 M& P
int fd;$ A. ~$ u, j5 u1 A- ?# c1 \( R
int *mem = NULL;
5 `! V$ x& {; g3 ]& Z5 `( q4 ]7 W7 I( k+ n' q* Y8 h/ n1 S
if((fd = open("/dev/mem", O_RDWR)) <0)$ N0 P r3 M) L! R# v/ L7 y
{' y2 K9 `( E: s- r( ~3 T* u
perror("open error");
% P: j' g) m" H# s: K; T return -1;
6 K% H; |) h' b$ ]" @ }* Y }, t1 h* b
0 ^: m0 h; ^; \+ Q- V6 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) F; n# r d/ F, y& Q% r P: V! X5 |# s& J H& O$ P' a
while(1)
: s5 G5 _2 N. G, t% M {8 A, P% I, F+ O0 \/ v8 E4 }3 v( j
read_MSG_buffer(mem);
3 A3 h' X9 @/ l4 D4 t' A: i2 S }
* a5 K9 u9 Y' e+ r}
( D3 j- o% k$ ^* c w9 D( [9 {8 L& f1 Q) g
void read_MSG_buffer(int *baseaddr)1 w2 T. F$ ]! W4 D1 l# ~6 ^
{
' w( @, ~4 S2 L; K2 o8 W3 F, Y; G pRX_MSG_PROTOCOL pshreRAM = NULL;
" x' w$ x& ?$ ~* @9 z
9 K- K* @8 p" @) h j0 c) x pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 s+ X; { S# H% U: k/ H
& S- ]& J z( Z; Y1 E6 I7 g if(pshreRAM->packet_cout != count_copy)) t" f' B, S4 J* r
{
3 d4 Q+ p0 k Q0 D: A printf("a is %d\n", pshreRAM->a);
8 c8 n/ ^5 J8 {% h, c7 p5 m& N printf("b is %d\n", pshreRAM->b);% A( _" o8 y- Q6 B( `
printf("count is %d\n", pshreRAM->packet_cout);5 n7 @9 p+ n. I5 `: \3 c
count_copy = pshreRAM->packet_cout;3 {3 [( ^* S4 y. w/ c
}
5 E/ I; E( _. V+ j" _% B [' B else" y D# j$ ~, n) b% a. ^% }% [
{
' A( c1 p' V( J% T. \ printf("No effective message!\n");8 k3 S f" q0 H( b- `& m
}
. n. `' L1 L: O7 @}$ p* C- c* U+ [" Q6 J3 l$ i& `
% k, I8 s' D8 Z% `8 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ R6 S3 o2 L+ D" d9 d# z" B' r! Q; P
; q( h/ i' q4 y
2 X; Z" I6 p% x/ Y( o; Y. ~! ^0 D4 E0 P/ R; h6 q
|
|