嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ r1 M" C. K |
9 \7 P' T0 E' D% s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: U5 o' a0 r' y- `* y" q7 G
#include <unistd.h>
* H ~8 I) A2 Q( Q" q" l r4 M
#include <sys/mman.h>
/ l; [' Q" E4 e5 L0 ]
#include <sys/types.h>
+ B6 i; `5 g$ u& Z) `. K
#include <fcntl.h>
( H% r. j3 ^" `! p" ]& o' u: F, O
( i! h4 F9 f& Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
) U* a \3 e) m; C/ b! ] g0 \
/ U3 `& p$ W$ k2 O. y" J5 M
typedef struct
' J! [3 o! V- t2 G8 o* a
{
( M) J, |) N9 \0 b. H" X
unsigned int a;
& N4 M" m6 }0 |
unsigned int b;
2 G# C0 p8 b8 i) b
unsigned int packet_cout;
& s! g2 Y6 }! N# f0 m: {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. h7 w6 ~" P1 V% j
5 X* ~$ ?0 D& A- r8 |2 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 V9 F& U3 n8 p& ^4 X+ s* ]
unsigned int count_copy = 0;
, r) ~; g# u7 s$ V- j
( q P3 H: D7 c6 X+ S
) B C# P* a# T P, F' U, ~
int main()
* k! v2 m+ b+ _3 j$ z* \, ]
{
1 J/ v2 ~2 P! I$ k7 x5 [; B
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ q9 ]' p/ T$ } u9 Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ t) Z) \- Q1 q. X
% c \8 K9 P: E8 K/ z
while(1)
# h- U5 a# V/ a& b7 @- I d
{
@% B n6 ? Z. C, G9 A$ h
read_MSG_buffer(pshreRAM);
. A+ _1 M- Y g/ \- K& x
}
' G/ H4 O) Q9 {2 C" S5 z ?! j9 @8 q
}
6 C ~$ m5 i+ `# t. V
" }: m# B3 y- _6 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 Q8 u& E: ]! F/ v
{
/ \4 e& \$ v5 v$ w% i( i
RX_MSG_PROTOCOL buf;
4 c/ y7 q) L7 H$ `( Q) a& }
6 x0 U5 C5 |* b; A
buf.a = pshreRAM->a;
" O9 F$ r$ g: C. A9 O9 f
buf.b = pshreRAM->b;
0 \# Q# L, |! ?9 G& n, _, {- Z
buf.packet_cout = pshreRAM->packet_cout;
3 q9 h. o6 O x. T
' D: m9 i: _/ }8 `) q
if(buf.packet_cout != count_copy)
, a' Y8 m0 m a
{
7 M2 s$ z/ }8 F& D" w% k5 s
printf("a is %d\n", buf.a);
" V5 H; Z+ w- W
printf("b is %d\n", buf.b);
* ^; S1 Q' S3 N, _( I$ b
printf("count is %d\n", buf.packet_cout);
& `8 U$ G: k/ W0 U
count_copy = buf.packet_cout;
; l# l- }% w. b- J. w
}
$ H/ ]8 J7 H' V) a3 @6 z
else
" b9 _# I0 }) S5 P& E$ T
{
4 Z, @7 W% k; }. q6 i/ g7 }$ s
printf("No effective message!");
& O I$ ^) n, g Z
}
/ S5 h. } d# }/ ?
}
8 q9 @9 D: l, |7 v6 r M
, K+ L2 B0 Z7 _( o& J% y) r
! d# E/ S0 T+ K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 w. ]& F" c+ g" S% V8 H6 E: e/ a# K
使用下面代码,对内存使用了mmap函数后:
7 r3 ^* R! x# t6 q
#include <stdio.h>
/ y6 ^- v% I& J5 w! _
#include <unistd.h>
& |3 O$ c- b' u1 h! E! }
#include <sys/mman.h>
6 E/ J; i; \+ @3 ?/ r+ e( I
#include <sys/types.h>
0 r% F4 x' a9 P- ^9 U8 h8 K
#include <fcntl.h>
& G) l. W8 o. q: y* d" S9 P
, e" l3 M z" b) i! J3 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
" \ [9 x S7 x# h3 {/ s
#define SHAER_RAM_SIZE (0x20000)
) U/ \8 X& U2 r- G0 v* d- I0 l" n
4 j: h% e# V6 T) X i
typedef struct
9 Q- I! ?: G! ?1 e$ w# u
{
8 B! _$ \2 s# k& |& s6 B- i
unsigned int a;
& l; g8 S" _" u* R& x
unsigned int b;
2 {' f3 ^: S0 ^
unsigned int packet_cout;
' a' ?: u( v. D- U3 h. v! C, J3 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
a' L% |2 M4 e: L7 s4 z: Z
" U5 {' z0 S: }+ a
void read_MSG_buffer(int *baseaddr);
' {1 C0 d3 x. H3 X9 v; R
unsigned int count_copy = 0;
7 J2 M) b- H# [8 X8 D" r
6 a7 g3 E3 M9 l) z: j; Y6 H
int main()
7 [4 e9 j5 _( t* ]: K' x
{
- c2 Z% \$ c2 D8 X' S% e4 T; f" p
int fd;
0 M+ v" }. L9 {5 }+ A
int *mem = NULL;
7 r& ?4 K8 [3 Y g Q/ P
5 Z! N W2 p2 u- \ \1 Z0 M
if((fd = open("/dev/mem", O_RDWR)) <0)
$ Q& p, ?. Q! e& r* S# m$ |( A
{
: ?% a; B3 ~1 { F* P
perror("open error");
& x5 r( Q0 ~& L( m
return -1;
- ?2 c4 w7 j; l5 z5 @0 p
}
* L- S4 Y3 j/ ]0 {/ U5 |& o. t
0 h5 F! {- w5 E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( G, O+ Q. u8 X8 F0 Y
2 R j$ _) F* w* W+ {
while(1)
6 X e+ @; F5 \" X' z5 A# I
{
3 U4 F0 R5 Y" n( o# k& _5 h
read_MSG_buffer(mem);
" o" _2 ?. |: _+ T5 k" g) s) L k
}
2 l" G1 }- {6 a2 O. B
}
8 {9 F; E0 Y$ }& [8 K4 }: P
) k! t& ]3 R+ Y3 p$ J
void read_MSG_buffer(int *baseaddr)
& k% l; ~3 d C- }2 ?& C
{
; [3 d8 K7 B, g" B P
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 z2 P) D0 {, h. |
8 ^ u5 Z, J1 R V( j* b4 y2 Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( [& R5 U& d. O% a @# s0 `' ~
7 g# t9 m4 W6 n! P8 z4 R
if(pshreRAM->packet_cout != count_copy)
$ R. l! `/ P. O
{
6 I" j9 w. P; l/ ~
printf("a is %d\n", pshreRAM->a);
, H' \* ~8 ?" K* z+ S8 @; r
printf("b is %d\n", pshreRAM->b);
; S2 d: Y8 ]" h" d- _ n. T
printf("count is %d\n", pshreRAM->packet_cout);
$ g( \' m8 O. g- P6 T8 K5 z" x* `
count_copy = pshreRAM->packet_cout;
* S; V2 p/ n3 m3 g- |! d5 H/ o
}
& V4 m( m* L' N4 p; E( K1 N
else
- C- v1 o* P$ u. z, s7 \6 z
{
/ X& o( X/ T9 \: m8 o) N5 G
printf("No effective message!\n");
( u* R4 F: `& @9 X
}
; w& t% |8 J2 \/ O* U
}
( T4 t' D6 |) S6 Z( R1 i
: X8 L* P" s4 u1 Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 n+ y& F1 y# m$ A
W. X+ r4 m. D4 O
, w6 X1 u7 ?. ?1 a$ g
1 P" ~' U. E& b$ S* B! c
[3 {+ m' _! x* n. x
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4