|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: U6 M4 B' H3 j* w$ d
/ Z0 C% @0 p9 z: V& MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" w* N* U' c) `0 m! l! s#include <unistd.h>
! W+ P3 K# N; `$ A3 S# M: G" q#include <sys/mman.h>0 X- e+ z! Y9 L2 V1 x: ^; A1 u) u4 Z
#include <sys/types.h>
6 c# p$ ]3 G) _8 m8 C#include <fcntl.h>
) h3 C& O/ O7 D7 w8 I3 k
$ u# _9 c+ v( o1 {#define SHAER_RAM_BASE_ADDR (0x80000000)
3 d) S v! H7 {- s8 t
# }0 b4 f d$ J" s- ~- Q7 J. R9 atypedef struct
, D$ _% u$ p! @, a/ ^{
1 M/ b }- X1 J% U9 ]1 X unsigned int a;' M4 }* n: O; M, Y
unsigned int b;
0 T6 Y# I$ |4 h+ l7 N unsigned int packet_cout;
1 V9 _5 z2 i' D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 C" T( O9 A" J. A
/ m2 d) Y0 q4 Y: k* _: Q( l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, a9 S, h6 l1 q' {' F2 f
unsigned int count_copy = 0;
h9 r8 k6 @7 z1 A" o/ Z5 @* k1 W7 k
1 p7 n N# ]4 y) ?# z/ T8 U
int main()3 A# d1 ~+ g8 o9 B, o
{. v' _: i4 w* Y
pRX_MSG_PROTOCOL pshreRAM = NULL;. F" }$ E% i1 i6 k+ M0 S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# ^& v) U8 E; x# ~# |9 K& t9 L
! _, A' e+ ^8 S1 Y6 Y
while(1)2 C, v" q0 ?2 y A8 z
{0 V# c+ j6 S) v
read_MSG_buffer(pshreRAM);
9 r6 G/ o, d5 Z } + G; u2 A, x' z0 w# X$ {" p
}
5 e6 Y$ D/ ?/ B& y1 ]) ^2 o/ X5 \3 ]" R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) a% q, r! x; j* d
{
: T& J$ l, W1 Q7 F( y) ~1 d# N8 I# x RX_MSG_PROTOCOL buf;
5 {% I* V' j; r* G7 U8 w" m
3 T. @! U: E( n/ v; K) q buf.a = pshreRAM->a;
& r0 l s$ Z( @& O buf.b = pshreRAM->b;
( ]( U# v8 u# d# A7 e* ~8 I; d buf.packet_cout = pshreRAM->packet_cout;
/ c) \8 {+ M. k3 w5 ~ 8 j& l6 C; Y, S0 r+ P, c3 e
if(buf.packet_cout != count_copy)
2 ?& i6 L! q" J( Q { ]) ]- ~# N, i: Q! ^) A& o
printf("a is %d\n", buf.a);1 g, r7 s# v, ^' M& T4 [
printf("b is %d\n", buf.b);
1 h: ?& @8 W2 `$ e0 Y printf("count is %d\n", buf.packet_cout); p+ J& y/ L7 G! T
count_copy = buf.packet_cout;
& V9 _7 p& V( B0 V, P }/ f v6 c' g ~) i s1 N
else
+ r$ k) ~' h) g {
; v+ h; W# {5 F printf("No effective message!");
; l0 q) P4 O" F }
- q6 j' k" u. P9 c. n5 S7 F}
4 L+ v0 f1 G( `8 O
# Z+ a' d" a& s/ f6 w/ M
2 o3 v) C3 n! e2 u% ?7 d9 T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 i5 M; V3 x0 _' t使用下面代码,对内存使用了mmap函数后:
# q: @* i* t* A2 l2 H3 k#include <stdio.h>
- ~' ^& p+ X, h. w# a: A#include <unistd.h>
V3 E. w" I( S#include <sys/mman.h>. F- y4 V$ M( W& H% f R
#include <sys/types.h>
, e2 q" A+ N' _1 w' ]; s- w! O#include <fcntl.h>9 w( p7 g f- M: \4 a6 Z. [
' |; T' l2 Q' U I+ P4 p
#define SHAER_RAM_BASE_ADDR (0x80000000)& D3 `( p" E4 U2 I1 M
#define SHAER_RAM_SIZE (0x20000)
( I" U5 P/ A$ N" S! c9 T
% Q+ f5 A6 [& _ W. b0 O' s8 ntypedef struct
' V5 q; ^0 I! T/ C. L4 o( l{
2 H7 L& x v2 _. w$ a) t5 F unsigned int a;
3 g9 i1 _6 k# ] unsigned int b;# B5 X$ P" z: b! W" F( {1 c
unsigned int packet_cout;* @5 ?+ C/ k& z6 B7 T5 `( b5 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
Z% K- R6 Y' x6 V9 v ]6 e8 U& k) B7 B4 [: p
void read_MSG_buffer(int *baseaddr);7 {. N( l/ z, T2 W
unsigned int count_copy = 0;
$ B+ @/ i# t/ e- T! G1 J# l2 n& V+ k5 w
int main()
% }; y0 }$ s( v2 z9 j2 J{
3 x3 W/ M* ]) x) p' x/ H int fd;" Z9 M% Z4 t0 c; ~$ T
int *mem = NULL;
) i3 W1 m q3 y
\9 G. p' ^' ]) b! y& [+ L" t if((fd = open("/dev/mem", O_RDWR)) <0)
, |5 K% K. z0 _ {
) q. d8 n# c8 L perror("open error");
, g k& Q0 o' K" t- A& x P return -1;
& W. ]% @. s3 y8 h( n }
0 c' ^ g' f, W& `7 p' t
# [ u9 n# E8 C# s ]9 | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' S0 h4 A t' \4 ~4 D- b* y( w! v2 N
while(1)
) C v8 i+ O* }$ j% ?4 O9 J# Q9 z: Y {
2 U) Z+ {; i$ i W# I read_MSG_buffer(mem);
" I. J5 D" \" ?9 \- F1 g } ; N0 V b) c$ w, r6 U0 ~4 z
}7 a/ ]% ?- b) d& E* o3 \$ T
. u% P4 a+ c$ H% @ p% Svoid read_MSG_buffer(int *baseaddr)
3 X5 m3 e* Y) P{- D% ^6 L' A- q2 j) j- ^* u# I6 C
pRX_MSG_PROTOCOL pshreRAM = NULL;
: O: U- z& l0 q! \: w) |
; o2 E' P: _% ^# P) z! w. S m pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
A, |9 k! q+ V' S! V4 G
: l# z$ T& ]1 t- v$ l; M: } if(pshreRAM->packet_cout != count_copy)+ {0 s% X9 J) o! K
{) b( w5 E% L9 q+ X. m& a( t3 E7 c# X
printf("a is %d\n", pshreRAM->a);+ ?6 k6 h7 |1 G, Y0 H" E
printf("b is %d\n", pshreRAM->b);( d8 A! Z; I, p& f
printf("count is %d\n", pshreRAM->packet_cout);( t5 I% L. P# g5 E) u0 D# N7 I
count_copy = pshreRAM->packet_cout;2 H9 Z1 z" C1 _+ }: |* G3 I
}2 a3 S. @8 B( y
else
: G& U: w; B# Y0 ~/ N {/ Q4 |6 M4 R2 J
printf("No effective message!\n");
$ _) ~. K- e d |% ]4 a }
& d/ {, D. j! @/ R9 ^}- ?; V% | F; C! ^( u- x+ u
3 X$ g8 f+ B4 u* c+ s) c8 A9 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 i% _' x, s6 @3 f3 L; g* u( n
+ B- q+ r- z# w" M6 H; E1 M" `, O+ z* f5 D- q5 b
8 z, m; w+ N; v) v+ Z4 u" p- q! A4 x. j# M' d8 L$ L
|
|