|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , c" T+ {) L4 b- k" N3 W6 ~6 X3 o
: g/ m3 G$ ]: _$ f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 D+ s! e$ u# q0 M4 T0 _#include <unistd.h>
- \5 a9 ^8 I: z6 Q6 s8 _#include <sys/mman.h>6 p. e/ Y% j9 l: g1 Z6 N
#include <sys/types.h>
# f$ o6 j* g) {* ?#include <fcntl.h> ?7 v* [- }: {5 L: u2 }+ ?
3 {; ~) R! F3 }2 c#define SHAER_RAM_BASE_ADDR (0x80000000) 5 r2 e8 ~; T+ d
7 S8 e9 i% j. |/ gtypedef struct
7 g7 A- x6 u6 T/ n; J{1 V! Z+ s9 A" x7 b
unsigned int a;( A. F# e8 e0 @
unsigned int b;% V& S1 c( ?% @: N' ]6 e3 ~
unsigned int packet_cout;
( p# r$ ^2 j. |4 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; u) |2 c. V4 ~9 a8 k6 ~' R' M3 A6 t
1 h" M# y" w" X' H- Q' v6 X2 a4 J: nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 a: ^4 Z1 b; t9 h% X. B# P
unsigned int count_copy = 0;
3 k0 u0 r0 ]5 S" O9 Y* S+ _+ V# {+ b( @5 o1 K% n
$ f/ W$ a' e6 }- ~% @8 c$ J" X- W+ t
int main()
I6 m1 x3 C1 v" x1 E! [1 F* a3 Q{
1 b w P, B0 n& Q pRX_MSG_PROTOCOL pshreRAM = NULL;% K; r: C G, h) e7 ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ v" ?% c; b5 L% k0 K
0 Q9 V, K2 f9 u( O# E1 ] while(1)
+ Q9 K K4 |' J% I; X; z# O6 s! N {, l8 s. Y- w* G$ p9 w8 l& ?
read_MSG_buffer(pshreRAM);5 B+ Q6 R; T9 w3 ?# p: U1 k+ P6 B
}
/ L2 p2 g4 X; \# @}
1 Y% w: L# H: G' `0 }7 F9 L# K
% }0 b9 f4 R2 I! [" n5 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 l7 b" U" ]1 j" v1 C" f
{- ?7 v$ B/ E3 \1 n7 q* `' }; @7 }! M
RX_MSG_PROTOCOL buf;
1 P( x' |8 @# S. \1 f
T! u: s0 H! [1 A" o" ^1 X4 j2 \, T) b buf.a = pshreRAM->a;
3 w1 f5 i. G0 L) y9 R S; g* X: W6 W buf.b = pshreRAM->b;' t7 s' c2 S" a% j! B1 V
buf.packet_cout = pshreRAM->packet_cout;! Z3 T( \2 L0 c! M7 N/ m7 l
$ L. U# ]$ V1 ~7 T( n if(buf.packet_cout != count_copy)
8 s9 e$ r% q q8 N/ e/ W {
+ m9 M/ Z/ ^* E9 H, M/ n& g- H+ Q printf("a is %d\n", buf.a);
. z/ W) j2 M. V5 g! B2 D printf("b is %d\n", buf.b);; c, T5 H+ O4 z( N% Y% r+ ]
printf("count is %d\n", buf.packet_cout);
" }# v4 z7 p+ x% G& B count_copy = buf.packet_cout;# y `5 ^+ v1 w5 R/ `( D7 e
}
( F% Y+ N# O% c: E( P, K& m h$ k8 g else4 m; F& {8 B( M$ }# m `
{
: I3 I. v- r/ l printf("No effective message!");
$ G: W; U& B @# y; \ }. J' m8 D G# ~% C
}, H1 {+ I- C) E' P8 M
+ w9 E* Z% \7 ~. ?- h e3 H( g0 x9 S7 N$ U/ K7 v# O7 k8 i2 h6 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 i/ u2 k: F4 g9 a
使用下面代码,对内存使用了mmap函数后: M: i& B# W9 f
#include <stdio.h>% G* p7 S) P" s2 U
#include <unistd.h>
* l( R; I( N9 _) a! s2 K3 I#include <sys/mman.h>' z. G6 _' b8 t# v
#include <sys/types.h>/ D( }6 t, m7 @- |
#include <fcntl.h>
$ n8 B, g9 ^% [, i+ e B3 N! u7 j5 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
* p0 j( J' l: i3 x' V1 q0 x& O5 t#define SHAER_RAM_SIZE (0x20000) 6 Z3 [6 ?3 R0 ^0 K' R" j
7 t7 w* Z. [ \! o7 D
typedef struct- F7 f- m( S- ~6 @/ o0 |7 X
{
" j3 H+ W4 O& s; O- z) X unsigned int a;0 C! A& {- z# t" J' v2 m
unsigned int b;
9 N2 N5 d T/ d' X4 { unsigned int packet_cout;7 G' W4 b) x8 z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 {0 t/ j+ Q1 M8 {
" l# r% n% W% W% b$ R) z( }void read_MSG_buffer(int *baseaddr);
" D0 [4 `- X1 D# Cunsigned int count_copy = 0;
; x( l! L' P- O m/ F0 Q
4 c3 C# d( V) `# o+ Tint main()
! L% J7 @4 H2 [8 g3 H4 w% k$ u1 q{
9 {9 F& j7 W3 f Q, S% u, ] int fd;
% ]1 @" L0 \( i, ?: N int *mem = NULL;
# y+ y' G9 ?# v8 A; b2 _' w. t( n( o& U& q) G
if((fd = open("/dev/mem", O_RDWR)) <0)
& p9 T: \' f4 ~" B$ M {) c+ \8 o3 {+ w+ o( A2 i
perror("open error");
5 u- `6 `- O6 O% y" l- L; t4 L/ J return -1;+ g8 e" F! C& K2 r
}: H* T3 H* |: @
2 C# K2 ~: [4 P* G4 }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& B4 o1 c6 R; N0 z& {
' { j0 ^( e" y
while(1)
4 O4 b9 q" R( B9 ^/ [' l# M: b5 Q {4 V" x/ R% O/ h5 R" _* d3 x
read_MSG_buffer(mem);
+ W! }, ^$ u" N6 I: b }
& ]0 ]6 X: L! f! w0 g}: H5 L% {8 c# u# \; G! T7 s
/ y4 X# X0 X1 j! f) r/ ^
void read_MSG_buffer(int *baseaddr)+ a* E d1 P2 R8 ]# m7 E
{8 t% m8 N# @. \& s! F6 X: A
pRX_MSG_PROTOCOL pshreRAM = NULL;$ Z2 F; X) D1 V' M) C; b* {7 n
% r c" }2 L3 D/ l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# a( [: s+ M7 w. v/ |
' o$ Z w! d# _: i) D if(pshreRAM->packet_cout != count_copy)
8 J4 O- i* d( Q2 d7 V {
8 d% O ]% V6 E printf("a is %d\n", pshreRAM->a);
* C7 }3 J% o/ Q4 @ printf("b is %d\n", pshreRAM->b);0 P8 c: E: ^, `) @8 S5 v3 p
printf("count is %d\n", pshreRAM->packet_cout);4 e# U8 R' v' Q
count_copy = pshreRAM->packet_cout;
3 t" {1 @+ Z( i" c4 v }
3 ]5 I/ r" f3 f$ e else
" U* V2 F' O; G/ K, j {
' @& h) A8 a+ V* f printf("No effective message!\n");
2 s4 e0 r- T L7 h# J }
3 g, ^0 B- S$ ^/ E* E& M, l( l' z}
- a% v. @. n& c( M: m: G1 }1 A% O' {+ u, l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! }" P0 w; M+ J7 v7 q5 ?) w5 g
5 |( F4 M- E1 w. @5 ]3 z u7 r! z9 e. ]; J! a5 A& `4 m
( f8 y5 P& [" W9 f' O2 x# u; y2 f( q1 x- a2 p) I0 j. d; c) X
|
|