|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 U7 D. H4 H, s9 u
# H7 `! i' t3 }; J3 G# a0 F) |- n3 ZOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 r6 \& C2 \9 A* H; L: p- L#include <unistd.h>
' L* Y, a) f: G+ `0 j( n#include <sys/mman.h>
E7 _" S4 {3 _8 h2 j; V#include <sys/types.h>
5 c7 h ~+ f; d% y' ^8 A5 q#include <fcntl.h>
) s7 x- ~; ]3 E4 D( O2 X" m; Z
* P8 b( T( g2 B- g! U$ }1 X1 c#define SHAER_RAM_BASE_ADDR (0x80000000)
+ n# `; x! w$ X( W' t3 W& {# G* ^* Y) X( Z l: M' h: w; [' b. }
typedef struct
~+ S! N% o8 M( U. e% y{# J' p) ~; B' V( x
unsigned int a;
! q9 f7 ]: X. L$ |- [: g( G unsigned int b;
. d, E! C x1 H h# N1 X, U( ~ unsigned int packet_cout;
3 y/ s( d- `* `0 f/ `: @6 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) P7 T8 h9 w% ]5 D- Q+ D
/ k9 ?# ?' W5 s" ?6 l2 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( W" Q) M% s5 g2 _% i2 dunsigned int count_copy = 0;3 L. h4 |$ m- i, n' q, R/ h
- g }+ g2 l1 M3 F: V
& Y, c u$ b; U7 J9 @ {$ Q9 l" g1 ]int main()
) B0 u! Q; u# T6 H( S& H8 q" C{
2 j# i" X7 N9 c9 R V! m2 | pRX_MSG_PROTOCOL pshreRAM = NULL;' d2 m# W6 q2 F" e- D; U! |$ P, d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 X% n- @: s7 p) D
8 P; L i; E2 M& J6 ]' c- ~. z while(1)$ C9 @% H! U7 H9 V
{/ A) O( y. s$ ]# O8 Z
read_MSG_buffer(pshreRAM);
- @& ?/ T0 U# w9 ?& E; c }
7 B! l$ N7 Y) m: G3 w: O}* m/ @& @" Y; Y: ?, A9 d1 {2 Y# Z
4 k( y" U+ J# r' c/ B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), y# k) m! z8 s# }9 k
{
, s& `! H4 A# Z7 m% x2 X RX_MSG_PROTOCOL buf;
) e ?; ?& P) w1 l/ u$ D+ E, r
% x ~7 {) y+ @ buf.a = pshreRAM->a;
/ s4 \% Q2 p. o buf.b = pshreRAM->b;% F/ l! _- X D1 D m& c
buf.packet_cout = pshreRAM->packet_cout;
. E" d; Y4 F- {. t; j/ v
! n! S* m; S: B. M- R if(buf.packet_cout != count_copy)
* w3 f: Q/ h0 H7 q# [! [. U { ~0 {9 n0 s6 A2 X/ t& q t: _
printf("a is %d\n", buf.a);$ e: R) m! P7 R/ `; L& U
printf("b is %d\n", buf.b);
6 | v+ S+ I% l# f$ T printf("count is %d\n", buf.packet_cout);- w- D( p4 ~ z: b2 @
count_copy = buf.packet_cout;) _( D* o, ]) c2 m! l( K3 M
}3 d3 b0 h) t* [; I4 ?
else( y6 l G; i+ ~9 H/ i
{; |3 D% v* k2 {
printf("No effective message!");+ S/ Q* N, X( y, g* W& I ~
}
3 O) h$ T+ S- N. W& V( W9 c1 ^}
; a# q0 V8 f, a
) n) Y2 J! Q0 x% u' [( }" A, ]) e, D4 s1 h: Q1 j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ N. e& R9 A) v' g( A5 ?使用下面代码,对内存使用了mmap函数后:+ S5 u B# o1 N0 A+ T
#include <stdio.h>5 W1 m+ c2 L; v* f9 M% Q" `
#include <unistd.h>) N7 J) k$ O! h
#include <sys/mman.h>( a) U7 b, z o3 w0 u& G1 J
#include <sys/types.h>$ h& L* x) \- S. {' v7 j5 {. z D
#include <fcntl.h>% c) l% b$ G \2 P c
4 [( A% y& T+ b+ s9 P4 u#define SHAER_RAM_BASE_ADDR (0x80000000)& P+ U4 a% X3 e: Y8 Z: M4 ~
#define SHAER_RAM_SIZE (0x20000) 0 X# X: S" S! F+ n
6 X j$ r% y; jtypedef struct" O, S0 W5 ?# Z7 D+ `1 @
{# f* o: N9 @: {; I: y E7 D
unsigned int a;
! i( E" p/ l& M unsigned int b;, L5 ~6 V9 G* H) h) K
unsigned int packet_cout;- e) l0 ?, z% j# p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" g5 ~* h2 g1 O2 W6 ?
# G5 U+ o% e5 V1 C9 J% }* @* g9 @void read_MSG_buffer(int *baseaddr);( t; i8 \/ k' _) M3 [
unsigned int count_copy = 0;
^8 g- j2 E' U+ B! h t
$ r3 G. y* ?" P Q% Cint main()
* a1 d. u; g# l3 R3 N{ B( N3 V* p/ {3 U, {9 ~ n, B
int fd;
5 ]% M( [# U5 j8 w) K int *mem = NULL;6 E: g/ L; ? _
" S* _. `3 \0 e; ?" q if((fd = open("/dev/mem", O_RDWR)) <0)
) y: P9 F# A& O: M" r# ^ {0 a8 |4 ^; v4 \9 `
perror("open error");
6 G9 V! Q9 s3 k, C' a- z return -1;
- m+ ?5 E7 u o2 ] }
4 `% z3 C& p6 r; z5 z+ I
" |- x7 z9 P+ w& k; B mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' U. u+ J$ z& M: s4 c2 x
0 S) Z) K2 ]5 |% E+ G0 B: U
while(1)9 l2 j' M* X- \' _9 ^! N
{0 ]( I- d+ j- Z0 Z
read_MSG_buffer(mem);- h1 S L7 M+ c4 i7 V# Z# t
} 8 g `1 D' p9 Q8 S5 Y. V' ~* l1 l( N
}% N* y, s- p9 I8 s0 U$ V4 J, [% l$ E: U
6 _# J' z" I; z2 S( F/ e G
void read_MSG_buffer(int *baseaddr)+ S. j( ?% l# p' P# q
{# K6 Q+ ^9 G/ p" y( j8 p3 y
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 w C$ d7 g! ?: @2 A9 U( W& p4 O6 w+ J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 y4 g X1 O) }% Y+ {. p
4 P6 ]% z1 {/ j1 s+ e2 O" ] if(pshreRAM->packet_cout != count_copy). m- `/ p2 F: }$ x6 I% s, [
{( k' G- V; S4 N: L! V
printf("a is %d\n", pshreRAM->a);
' x8 s: L% r7 H+ ? U2 ]% M. c4 G printf("b is %d\n", pshreRAM->b);& n8 @5 O5 s2 i6 L/ ^
printf("count is %d\n", pshreRAM->packet_cout);, y7 T$ j3 ^' Z3 B# u" W* n
count_copy = pshreRAM->packet_cout;: o" _, A, F& u
}: T* _9 g/ s( Y2 W: ~8 O
else( T" Y4 G" Q( |, g7 x6 J1 n# k
{
9 G- w1 G3 r- r, h3 H printf("No effective message!\n");
/ Q; b1 i. g" \8 n/ Q4 K7 \ }
+ J. Q" L2 @- Y}
3 H( y0 P7 `1 n* O* f8 \# B; o3 z/ L6 S( x; q& Y8 B4 D1 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 h6 f% x% @# P7 i. X' f4 i- u" T" \3 i* L# e& A
* O5 e' S5 X2 P' \
! ^1 J" y! S+ j! g+ x7 L6 U2 ?
" |# k7 [+ b! H0 m1 M8 R
|
|