嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: I* V' u7 O5 d
q3 d+ W9 T5 d6 B0 d: S; J( k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& ], h. P- d: l# H
#include <unistd.h>
' `5 V6 N/ t( M, v
#include <sys/mman.h>
+ a. ^7 _% F% x+ Y H8 P
#include <sys/types.h>
( @+ u6 A M9 C
#include <fcntl.h>
, I" F1 _+ {' F5 L9 F, D( l w
% R6 l" i" t' W8 }5 K: D
#define SHAER_RAM_BASE_ADDR (0x80000000)
% q( h8 j' s7 Q! R# s. t
. f) _0 L& E; v) b" ^; b
typedef struct
+ Y- k( N* o$ v4 r7 }; a
{
' J0 M. ]& j1 }! n
unsigned int a;
# H, n- b; K3 E+ j; v. N
unsigned int b;
0 G! j |( F- F4 }
unsigned int packet_cout;
" O4 m- S- k/ l4 V1 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) x: X. v9 T2 e+ u9 Y, o
% G$ s6 D, q) D! b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 t& q& C' Q u, q* [' b$ I: _
unsigned int count_copy = 0;
+ b+ a2 i' o5 N3 ~9 |
) [. r4 P# ^+ Y- t5 _ s% a
' |4 N8 Z8 v T; n; Y
int main()
1 V0 ?: `, X. X; j) w. N
{
& Y. {9 w: i2 h Y! H# Y, N4 j2 i
pRX_MSG_PROTOCOL pshreRAM = NULL;
' a( m+ j( T. ^5 }- p% ?. l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 p( M- W+ t& _9 k
* B0 R8 `* o9 m7 Y
while(1)
# K, s4 ~& r6 Z$ v7 M
{
% p4 {, s1 }" ^/ H; T, B
read_MSG_buffer(pshreRAM);
7 \9 p/ a9 |7 f. J) Z
}
! P% i$ M- {7 T8 _# B
}
+ T- n3 T- s% ^( I8 W3 D( X
' b" D' S3 E: L7 M" l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 S9 E* E4 h% v. w9 s+ x, t, m
{
. b. I* Q+ g& d: j9 d9 K( f
RX_MSG_PROTOCOL buf;
( _0 G& C5 ~8 @' F; I Z1 l7 A) X% d
- v3 s6 m( {) R7 _. ^
buf.a = pshreRAM->a;
. Z- G- T# B( ^# p% Q$ f
buf.b = pshreRAM->b;
. ]% y$ k* |+ {5 U: O
buf.packet_cout = pshreRAM->packet_cout;
. [$ b) L: e; R2 U1 g, d" ?0 K
% Y5 B; T! w- W5 r! w6 h6 a
if(buf.packet_cout != count_copy)
4 q, [- ~8 F, J- V3 ?- G8 j
{
+ a# S6 p2 z8 J/ Y- M
printf("a is %d\n", buf.a);
" X" a& {- [+ y% r: K) p" Y* P
printf("b is %d\n", buf.b);
/ L* n; g) v& r9 t
printf("count is %d\n", buf.packet_cout);
3 ~1 E, C: ]4 x
count_copy = buf.packet_cout;
. b; w" A( P2 p& b
}
* r( [2 { x9 n: Z
else
( q h1 R" N) ^
{
/ g0 z4 J4 G3 R+ z( \
printf("No effective message!");
, E7 |8 G4 M6 y* }8 }# g: y9 F M
}
3 a5 c* q' y$ W! `. _9 z; ?( J
}
7 B3 ?4 j& K& }* Y5 n/ y8 e) v
; v. k n/ i3 Y7 B0 i
. e" C B: x6 G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 g, [4 x5 H3 C8 i
使用下面代码,对内存使用了mmap函数后:
* w a9 y4 I3 F6 G2 D7 P
#include <stdio.h>
+ z. ?. N$ @/ |6 Z- H! d4 @; o
#include <unistd.h>
0 v: H: r0 Y7 N: m4 M& S
#include <sys/mman.h>
u6 C; S I) }# d6 L% y+ I
#include <sys/types.h>
+ r5 R1 E5 t9 R$ K- c
#include <fcntl.h>
- ~' k t9 U1 ]8 {7 |
/ I# s& E% o( c; q1 o/ i" l
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ o5 }) p* K, B
#define SHAER_RAM_SIZE (0x20000)
' V- p2 K$ o# G) s+ f1 x
0 ]% h K! N- H5 Q% @* e8 Q
typedef struct
. P% t5 g8 j) t# g4 `( d
{
9 {1 i5 v+ E) s ^* K# d4 {* Q
unsigned int a;
+ I0 ?1 T9 y% t1 b% [. F8 F4 _2 c
unsigned int b;
) i( D$ `7 d' f4 U) @( f3 a
unsigned int packet_cout;
% J+ C" ~8 P. y u3 o9 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
M1 i! M3 I' K3 B
6 ~# P6 L9 W# P# ^
void read_MSG_buffer(int *baseaddr);
0 P( t+ c" T! O
unsigned int count_copy = 0;
0 [- o5 @( A7 p: E& F2 o3 m
# j4 [- a1 u4 V
int main()
0 G1 @1 c! Q( d
{
2 m: T/ K% |. k0 S. q8 D
int fd;
0 e% A* u, s! z, ?- J8 O1 w
int *mem = NULL;
1 Q9 n" j8 [$ a8 d
9 j }2 V& U( R# B+ D8 j5 \
if((fd = open("/dev/mem", O_RDWR)) <0)
! ?9 L- e, x7 e$ q% s7 @0 z }
{
* o4 G/ Z# O& _% ^/ Z. w
perror("open error");
# c8 l' x& s6 g3 V4 R0 i
return -1;
3 Z6 o3 K7 X& ]. t4 B0 ^
}
9 h- Y/ T7 v( L" S$ r1 D# S8 `
* x# q0 R0 B M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% V8 Q/ o8 X$ H" x" S- w
& w& j: s! J& m0 A9 `0 ~4 z
while(1)
' z8 H! K! m7 B
{
, s& j+ [8 D7 W2 \2 i
read_MSG_buffer(mem);
$ C/ C( }! x6 j: Y- t
}
, ]) z% E' I+ T3 Q; K. C2 u
}
1 T0 }0 _0 ?6 X6 y( ~- Q( a
t" ?* z2 y# Z7 ^, v7 ~, l1 d
void read_MSG_buffer(int *baseaddr)
" H& r( |& i" i1 R1 o: K( G+ X8 U
{
8 j; ~0 E! P P b* S: f4 D4 ]: s6 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 ?; T# E u0 X5 R$ r E r
& ^$ M# B! [; B% l J. {& k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 i. C2 K, r; q6 e
; d" A U, D& Y# J& ^
if(pshreRAM->packet_cout != count_copy)
6 |& ~& `; X1 `* J. X# \; m
{
' Q8 C* f+ x& Y! N4 S
printf("a is %d\n", pshreRAM->a);
1 ~8 D l* f8 F% E
printf("b is %d\n", pshreRAM->b);
+ [& p. y7 _; ~# |" y
printf("count is %d\n", pshreRAM->packet_cout);
5 ^% h, o5 Z' v
count_copy = pshreRAM->packet_cout;
3 U9 S+ f z& b' T0 B& a
}
# o/ G* f l7 I5 j) j
else
- V' U7 a2 o7 M u$ t! w+ b
{
# z) e1 f. h) x6 z2 i4 t
printf("No effective message!\n");
+ N& ]; P) N, g* I1 Z& f
}
$ m+ Y3 c$ a) \5 c9 O3 C4 x
}
' V/ R# F: |- s" b. w. C- a
$ x5 m. ~/ @$ j* p. T4 K6 r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 T* a3 t+ e' g7 F7 E! H- Q
; h0 G) c# s3 x0 o0 s
; R) s9 m( X0 A b( I; b8 D2 t* q
4 {) o( H. }% ?' b- m* D2 q
' M7 |: x$ O4 ^
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4