|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 K5 l* b2 m F! x& f. ]8 L. K! t9 ?5 w2 S* `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% q7 {$ i$ M& T#include <unistd.h>
; r ]0 L3 v8 N- f" B; A# Q; l#include <sys/mman.h>( z q1 Z5 z) ?3 [. \4 j+ O$ U9 ]
#include <sys/types.h>7 x0 X2 p# \9 d8 I: B+ C c0 z: S
#include <fcntl.h>
* Z6 f# A+ O4 P
3 O- }* N$ J( u2 S# a3 c+ F#define SHAER_RAM_BASE_ADDR (0x80000000) ) c# S' }7 Z, ~4 }/ j1 a0 u
/ o( ~4 G+ w9 ~typedef struct
1 C: @9 z' J, w. S1 k5 f0 k# b{
6 n5 }' w2 e) w) l. s, ? unsigned int a;
# o" K( L' |- ~: w; { unsigned int b;
8 R0 I; k; g9 {! a unsigned int packet_cout;
1 D( g! V7 @6 K& R8 U2 V9 c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) I+ `; y% t) V1 L5 b% k
T3 d9 s4 q2 A0 [1 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 X. p. J, P0 ?
unsigned int count_copy = 0;* \, ]0 r# Y: V5 ^8 P2 y, I) G6 H: K
# ~2 Y6 z8 B& P
9 u: E5 R S# [4 I9 E1 Dint main()
# C6 [' U; ^: i9 B{
; N+ ~7 N9 O3 T! N; Z/ A* R pRX_MSG_PROTOCOL pshreRAM = NULL;" v9 A3 [$ a6 s- J" W) P* l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 `. D# j# Z# Z# }. S; t/ p2 g
) W/ Q2 Q# e# P* { while(1)5 p D$ `9 }& ]% x
{
" C4 I( W F4 X4 ]" _0 D- Z read_MSG_buffer(pshreRAM);% ?& Z3 m% |7 e
} 4 ]. [" K2 t4 H0 U" N2 _$ h/ I
}6 F8 I/ n" o' c& t+ Z
: C! ?* u0 U J, h, w4 ?/ t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, ~3 }# j7 D! _{& E$ i) L1 v& u" C3 s
RX_MSG_PROTOCOL buf;1 y% C1 U D* _. z: {9 B
. u! _6 w! P+ p0 P, |4 m
buf.a = pshreRAM->a;5 Y) M( u3 [7 I6 N2 v
buf.b = pshreRAM->b;
5 O8 W( ]2 F* Y8 Z: ?% H5 s* S buf.packet_cout = pshreRAM->packet_cout;
1 |& B$ C9 N5 U: { 7 X# s5 ]. \- `0 A4 R# J
if(buf.packet_cout != count_copy)( d' U0 G# p" u W" X$ y
{
- @5 }9 I3 A, @9 q7 K printf("a is %d\n", buf.a);
A: _$ d- e( n) U/ {0 H+ h printf("b is %d\n", buf.b);$ p0 K7 T! X4 j; @
printf("count is %d\n", buf.packet_cout);( ]; u' K3 x" s0 S! \
count_copy = buf.packet_cout;
( P5 @( \ H! D. x" J- P: ~ }5 p# j4 M; J5 T% e
else
$ c. E9 |5 z, v' F& n {* D0 N8 E- ?/ s- ~6 s6 c& w
printf("No effective message!");) P9 h) k% x3 n1 a& s; p1 c
}7 S/ @" l3 i; y ` [
}" ~6 g" L9 e, v7 y! h5 c
$ H1 }6 C# H, ?4 }: K; Y! h- l: v& W
" L" p( B# O6 G* K8 V0 S0 K( ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 h% ~- K- O3 ]3 {" J
使用下面代码,对内存使用了mmap函数后:: Y6 r) d3 Y) C1 N! v; M6 G
#include <stdio.h>
. Z* O- Y* ?( O' x w! a2 A#include <unistd.h>
3 t& z% k/ F* W# _+ e#include <sys/mman.h>1 x% z* K) s7 V
#include <sys/types.h>! T6 K9 B j& N7 r
#include <fcntl.h>
7 E& r1 W9 x+ N" _; v$ F$ j4 e2 w7 X' _2 I+ J# `( G* p
#define SHAER_RAM_BASE_ADDR (0x80000000). `9 u) I+ g7 V% |1 z
#define SHAER_RAM_SIZE (0x20000)
1 `' {! s1 d, O1 {: a, c: m
. l4 @2 S; x% z8 ytypedef struct
! l4 Z; \& u1 r% O- `: {0 o{
3 }" N7 y' M g unsigned int a;0 u1 w3 Z( ~$ @( N) |/ E
unsigned int b;& I5 V) ]8 b0 n0 s1 Q
unsigned int packet_cout;
$ R9 `* R5 ^5 n0 P. {1 q* K) j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ ]3 u) K- f9 {7 r% G0 n
9 O7 f0 l' R. P1 h% ?" N
void read_MSG_buffer(int *baseaddr);1 u% {) D8 k y
unsigned int count_copy = 0;' s& B, w5 N: a3 o4 w( v h
5 `( H' }) M. z4 {; m; B! W P
int main()
" d# S1 h. e3 k. w0 Q0 o{2 V8 S {- _: D% }
int fd;! k/ I7 F8 G! f9 a6 [7 r
int *mem = NULL;
/ w- Z3 b. z; N6 R+ g2 e3 O) y5 ^8 t, \: V9 L0 K" k
if((fd = open("/dev/mem", O_RDWR)) <0)
& V! o Y2 ~. @1 K+ I O {* `1 N$ s7 c6 t1 H
perror("open error");; o2 z2 Y1 h9 B" W7 W$ Q. I
return -1;( o9 p0 o5 @( K$ {4 h% }
}* d `& F; _% p) z; d
7 g: u' ]$ L3 e9 a" @4 r mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: o S+ D! S2 i0 x9 J
) z) }# u! s7 \9 { while(1)
9 G" i. E" U' x# K- D, Y {& K( }6 k+ k' |
read_MSG_buffer(mem);
* l( c4 J6 c" z- {2 @$ ^% i } ' m! P) y4 v3 H, [
}+ J6 [5 }* A0 w: {" {/ W S
& r/ N7 M) v& y" u5 q
void read_MSG_buffer(int *baseaddr)
6 \4 A9 A# R* o4 |8 [1 d& t9 A{
, J* h& l$ u% I+ s$ G1 X% T, t pRX_MSG_PROTOCOL pshreRAM = NULL;# [3 o- c( g( T9 U
. L5 H* ]0 Q2 V6 E, M, g" _5 a
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; V% |9 P" j" v. \5 y2 ^$ v
& h4 j( I0 u8 J4 l, \2 } if(pshreRAM->packet_cout != count_copy)
1 k" [8 a' @" |2 `) ~5 x+ f# w {
! D6 ^* x: _3 R( W: L0 l( n printf("a is %d\n", pshreRAM->a);2 `/ L( W& A8 G m
printf("b is %d\n", pshreRAM->b);8 O V3 n3 f" p2 v% T1 x
printf("count is %d\n", pshreRAM->packet_cout);
* e7 L' T Y. N: @. M count_copy = pshreRAM->packet_cout;
. m+ ^8 H0 u, e0 s V6 S. f" ? }
$ w7 c' t5 z+ r6 ]. w: E% h3 [2 a6 R else: X+ |/ o9 L2 ~" [: E
{
- U( R) V7 P/ c1 B0 J printf("No effective message!\n");
8 b: Y+ W$ |) u$ r4 d( `' W2 O4 e }
- t/ X/ s/ v3 V3 f4 g}
* D) B& M8 d3 q, v9 Y8 W8 D, d o* r. b( v [$ I/ l7 _' T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 X# _% {- z/ q/ ?2 n2 t
0 H' b: s' s7 ? {6 R1 E% p/ j1 _( B' a9 g; ^- O- }
7 q1 W( w- Q2 y* k
: J; k9 W, a1 K0 Q" _ |
|