嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! ~* F. C% Y7 z3 s# \9 Z/ M9 q
( h. e4 m4 G2 U, U) B9 V; V3 c. @, z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 v: {( s1 g9 W0 S9 N) ?
#include <unistd.h>
4 k# ^; X4 B2 J' h& w# H
#include <sys/mman.h>
: ?* J2 m6 @! ^2 c6 H' Y
#include <sys/types.h>
* p' \5 U$ e* c+ w
#include <fcntl.h>
5 b% y& Y: K3 c" d" S5 R: w
) Y6 q" N' v: p8 z% D+ i: w
#define SHAER_RAM_BASE_ADDR (0x80000000)
) I) h) E% t& {. y- ^! U
& A' q h; e; V1 R3 U7 m
typedef struct
1 m" W( F! R0 D8 y) c3 C
{
- T+ S; D- U2 `. Z$ w5 L. g, f
unsigned int a;
" o5 @0 \- b& a* |, t' l: b3 [4 i2 C
unsigned int b;
2 w' |" c2 \0 e4 [% }9 `, w8 Y
unsigned int packet_cout;
. I/ C! p, M) p: k4 J* j/ S5 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ D4 q/ U1 K5 ?# e# v1 u7 o
; d( r5 [ h1 p8 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( K0 l, G, i* g5 E0 v! T) }0 n& ]9 J
unsigned int count_copy = 0;
* R) K) A( i- a% Z, i; i0 S" Z
% k: E* u. t# u, Y( ~
4 N0 y: }0 ?! A1 x! n
int main()
/ l( g) D& _: j1 ?. p/ n
{
5 n: ?1 i: `( I6 y1 ]( k
pRX_MSG_PROTOCOL pshreRAM = NULL;
- d1 W, I2 f" {; t
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; r w* [# c* |( Y A
& J7 w S% I, B- c$ a) o6 Y9 V; x
while(1)
, Y' W. p6 S4 h( [1 {& n
{
1 N4 F5 O0 j* z8 ~1 {/ Q+ b
read_MSG_buffer(pshreRAM);
1 h7 E7 y& x1 R6 N
}
$ K, o" h* _- A" j( |
}
7 {8 |6 v, x% e) h
( \: ~; n! ?% h( y, u, w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 T& U- l2 W; t9 p6 f$ y
{
9 H; W# P" L! \- o; _* s# Y
RX_MSG_PROTOCOL buf;
- L4 |& @ Q) n+ o6 |& l$ ~- e* |
0 g# f6 M- \1 z% z
buf.a = pshreRAM->a;
& ~8 H5 {6 W; ^9 X% x
buf.b = pshreRAM->b;
# f8 t( N; `' n" c+ A4 o! }
buf.packet_cout = pshreRAM->packet_cout;
. P2 e% F) N: c5 |7 Y
7 w% J: ?' g, E# P M
if(buf.packet_cout != count_copy)
1 ?4 Y( \. T* [4 k% L
{
. P6 q# n1 l0 v& _/ k
printf("a is %d\n", buf.a);
: Y* O& A% @9 [) h g L' n
printf("b is %d\n", buf.b);
( ~ ?/ h0 ?7 h" q( d4 P
printf("count is %d\n", buf.packet_cout);
) ?1 M# r7 q: r; p
count_copy = buf.packet_cout;
1 C' C0 l/ d' i
}
" x! [/ G" N9 @! x& ^* Y' \
else
8 O' R/ p: b, x
{
1 A! B$ E, H! ?
printf("No effective message!");
) n9 B2 n+ }* r8 R
}
5 x Z: U8 S) `& _& [8 \
}
2 y2 m& M' a9 i& \
( Q6 a' l! o4 D! Y; z# Q
* k0 M! M/ E5 x0 I" V" R
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 f4 ~* y: H3 f, A; u5 r
使用下面代码,对内存使用了mmap函数后:
, k0 m# C7 z$ G- h/ h" ~: f
#include <stdio.h>
+ o" U) s5 _% P
#include <unistd.h>
/ A6 a/ f* e7 Y0 Z0 X q7 ~$ ?
#include <sys/mman.h>
& b* ?4 Q# m- ]- a, p5 E6 q
#include <sys/types.h>
- c8 U0 a7 U7 w6 K6 m, m6 E
#include <fcntl.h>
6 t- {, u; X: n' g3 i
; `1 M8 D1 C# r" s z I6 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 r/ Y6 ?& d3 o$ r# l
#define SHAER_RAM_SIZE (0x20000)
" J' I* v! T6 a4 Z- U8 W8 o/ v
+ i& X" a) J) t0 X. |6 n3 n( I
typedef struct
& h- u/ L+ x0 Y1 ?" B
{
% ?+ _) ]+ u0 l- e. F0 z
unsigned int a;
3 y) Y) w2 {5 d3 _
unsigned int b;
6 X. J! V1 }( R: z @# V
unsigned int packet_cout;
4 y: {' P8 ~) k. \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 y8 {7 f/ w. W) ^9 e5 C
9 f. M {; L1 L, H: Y0 O4 X( w
void read_MSG_buffer(int *baseaddr);
* f5 C( m9 }$ f+ Z0 v
unsigned int count_copy = 0;
9 I, B' q$ C3 H% }. A# K' K* o
! K+ d! _# N. } x' W( C
int main()
2 g- ]5 N8 |8 [( _/ n; C0 s2 Q, Z
{
7 x6 m6 [: P* e! |! p
int fd;
8 W- U D% N2 v' d
int *mem = NULL;
$ l8 L& y5 w! w I3 N+ P, L7 F Y* J
e( M6 u' \1 |) z* S7 [# q* p
if((fd = open("/dev/mem", O_RDWR)) <0)
5 g p0 A- T4 N% K* p; J% `
{
/ e! D& L7 |4 s6 S
perror("open error");
4 F. _. r# }: L# \& z( D4 ^
return -1;
. P8 H3 I5 i- ~. V% @4 p8 y
}
3 a- @& x5 k, z. q( ?( q
* ^% T1 T: _$ y, s B
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& P5 }5 ?* f9 {. b
0 g- I/ j3 r' }
while(1)
: t1 l3 a+ b9 f! e3 z
{
- M3 e- F! P2 C! p2 c7 e
read_MSG_buffer(mem);
' v( q1 ?( J4 H4 Y+ b& S+ h
}
! q5 q$ Y9 q3 t. D, h7 m$ l7 `
}
5 `7 w/ z& G4 _
" j) U3 q! U3 c" N' p/ t
void read_MSG_buffer(int *baseaddr)
9 w4 H" ~, c) c5 i& j U
{
1 o' ?1 f9 Y0 y, J0 |8 O
pRX_MSG_PROTOCOL pshreRAM = NULL;
) p9 H; a7 W$ U
2 w" t, l5 M5 j" X$ W, `: a
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ w N* |' O/ J' R) T' {, T2 [. h! Q
- A( h n- ^! F. l
if(pshreRAM->packet_cout != count_copy)
- W& U; \7 @. }4 @- e7 A
{
9 R7 x# {& u! r W
printf("a is %d\n", pshreRAM->a);
5 N" G" Y6 H' f% `) A. Z: x
printf("b is %d\n", pshreRAM->b);
" ~; u4 V# K% B( t- Q0 E
printf("count is %d\n", pshreRAM->packet_cout);
: e) {6 q! s+ P1 |9 U- `3 A
count_copy = pshreRAM->packet_cout;
- H3 q, f! z5 B% P
}
4 o& j+ V1 s9 N% p' J
else
. b% F: A8 H4 G& K" ^1 O. D* x
{
; e5 a& e {$ p, h
printf("No effective message!\n");
/ T5 A# c7 ?4 z3 P! }0 f
}
+ L& Z; M$ a( c e4 f5 g6 r( B8 @
}
% W% p, R6 \1 E/ W1 u; w
0 T7 C5 M& [/ f! B0 k0 |4 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) |0 M0 A- _; e2 ?- J9 J4 ^3 h
( i6 I7 U' _( @3 v q1 U: q
4 V: ^9 \( g _9 ?3 {
: h- @: k/ I$ {* [. K+ H, a3 T& n: m
) e5 s; W5 B" Q6 Z( N2 x
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4