|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 B8 k" l4 L/ L/ y0 J6 }4 B
6 T9 W# S8 |$ POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ B7 T2 o6 `* _' c, T8 P$ F#include <unistd.h>
4 D" q' N9 Z/ V) Z#include <sys/mman.h>. r0 B6 T( [) q9 x- ^- A
#include <sys/types.h>( [9 \0 Z6 I L& `
#include <fcntl.h>0 Z7 \# m$ e2 o+ H4 B# s
* z7 g9 J) w" o6 x#define SHAER_RAM_BASE_ADDR (0x80000000)
- A# K7 i: b4 y3 S5 L" P
# g! s- C) M8 j% v4 v' y7 Ntypedef struct) T2 o( z3 G' }7 K* Q
{
% ~/ N* U& W8 g! r unsigned int a;
& F( B+ z! n/ Z unsigned int b;
, |$ d) g3 e( M8 F) I* I unsigned int packet_cout;
7 c( ~% ?. u$ E& Q/ K% I* O) H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) e6 u7 N( w* y1 J3 \7 Q) a3 I. y W# Z& v4 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& R7 N7 h% {9 N! `% s% Y% [
unsigned int count_copy = 0;
2 a# K7 [ N) M x4 Z( Z
" N& T! g: H) k' ~. g0 N+ m- w" V% Q1 ?! j9 u
int main()
4 S0 P Q0 ^& J* e. e{
* M9 f, A4 [ B pRX_MSG_PROTOCOL pshreRAM = NULL;6 s! H5 _8 ~2 o c' y$ [/ R
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% \) U* o0 d- ^
0 X X. R5 }! Z while(1)
# D% M4 @1 b% M' X7 b; n4 Z+ E {
. y! j* |9 z4 o& ]! l read_MSG_buffer(pshreRAM);
: I5 F# i, Z. O" d1 `, u* R } 5 s! r- E8 g- T
}% F: D) i4 T3 R- \4 a# t2 f) G
! y1 C9 w9 E* V# s- pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 H2 S' ~$ W3 l# z; M7 c{
6 g" ?' h! s4 [* Y9 i2 P RX_MSG_PROTOCOL buf;
$ I( S( |/ C! e8 h1 C" w# l1 P
8 y1 V4 t& r1 Q5 K6 s/ v: y7 i0 S buf.a = pshreRAM->a;
* D$ y1 R" N- y2 S( d buf.b = pshreRAM->b;
0 Z2 d# R4 j! S2 j$ q$ b& |" ~ buf.packet_cout = pshreRAM->packet_cout;
1 E0 h7 b" i l9 f; G' b# C . J" ]! R5 E6 Y c: m6 D
if(buf.packet_cout != count_copy)
6 ?) C! I0 X6 f3 O8 ~: X8 _/ D/ [ {: N- M1 M8 ]+ | |
printf("a is %d\n", buf.a);8 c6 w+ I% h* _! P4 X& Y
printf("b is %d\n", buf.b);6 p W& U* q$ e5 i" Q& `
printf("count is %d\n", buf.packet_cout);! y# y9 S6 M! d9 {3 f0 E
count_copy = buf.packet_cout;7 c+ b; `3 k. f/ O L& c
}
" V7 d, \, {/ J8 E; _2 W else
9 m+ j0 o, I2 l7 F! i$ G0 d% e {
! Q5 T1 R3 k- |3 t printf("No effective message!");
. y8 [. [! X/ W+ l- c }+ i) i5 C# K% \" s5 M& N
}6 a( M- Z1 A- o: O0 r8 k
1 Q2 _7 C3 I6 q- `* M1 J2 _
% ~2 b' J; W2 h8 `- G. C9 U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# y- F( B0 P1 y% a2 U+ ~
使用下面代码,对内存使用了mmap函数后:
% y6 V* L; s+ I' Y4 w2 E#include <stdio.h>% f$ n. z* f/ O$ I
#include <unistd.h>
* I& \* c$ L, H5 P$ R#include <sys/mman.h>6 K- a0 ?& b" Q: p. M4 V
#include <sys/types.h>; X# I8 D @4 I. e! Z4 \- e5 r
#include <fcntl.h>8 v4 E: D. ^5 S5 y% u
% i5 O+ O2 x. L' U5 U#define SHAER_RAM_BASE_ADDR (0x80000000)
6 S- d/ `0 I0 D+ `# u, u/ k5 q#define SHAER_RAM_SIZE (0x20000)
) S" V7 g$ k/ }7 I, H
+ S( O& X# Z6 @0 W9 j4 k) Q2 {typedef struct l6 O% D. h+ V. @
{+ M5 \* c$ o5 t1 j3 ?, d0 U* C; o' n
unsigned int a;6 n" w5 X6 h2 Q2 i9 F$ o
unsigned int b;
! L1 e" X6 y6 E- F% y/ s" q unsigned int packet_cout;8 s5 g& z" a* p8 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ ]2 @ m& W) ]2 ?5 j
( F/ b6 _2 ~0 f1 Mvoid read_MSG_buffer(int *baseaddr);
l+ W. S4 X: m5 h& `unsigned int count_copy = 0;3 A3 C- g: ^- \& w
5 y5 u1 l* G5 W
int main()
]8 V& p" M2 }# j{2 @3 R9 G7 b# f8 k4 Z0 M
int fd;
9 V( Y" \& p @5 i$ G" i: L, n int *mem = NULL;$ h: ~! y6 |# f( F4 x* ]- p
4 J' F% U @! w) c if((fd = open("/dev/mem", O_RDWR)) <0)
$ B" L( G' A& ?: _" z& p, { n {+ B1 Z2 ?* W/ W2 B) S$ C9 d
perror("open error");. e; E+ L Q/ b* t, H# B+ A0 L& h
return -1;, X3 N5 q. O1 C2 S+ k6 L
}
- M5 ]8 H* x+ H+ x8 ], @ $ V' D8 h7 M* e
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ g, ]! Y3 s/ T, h2 ?/ N$ n) ~/ o. G0 P$ m. @! ]2 |4 Z
while(1)
: b; V Q$ y! n3 R3 Z {; J) {: q- Q' E+ f9 Z/ e
read_MSG_buffer(mem);
9 p! u& S: C- k$ w- V/ T8 _ }
+ J! O% Y; X* r! N" P}, ^6 o! i7 q; O0 v7 Q- B6 ^$ s
& C- a! A/ c* J5 Fvoid read_MSG_buffer(int *baseaddr): Y8 w2 ~5 g/ h% P7 k
{- m. Y0 z8 t$ P7 f
pRX_MSG_PROTOCOL pshreRAM = NULL;; T( [0 r/ | r
7 _1 {+ @" }" L. d pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ Y, d6 M6 y, U, Z
. C2 b1 e& D) y ]9 H$ a if(pshreRAM->packet_cout != count_copy)
0 \4 C+ K2 C) e/ l4 q' ^( _ {8 L# [$ X" n" A! M
printf("a is %d\n", pshreRAM->a);
3 L% {0 J) p% q$ k5 c7 i7 t y printf("b is %d\n", pshreRAM->b);
8 X$ c q) H3 ^8 d$ C/ g/ m( J) {( w printf("count is %d\n", pshreRAM->packet_cout);
( n ^5 w+ a3 ]# x; ~ count_copy = pshreRAM->packet_cout;
( L) ]6 x: Z6 U$ f x7 B }
1 S& X- V, s+ W7 [+ l" d0 z4 K else) Y, c, A. `2 H4 o6 R, r0 q
{4 x3 A0 E& e( H$ N
printf("No effective message!\n");1 g! w# ~ e1 N: Z
}
( Z! |5 W7 {; ?8 v y2 e5 _}
4 c$ o7 X+ s" G* o
" c4 k' a, U4 K0 k9 A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- R& R$ @$ J. N. N( w% i0 C4 b C, @+ t
4 z. g0 {& |; x) @ u' T! t2 y+ Y$ n
! k) L# d6 K+ J2 P4 T4 @) ^0 L |
|