嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 [% c6 j- ?( ~3 }( M
) g8 x' h& B3 f- h _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 v" K$ r# K" F3 C+ o0 n- {
#include <unistd.h>
9 z) }2 M. C! \; w1 c
#include <sys/mman.h>
7 Q* @2 V$ o6 _- V& x! d% o
#include <sys/types.h>
% y4 c6 J* E4 i" @) C; W6 f
#include <fcntl.h>
# @; ?9 p5 v' U
3 `7 U- a# l+ u. {+ s0 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 S' ?6 R8 ]. @; ?/ K: j
) S. L, V9 B. ?" W: O
typedef struct
o( C& O- a) f# k4 A$ K Y
{
+ R* s3 C* z; M2 b, l$ ]( P
unsigned int a;
6 S5 m3 _! W1 E
unsigned int b;
' J& P! c6 r/ Z# n
unsigned int packet_cout;
4 J+ U! Q+ \8 }* D/ }/ h6 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" p9 d5 E3 R; m: c3 O3 f
3 K/ C: |( v' s9 L. }' }$ ~* X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 ]) p! i' D( S& u8 b' i$ O. k+ b
unsigned int count_copy = 0;
; Q, I; E3 }+ E, L$ k/ L
: O4 z2 n: R/ ]3 L2 F
6 J* D( _3 ]7 s! G6 Q
int main()
% q* z) n* N" V) }
{
" x9 }: ]' E8 b5 n% |2 T6 U7 \$ ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ N. ^; D) S# G, N
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# V8 a4 V0 F7 F& T- m1 e3 j$ N
. [+ W7 U& w, d7 G& ?, m
while(1)
! M5 o. t4 ]2 o/ `/ u
{
/ U. \3 |# e; U c& N# m" _4 ]
read_MSG_buffer(pshreRAM);
6 I0 l) p. f( @. p
}
) D& L& g! \- h: l1 C, B) H4 F
}
% r; Q* y; n6 Z3 _+ W+ w
7 R2 B# R' Z* E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 O# m0 o+ p( {/ k3 |- n" _
{
' c. P- p+ ?) X, L/ _! g9 V' _
RX_MSG_PROTOCOL buf;
* J, o+ ?: s' ~
& D+ {3 R5 w. @( X+ ~. D
buf.a = pshreRAM->a;
4 j% m' y1 \1 u7 |1 k3 I* [; E8 ^
buf.b = pshreRAM->b;
- |( w- G7 U3 B
buf.packet_cout = pshreRAM->packet_cout;
$ u* b2 C6 I! O. o# K
) I3 p- M4 o2 L6 V
if(buf.packet_cout != count_copy)
* r9 `3 L7 Q1 c& B j+ I$ l- _
{
# s+ K+ c: r' D& p, l/ d+ H; d
printf("a is %d\n", buf.a);
3 r& M8 b: k4 n4 Z8 ^
printf("b is %d\n", buf.b);
+ H# D" I) ~0 }5 `7 n( g
printf("count is %d\n", buf.packet_cout);
9 n- z; J2 D# }1 R, s! t2 z) A
count_copy = buf.packet_cout;
9 c) d+ f2 e" y6 x1 Z, f$ B0 ~
}
5 u# o* u" k. W% S- c
else
( H, h% r/ I, e- Y$ T- Y+ V8 L
{
+ h K: x1 h! S1 P I2 r
printf("No effective message!");
( | b- Q7 S$ o2 Z
}
/ v# I0 h g. I1 ]
}
( V( s$ W! o2 {7 ~( f; Q
! C0 j. g! u0 j! u% x9 }4 g3 C9 h
4 m4 @9 @4 t3 e0 b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 x9 l& J7 z; M- R7 @! S
使用下面代码,对内存使用了mmap函数后:
/ ~2 |+ V0 C9 J* f" f, @
#include <stdio.h>
0 Z9 O/ D8 ~+ ?, Q" \) D
#include <unistd.h>
+ A+ ^2 |% w0 R4 J& f( e8 W- \( A
#include <sys/mman.h>
7 |# t! M( t8 I9 A4 h9 o: a
#include <sys/types.h>
: L. a e1 |% s& j# K: N8 }& u! ~
#include <fcntl.h>
4 A' w x+ }. Z/ M7 k" N
1 S1 ~ P$ I7 j
#define SHAER_RAM_BASE_ADDR (0x80000000)
" P! T$ A9 K' W- F
#define SHAER_RAM_SIZE (0x20000)
$ s) x Y1 `* l, d$ U/ ?. Y3 n
$ Y8 w+ d+ V$ W
typedef struct
2 d# A# a3 R3 q5 Y8 h- B2 E# p
{
$ ~/ _- N, `# p! n ]: ^
unsigned int a;
3 r( L; p/ t- A: p- k" c5 t- J/ U
unsigned int b;
6 a: l% p! a8 G. c2 M
unsigned int packet_cout;
. {, O$ W$ M: n. R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( ]3 u" h2 ?+ g6 M: @) N
& G9 g- |5 Y1 L) [4 F
void read_MSG_buffer(int *baseaddr);
1 _: q9 P J x# F
unsigned int count_copy = 0;
0 x* [# l# b% ?3 ]
) O0 ^0 A M! U7 V9 ]! A
int main()
- N: v( O5 T0 O, f% t) M
{
- X0 w1 l4 W0 G3 K5 u
int fd;
9 u* |* n3 q/ N" @' B7 M$ k
int *mem = NULL;
u% v* c0 Q. R0 z C5 A
: E$ D# a; g; C9 g; X7 {% }
if((fd = open("/dev/mem", O_RDWR)) <0)
7 t0 p5 G( @. z* S( V
{
3 R8 P4 g# Q. f' k
perror("open error");
" `9 w4 K1 L( w9 w3 u9 g
return -1;
+ O: {% d2 _' b' A
}
) H( G ]3 n* {1 b* \) X
: ?% S/ I/ F" I b0 v5 h5 l% m0 X" d8 U+ T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) l5 v( I% i( S; A6 N
; U0 _/ X2 _% Y% }
while(1)
7 l' f5 T' X! |0 q5 Y* v5 O" ~
{
; e* i' {2 J1 E l. K
read_MSG_buffer(mem);
8 X+ K+ \ Q3 G
}
; V; }! q) V1 }5 B4 h/ p
}
% K: H# f( a* ^: ~3 K7 [9 {# O
3 @5 S: g. u9 T" D) f
void read_MSG_buffer(int *baseaddr)
1 E1 ^: r, z) c" N) ^
{
) g( `5 h1 B, e* K/ v
pRX_MSG_PROTOCOL pshreRAM = NULL;
: w0 _$ y" N' {3 T0 K
" Z- M9 V: | a0 y9 k% S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" e$ s* Y ]( Q! N3 [
8 E5 z8 ?0 G, v) L4 m
if(pshreRAM->packet_cout != count_copy)
* b0 ]4 L* P' j2 ]
{
" ]$ m# P. p+ O2 B- |+ w6 T1 }
printf("a is %d\n", pshreRAM->a);
8 u) X; x: Y0 M, |# \& l0 i2 o5 L
printf("b is %d\n", pshreRAM->b);
) V! {+ q; p1 z$ h2 y
printf("count is %d\n", pshreRAM->packet_cout);
& q; n1 R" Z& g3 ^
count_copy = pshreRAM->packet_cout;
- r9 F6 q4 V+ j+ b
}
2 f2 P3 z$ J, C# n4 F% \
else
& V3 w3 ^9 G: Y/ u+ w% e; u
{
Z+ |& c/ ?2 a0 R5 A- n
printf("No effective message!\n");
0 k5 s+ e" r. M. b
}
8 u3 e+ w$ Q! g
}
0 t! K3 u$ W3 M/ [! _
( Q7 R' Z" {+ E: s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% j7 c4 z6 L' Y0 S$ o
, o0 H+ g3 h/ |, T& o
9 W# o# }8 b5 |6 w. h
$ x5 z: A! X" W# o5 D
' z5 S6 X; O6 ^/ ]
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4