嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# G" z4 z& f {9 l
2 z# s3 s9 I! L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 W5 h% `5 C- c( E" t9 X
#include <unistd.h>
3 z% d6 P- J% e
#include <sys/mman.h>
0 }* E/ w( ]% e; x, f
#include <sys/types.h>
P- n9 p4 b9 b) H+ z% W
#include <fcntl.h>
1 z* f' t3 S. q8 E! U
5 p. y, r( c7 L$ E& r/ E9 w( n, n
#define SHAER_RAM_BASE_ADDR (0x80000000)
" t) V8 y+ T! Q
$ I" X% U$ V6 P5 L% Q
typedef struct
5 `' q* c7 L" u; A0 U% M
{
, W i0 B5 \: n) r' {
unsigned int a;
j- r0 z) r7 n5 ]* ]2 d8 W; `
unsigned int b;
) p2 H: w$ {0 p+ |' G' N
unsigned int packet_cout;
2 _+ \; k* _6 Q; N* K, q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' Y$ H8 F0 y* k! u5 U$ D, B& R
$ y. v0 s% K2 O- a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 u. m7 ?6 E$ f2 X2 I8 o' q6 _
unsigned int count_copy = 0;
: n- e6 g2 i7 I9 w
+ A2 K4 ]6 j& }! Y5 x' \
% H& v8 W! U1 c" d' L0 f
int main()
) {5 a6 X7 B1 B+ i8 {
{
: C R2 F1 l9 c
pRX_MSG_PROTOCOL pshreRAM = NULL;
( [& Y0 \- }# c7 ?/ {. ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 H5 ?. H- m( C) v% t0 j
( ~0 N# d$ F. C. M( {6 P
while(1)
5 ^: s6 C( g7 j$ r/ r8 H( a" S& Z+ O% W
{
/ f( J ]8 ] d5 f
read_MSG_buffer(pshreRAM);
& b4 r2 Z5 W+ ^
}
' p9 }, y0 g8 Z- F/ i
}
' s1 i/ O7 n- `/ m
' O8 l+ V, i) a/ ?4 c+ _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& @# B, D, A' N1 q
{
% ^2 M" ?5 b9 o; O1 x% w3 r ^
RX_MSG_PROTOCOL buf;
: z6 f% x# h+ K e( ^
9 ~, T2 ?' T$ {0 E ~+ ?
buf.a = pshreRAM->a;
( E0 U8 c1 t9 c( U9 K9 B# p* Q
buf.b = pshreRAM->b;
* P [6 _6 u# u% ]) r' j
buf.packet_cout = pshreRAM->packet_cout;
/ S/ d* n# |; y, [
9 g* I* L! }( B0 P
if(buf.packet_cout != count_copy)
. r0 {( Y e0 ] `! ~; f- h" I
{
3 p! j* X* q% t- o. C
printf("a is %d\n", buf.a);
4 T( j, S" B$ F) ? b* H o
printf("b is %d\n", buf.b);
1 @* q! u4 }* O$ K/ o! ~
printf("count is %d\n", buf.packet_cout);
4 W. {0 i! a* B& H
count_copy = buf.packet_cout;
& ]6 S4 r- B" X5 Z( t3 u
}
. q) w4 [- \) B1 e/ s
else
6 Z2 `! j$ S3 I& A3 _3 N
{
) c. p7 W1 r: L/ S* I! @& b" h
printf("No effective message!");
& X" E! b; M& |4 e0 V
}
+ L4 C }( L3 q) J& L: b
}
, c! _; W6 ?3 s& L
1 j0 [$ t3 q5 u
! y$ [. N/ u1 }& l' ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! d7 O+ J ^& h+ D0 L! }
使用下面代码,对内存使用了mmap函数后:
: N h9 g& K* E5 B! s4 o
#include <stdio.h>
E7 y( g3 O' ?* w( C/ D6 O
#include <unistd.h>
/ a+ a3 E4 `' f5 w" s
#include <sys/mman.h>
! h! r/ Y, ^- A1 b3 ~
#include <sys/types.h>
& Z' k& b, I5 b4 M6 T
#include <fcntl.h>
$ J1 X$ U0 [5 |+ [; k/ }$ X( K& G
% `, a3 S9 o* U! Z2 y
#define SHAER_RAM_BASE_ADDR (0x80000000)
U6 X" k# @9 j
#define SHAER_RAM_SIZE (0x20000)
2 d7 n* @0 P5 u1 v9 g
0 \# L. I6 P; g% m2 Z! U8 U3 A) I$ k
typedef struct
) ~% o' e1 \& Y0 C
{
7 H0 ~* a Z, L' r( f
unsigned int a;
2 z* h: F/ C* r$ c* i
unsigned int b;
, N. ~6 H6 r% g* d. Q- a v- I- N* W
unsigned int packet_cout;
4 O. K1 `* }4 s6 d) w4 Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ t' n: G) t% |8 w" W3 W! e! ]
- W( e- ]" l& u$ y
void read_MSG_buffer(int *baseaddr);
- E% d7 k5 b1 u" D/ C* l* j! U
unsigned int count_copy = 0;
. v8 W. r! k/ L7 N" ?6 z+ Q" g
; p, J. G7 B! G$ `
int main()
3 W4 P- r7 V' q
{
; k) `8 ~) ?, I
int fd;
3 Y" ^& z; H+ ]( l9 L
int *mem = NULL;
# y: t6 [ {7 @& p! V
0 y& T+ d9 w1 L. G2 f' T2 B" z& z
if((fd = open("/dev/mem", O_RDWR)) <0)
6 i# R; ^% ?0 E) X
{
( B) n" f7 I$ x. Z; \9 e g) c; }' |
perror("open error");
( K" f _4 p6 N0 d! q8 m- q' t9 B
return -1;
- T3 B/ j$ \+ c$ o8 e- {3 w& L
}
1 Y( T1 e& p( a: s6 D' q& Z, f( S e
/ I$ X/ t0 G. a% G9 @, h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; M; d/ E2 l+ q* W7 C) \. ~3 }5 [
* p# y/ q. D8 c/ y
while(1)
" j, s" r# ?7 d7 x7 N; Z. T! L
{
8 {& V0 P/ M( u, U& v e6 i" x1 B" a
read_MSG_buffer(mem);
. n+ _) ?1 B) u& l' J) h# q
}
' N* T- O* C L6 x, L9 s( ^
}
9 c9 C- s' w. u" M4 C+ k5 r7 i
: I* ?1 v9 p9 U0 S7 Z
void read_MSG_buffer(int *baseaddr)
% O- k7 [$ y1 ~, M) G' m* q8 _
{
& Z% Q( p' V2 j9 J5 f* S7 |
pRX_MSG_PROTOCOL pshreRAM = NULL;
" s# z2 V; X+ o" ~) Q. A0 w
7 `/ v# t3 f+ r4 v% T% R
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 b) g' S0 N* G3 q$ n6 l; ?
8 J: _ s2 J( x9 e8 g2 W% y! J
if(pshreRAM->packet_cout != count_copy)
7 {& V# Q( y! D: } e9 O
{
0 `9 _, A+ k0 c, R9 I' B( y
printf("a is %d\n", pshreRAM->a);
: |! y7 F$ {% s" L$ s& ^( S
printf("b is %d\n", pshreRAM->b);
. J; L0 v0 [/ Y* j8 _
printf("count is %d\n", pshreRAM->packet_cout);
- e) E4 e! V) h+ {* w
count_copy = pshreRAM->packet_cout;
8 u1 F4 _) W5 H! \' M
}
$ H! s' v Q6 M+ K1 Y
else
- f; ~ H+ ^; J8 @/ M
{
; T& k1 o: K' I: t* r% r
printf("No effective message!\n");
' s9 g+ _* {& L3 @5 p, g
}
; K; o$ R+ t. B w9 r: b1 I
}
+ ^: W4 u/ r* K3 w! @
7 v2 |% _3 x1 `# W7 d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 F4 Q) W9 N0 Z$ z
3 w% C* d' ?& A
# K# `6 W9 I8 N! f. a, i+ Y
# E7 o4 G7 a, I
) _! c0 Y, x3 a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4