|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 r% M' i1 s, B! p8 B; F
3 c' L; P% o1 K4 \7 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 J$ G( T0 }' I- w8 u& D- N#include <unistd.h>
4 \+ P3 x6 m% O. s3 u#include <sys/mman.h>) M- w% b* P+ C M
#include <sys/types.h>6 c0 r. \& E8 h* e% y( D
#include <fcntl.h>
5 C9 [3 x# l* Z: M3 S+ d; \7 q
3 Q S( w! X4 F" N' z/ S. Y#define SHAER_RAM_BASE_ADDR (0x80000000)
# d- G; M) z" H/ G
) X$ I& T+ i! K; g" Atypedef struct
, I8 b, a" g) S. ~2 D{
J. _+ a# c4 F9 L1 e$ I$ O% Q2 _ unsigned int a;
; I% r. ~! d# u unsigned int b; V5 H- S+ b8 b3 d+ p
unsigned int packet_cout;9 J' }; C; H. Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. P0 N5 z! e) ?8 ^' U
7 L2 V3 ]2 B9 {# C3 D# E2 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( u* b' v2 C% h, r( U1 ]
unsigned int count_copy = 0;6 x! b- o. h! C2 \
0 O* \: s2 J) h; d" t" e# s- y
- v' z/ G A8 z# A+ ^/ qint main(), e0 \$ j [8 m N: i
{
" u) y4 n9 Y+ u/ p; H pRX_MSG_PROTOCOL pshreRAM = NULL;$ \$ F/ i0 A* J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( d b" n1 l4 c% {6 s6 A# ^
: @8 q* P, f+ [* t4 g, v while(1)' B$ C2 T( x8 g6 h
{* ^4 Y" b9 G8 L q- k4 [* p
read_MSG_buffer(pshreRAM);" ?5 A- V8 r' y7 T2 j
}
# o7 N: l% P2 V% m/ R( l* R9 h} f+ o, J1 G! D, M1 x
* I- M% E% q4 _. H$ _4 i6 Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ E8 G6 z# y5 k. e# W5 b7 z
{
- X0 [; n6 M) m RX_MSG_PROTOCOL buf;
: g0 G- Z2 Y- t2 W! A ! p9 R8 X7 v' c: p5 P& P
buf.a = pshreRAM->a;
+ h) V/ s2 J- x% J buf.b = pshreRAM->b;
% g" u1 q8 N+ ?' h J1 J buf.packet_cout = pshreRAM->packet_cout;
8 Y, ?* Q7 F+ j6 F- I5 v7 ^
; a9 B( g6 R9 p4 o0 z if(buf.packet_cout != count_copy)
* Y) i& ~: n0 G# g% a( V$ g {# ?6 V8 x8 q2 b8 ^
printf("a is %d\n", buf.a);% y2 ~ @4 B! R2 z
printf("b is %d\n", buf.b);
2 }) K5 h( l) m3 P% O printf("count is %d\n", buf.packet_cout);
1 T9 h; t2 }& d1 J count_copy = buf.packet_cout;% p* e, u7 w! y& _/ j0 t
}
" l6 U1 ^( V9 h* e3 L, G/ j8 s else
; T' h, E: h# g" r- B {
( H5 i/ L1 ]+ z) b1 V printf("No effective message!");
' Y$ s) k+ n3 H' ~2 i& R: {1 Z }4 n2 f2 y6 a' ~4 V, _
}
7 ^) k b8 L- B2 T9 f" @& q( m4 v& I- P8 I& o& [- Z6 `7 b
Q3 ]) P4 T( k1 f4 E! V( Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 p' {/ O! x. d' j! [" [( h4 w* w2 e使用下面代码,对内存使用了mmap函数后:
* k! {& b' {$ q; e! A2 C, b#include <stdio.h>
# x! `3 {0 U. \" c3 r#include <unistd.h>
8 |! Z8 Z) Z6 m( h% A6 h! z#include <sys/mman.h>
8 A& ?; i+ f2 t#include <sys/types.h>
& z8 l* R5 D6 u6 }#include <fcntl.h>; a' l0 t; L% P2 {
+ l$ {( s5 \$ _5 s% f0 e#define SHAER_RAM_BASE_ADDR (0x80000000)
% c% A* h" ~5 P#define SHAER_RAM_SIZE (0x20000) M% z0 M# S: p, Z( B5 Y; W
! p% j9 C& f$ R6 G1 k' j: Ltypedef struct: ~4 R$ n1 i7 \- @: N' W1 S+ M
{
% U2 i4 Q6 b" w0 \) k1 C9 R9 q( \ unsigned int a;
0 R# Q$ O/ V4 l$ s unsigned int b;
: E4 c3 z/ p; ^0 e$ N' o1 K- k/ F" [ unsigned int packet_cout;
. U1 \) w/ _7 L1 ]4 O; r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 p5 {% Y0 w3 ~. C" [; V& l
0 C _- I6 M( x* ]) r, ~' [! rvoid read_MSG_buffer(int *baseaddr);5 O: J* R5 h9 P# v4 N6 u
unsigned int count_copy = 0;% a2 Z1 n9 u! L
7 V% l* s$ L, D; T% n) e7 a! t/ Vint main()$ y. [3 Y: w# R4 a( w/ G
{
9 {. k, d; K* N) m( w4 n" [ int fd;3 h p- v$ F- P8 i6 p
int *mem = NULL;
/ G6 w$ y# |7 n7 _% Q3 v3 I5 t- h! _+ N) b
if((fd = open("/dev/mem", O_RDWR)) <0)
7 \0 M5 h3 U$ t! @ {! T5 J7 g9 a9 z( R6 R/ f
perror("open error");
- v z% h1 J0 @3 W7 L return -1;: `- {9 l% b) ]% I4 E) A
}5 Z q4 E; A6 O& N; t! r6 E1 G _6 L* @7 }
0 i- Q5 ^: z4 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* l" E. |9 P2 Y! U+ J3 B; R
8 ]7 G/ c% g, v( u
while(1): ?0 m3 ?4 d g+ Y9 Q
{
0 m* K, N. B2 q* G. o read_MSG_buffer(mem);% G2 f z- Y1 S* l/ I$ q
} 4 a5 ]/ S8 [; {! M
}7 q( r3 `6 F/ Z4 K/ X
; q8 N6 j' c# u9 c2 ]void read_MSG_buffer(int *baseaddr)* h( P& U9 ?. t7 v& p, @
{4 o) W/ ]. ~) [9 s- |! t! E
pRX_MSG_PROTOCOL pshreRAM = NULL;0 N# ]/ F/ e7 g* L% E: p5 |8 Y( X
. R) t/ I1 k) I5 r( ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* T- p0 _8 |/ z6 O& O! r$ K6 n f4 @; z
if(pshreRAM->packet_cout != count_copy), N8 ?- a* a5 C- j& @4 L7 w9 z
{
~5 c k$ ~$ [ printf("a is %d\n", pshreRAM->a);# V8 u5 U: u% N+ g
printf("b is %d\n", pshreRAM->b);! u$ w, ]! `6 `) U9 J
printf("count is %d\n", pshreRAM->packet_cout);2 g+ k2 ]% y- t+ j$ I# n( o% R
count_copy = pshreRAM->packet_cout;( w9 R5 B" i( W" F1 ?; q9 o
}5 i0 K6 F4 [# [4 @
else
6 n6 d0 J- S3 m {, B5 w( S# a0 Y ]% X
printf("No effective message!\n");
7 Z+ X$ ?( ]! n) ]1 z/ v# g }
. v6 r" G" D) I" K* c8 \+ ^}
) J) B. p' }% P" j& ]
2 _, N3 E- [* f e, C. q3 ^; l没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) Z8 ~0 Y. [+ R9 H( S; R9 B0 g! |: a2 e) C! }$ C
' w# Q6 x2 V$ w
% } S6 T8 \. k* z) P- A! _
# q( T+ k w2 s6 j2 I y |
|