嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; D( m. I; R! ^3 E8 J2 Y
! m, X8 T: R' ?# I* O: [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% D I r8 ?7 S; M' u" \( S
#include <unistd.h>
0 b8 y5 ~+ H+ J" s2 ~. s' c
#include <sys/mman.h>
" r* ?9 V; c0 @
#include <sys/types.h>
' _3 I- \5 E/ }0 b, }% p# b, B* f% Z
#include <fcntl.h>
: n* _" |: b; h% F& f E. e# _0 h9 ^
( ]: R2 v( w$ `" [. X/ [
#define SHAER_RAM_BASE_ADDR (0x80000000)
A! T* r8 ~" w0 l: i3 w o! I3 o
% X+ l( g) s; N0 B0 S! Y
typedef struct
7 r; f- c4 F) b) J
{
. b. p7 R8 `. A) V
unsigned int a;
. I S' V" ?- t' g
unsigned int b;
b* s+ q0 \, O2 E# _
unsigned int packet_cout;
* ~7 _. U! ]$ D( g( W6 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* J$ i" F4 T' K& e: X: |2 }) U0 L6 j
, a! L% Q G* d- [; h( g0 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 | Q& S( |) x0 e; ^2 m9 ^
unsigned int count_copy = 0;
$ M" o( Y( i5 l8 Y5 @
- C' m9 u/ O2 H
% D* B/ H% M0 o$ Y$ _6 {% `. q @7 S
int main()
* d1 |: g$ H+ K
{
0 P6 V1 d+ A0 [1 H
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ j2 y& d2 h6 }' d4 W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ M& A/ S5 s ]
4 S* k9 g4 B' p8 R+ {. i. y
while(1)
: D l4 E. H4 v+ L
{
; {3 b8 I; ?2 @) q4 P# }
read_MSG_buffer(pshreRAM);
/ s& o: B6 Q0 B
}
! @& m- S( b: @) }, P1 G
}
# p! s9 S! h5 ?5 `1 q! Y4 ~
, D5 J/ t4 Y! x. z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- S- l. _$ _' x0 E% G
{
. e8 c3 U* @" w" ~
RX_MSG_PROTOCOL buf;
& k( x) N* V- ]2 U$ y
; l8 g" y; o9 b/ u; i
buf.a = pshreRAM->a;
3 m7 K4 o5 u1 N
buf.b = pshreRAM->b;
4 S% k( g2 s+ g
buf.packet_cout = pshreRAM->packet_cout;
( `( [& k- @0 [! |1 H6 I4 f( G
9 p* V8 _5 a+ k z/ ]
if(buf.packet_cout != count_copy)
9 Y2 s2 e! ~8 {, i; J3 D
{
, r U2 o# O6 q# d7 G5 @
printf("a is %d\n", buf.a);
) \9 H5 v; n! ]5 c" p* G
printf("b is %d\n", buf.b);
- i1 I( w( I' o! T: B9 [$ ?
printf("count is %d\n", buf.packet_cout);
" S2 _+ B, ^: A6 Q- k% x
count_copy = buf.packet_cout;
- I6 o! L$ Q" U6 w
}
% `1 k( o" b" c& u# e( i
else
; g0 g8 S5 X/ p* ]
{
8 K# Y: w1 _( ~' `, G6 F! N' J- r* B) i
printf("No effective message!");
# }; T e" T1 C2 r, v8 M0 _- L
}
6 Z5 E+ `6 M7 o/ o2 w3 @
}
9 H! i$ \, R- D2 u% J0 ?
! [- `) `' T5 \, ?
9 K6 H; o" V1 `5 Q6 j \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 O' ^% l5 t; |# T7 B7 V
使用下面代码,对内存使用了mmap函数后:
# {/ _* b- X& X H: a
#include <stdio.h>
& r+ T1 u3 M" I. I, X2 m
#include <unistd.h>
4 G! x# t& n- u6 o7 p L9 q
#include <sys/mman.h>
: P& ~9 Z; F2 a1 o* R1 L
#include <sys/types.h>
1 z' ^; x1 u7 v! y$ f4 K1 ^
#include <fcntl.h>
; k) |' H$ O: L3 a
. h8 t) s" A: x* k
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 h( I$ T- `- Z3 e
#define SHAER_RAM_SIZE (0x20000)
6 {1 r5 E- ] t, G% Y+ h6 r
1 T7 t2 I. ~4 Y5 W3 k
typedef struct
: j0 Z6 O' R1 \/ T( q
{
& Z* d7 U/ x# s- Y
unsigned int a;
: ?: }& F0 }; ]9 A" A
unsigned int b;
3 H. ?) T- p' e
unsigned int packet_cout;
: J! [2 U" ~' A: r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 ]6 B) C2 v% H& @% N
; c9 L- k, ]& @7 T
void read_MSG_buffer(int *baseaddr);
; D" g' [" h- E* v0 v2 ?% j
unsigned int count_copy = 0;
. Q2 w8 R6 ~! \1 l$ `2 m) I" S9 d
/ k5 Y' n! v' j( K
int main()
# m( W$ Z1 ]7 v' Q7 V2 B8 G
{
0 n9 q8 P1 \" P% S/ Q$ w0 z" \; j
int fd;
! m& M* Y4 F0 ]+ u9 G5 p
int *mem = NULL;
2 d+ K! m9 C4 h
- z: r) X, P" G) H) o# W, m
if((fd = open("/dev/mem", O_RDWR)) <0)
8 R& s6 q# {$ r# }4 {; p
{
! h( k A4 U# G$ x* i
perror("open error");
& s* A# J# j3 a% C
return -1;
6 i6 \# \8 J% G h
}
; g+ q% O8 |- O3 B6 b9 R2 \, l
9 |& z- k1 R, A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& \8 b: L K* E/ @7 b, S+ s
1 Y( s. u* w* e \ ]
while(1)
1 } S0 Q) C) v! c I
{
, w1 k6 O: p1 K9 P0 a, {) w
read_MSG_buffer(mem);
2 R5 t4 m( q8 U, S9 X
}
) q9 v" A" i4 O9 N# \6 b
}
. i* g, V8 q& d' r" I$ T
* P6 `4 K4 X) q/ u. H! s
void read_MSG_buffer(int *baseaddr)
1 d/ g' s( O- d
{
, H! Z0 S/ H% g
pRX_MSG_PROTOCOL pshreRAM = NULL;
. r3 J) Z4 f' s
! [% [( ^% d1 n9 X3 v( Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" x% F9 P% }5 L; P% X L
0 M; y# J4 t9 o" j8 q, I
if(pshreRAM->packet_cout != count_copy)
4 D, p, v1 b8 E3 `3 s- \
{
( ]0 f- W& r1 s8 }1 z6 j% O
printf("a is %d\n", pshreRAM->a);
( c u: w+ s& m; h* m
printf("b is %d\n", pshreRAM->b);
: J9 l( d, l7 h5 t
printf("count is %d\n", pshreRAM->packet_cout);
$ u, ]% ?% v4 s
count_copy = pshreRAM->packet_cout;
4 X; W# R( h( d1 E; z7 G! h& y
}
6 ~9 P3 W" O3 ?. G
else
1 t. m0 c9 ?5 a* |5 D' h D. F
{
* } g' Z' C/ n/ ]9 F. E
printf("No effective message!\n");
) D; K6 Y9 c1 x$ K
}
3 m9 j1 O; x6 R6 g4 Y _9 ~
}
& a- C' _: v* W/ W
6 ]. W3 O3 Z/ ~6 @/ b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 C$ W! B$ j# S) p
2 i3 T9 W/ x3 M9 V5 o
+ r- A! D5 Z, l) T
% N9 i7 q. P: i4 S8 x$ M* y
* T5 \/ u9 Y4 |1 O; x
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4