嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* d1 p' [4 W$ {0 d% Z0 L) S! N
" U6 e6 I9 |0 M. d8 N$ v" g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; G" P( I8 [# l2 ?# b7 h8 o
#include <unistd.h>
) M/ O3 R& i3 k$ e9 L
#include <sys/mman.h>
7 ?5 L* ?& k* q# |, i! V5 q5 {$ v5 A
#include <sys/types.h>
4 {! U* y" O" @% V. I6 l) A
#include <fcntl.h>
3 |. B( k( B/ L( A+ S9 w( X0 `
( A( T: z% E! p8 f* L ^; V' F
#define SHAER_RAM_BASE_ADDR (0x80000000)
! d2 x$ i/ V- u2 R! j
9 v! o5 W t& ]: g
typedef struct
8 n5 v# W, s5 i. V1 ~1 h) z
{
6 o/ v% G9 J1 h2 q: @+ n
unsigned int a;
" b& E. b' ]. o2 h
unsigned int b;
! b6 r& R) S2 ~4 |
unsigned int packet_cout;
( |) ]& }8 E, X% d c& A6 t( z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ]/ R( V& o# A- s
3 ?3 {% u/ F6 s7 ~0 z9 H* L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. k2 N! ?6 \6 h1 K: G, B; ^/ V
unsigned int count_copy = 0;
* c/ I, |- t$ J% y+ x
+ s" }; F8 Y4 x" L( L1 _( c9 J
6 [7 H i9 X2 W
int main()
$ j9 d$ ~8 P; W5 N' ~, ^; ^3 j
{
, W) w% G' t2 V0 H" z) h
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ S7 y9 }! x; V
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m+ ^. u1 i0 ?% P
9 \6 R% s6 e) ^3 L1 T
while(1)
5 Q/ K9 b, R: i4 D3 d
{
( y% C. F' ~1 ?) v& K& D. W2 {
read_MSG_buffer(pshreRAM);
9 Q$ _ n9 g) n
}
% U9 U, h, s9 ]5 m1 B) r* d
}
3 f! A( ^/ J- s& n0 @- K0 s6 \8 {
@1 `0 g+ M: d: l7 i% i1 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- ?7 t; X" G! r) I! C
{
6 a8 T0 M6 {4 x9 Q$ [. n5 n: b
RX_MSG_PROTOCOL buf;
& k. e: K2 K2 E @* B1 C) i
# ~4 h' p( _& F9 X( I
buf.a = pshreRAM->a;
' i- O4 [3 v8 B6 |& L5 a) L5 @8 @
buf.b = pshreRAM->b;
- a6 w0 D+ o( Z9 ]
buf.packet_cout = pshreRAM->packet_cout;
! P. Q3 h W8 Z- l) j5 R. R+ t
0 `. J$ e& d4 B- t8 {" K# I- R3 ?4 _1 W* J
if(buf.packet_cout != count_copy)
e/ s3 C5 G! Q
{
. s% G1 V! c' z/ h
printf("a is %d\n", buf.a);
# r& m2 ]$ f9 D7 k& X6 I7 X
printf("b is %d\n", buf.b);
# K3 [. f/ q, k% X- }5 X- X3 U
printf("count is %d\n", buf.packet_cout);
( E2 X4 w7 C) I0 s# F* j: D D& I, F
count_copy = buf.packet_cout;
6 F9 `8 K) q& k _! @
}
& o% s* V5 _% a) S& k8 h9 ^
else
3 _0 b9 V/ V' ^9 s+ T8 @+ l
{
( }# }$ c* J* S; Y. T" T: a
printf("No effective message!");
9 j6 r0 e) H9 n( R
}
. L5 C6 Z8 `# A* t8 m) z
}
. `5 k7 y' v7 g/ y, n
; O( S" w& F/ ?9 E, Y
5 G) v5 L; m Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' M( z+ _; r# r- r" B' D+ K
使用下面代码,对内存使用了mmap函数后:
' C$ U# m8 w/ d: a0 z
#include <stdio.h>
+ V- T2 j: g+ S/ w
#include <unistd.h>
! U0 @" Q* B4 m1 W
#include <sys/mman.h>
+ i" B6 `2 o# J! @6 W
#include <sys/types.h>
) H# ^2 e. G) e# C/ n$ a
#include <fcntl.h>
9 }8 C2 Z( C. Y& ~ T1 Y7 o# w
! u9 \9 n- u% ]3 i
#define SHAER_RAM_BASE_ADDR (0x80000000)
& P9 C) K+ e- W( q& d- g
#define SHAER_RAM_SIZE (0x20000)
, }5 Y9 `' P; j
8 R5 ~8 U$ N6 U! Z p( m
typedef struct
4 `" o" B) q6 y1 n% S
{
( B: v G( _& X+ e Q- n
unsigned int a;
0 u8 f" ]+ I: f* ^8 ^ z, C/ P
unsigned int b;
3 q# f9 V% y3 T' l
unsigned int packet_cout;
7 Y J, N3 p1 O2 v; @. _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 [; ? P; g! B
. r$ w) }. ?" r5 H: K
void read_MSG_buffer(int *baseaddr);
. |# p2 @( n& ^9 V8 }
unsigned int count_copy = 0;
+ e e" j% I; G+ z; W
+ `$ m" f, N \$ H3 Y
int main()
+ I B( X* N) ?& L# e# Q% \/ E* y
{
& {$ B& c/ `( I, u$ g
int fd;
: F1 [; g7 g# y) x6 {) s
int *mem = NULL;
& U: K$ W- o5 G; a& _4 T" W4 A
2 o5 U+ V" @& Q
if((fd = open("/dev/mem", O_RDWR)) <0)
% ^# j6 S+ l; Y2 t2 ]0 X
{
$ Q2 B5 e' w( u1 n" W
perror("open error");
( n/ q) w# Q1 s9 |) N9 j- i
return -1;
! a6 k. Z* o+ {1 H/ P- U
}
6 W9 G8 k3 [0 U& H+ u- X
; ^ G! r6 C; h( {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( q: P {6 ?! G- X! N5 D; h2 D2 ~
% l) G# _3 a7 U
while(1)
/ o( E" T( j9 H* h7 m6 ` p
{
0 b) U% d; X' k* q8 _
read_MSG_buffer(mem);
6 i* O. s o1 e0 Y5 E
}
+ M7 ?9 ? D6 K( w1 j [
}
7 T2 {: [ |' ]' ?6 s
2 W$ v9 u$ b. o0 ]
void read_MSG_buffer(int *baseaddr)
: T$ U) j' U: G' W; ^7 h
{
4 \3 z0 E1 i+ U" b
pRX_MSG_PROTOCOL pshreRAM = NULL;
& ~5 [- S: X& i V
; g* I+ P. b: M& o' K/ g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 s" U3 n$ c/ A3 h& p" v D
* w( ?$ F$ j/ @( E3 C8 J
if(pshreRAM->packet_cout != count_copy)
: t( n# a$ v* s" W9 g
{
, B9 J8 J9 P) J
printf("a is %d\n", pshreRAM->a);
. D, K. ^* f# c0 \0 Z( C4 M& f- K
printf("b is %d\n", pshreRAM->b);
, r; [3 J7 X: P
printf("count is %d\n", pshreRAM->packet_cout);
3 E# f, |! y; h0 Q
count_copy = pshreRAM->packet_cout;
2 m$ \1 I. _# f
}
+ f. ~) b$ s: D% V
else
2 d2 {0 W3 `3 a+ p& O/ }. }" U
{
4 z9 R. J7 i. s* S: M; L* j
printf("No effective message!\n");
: X2 r+ c7 i; E" ?; x4 G
}
7 k2 z( C* _5 K
}
+ d) x. y, }' ?# p
/ P; W e4 P$ S G8 h# ~) u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- ~( _- p/ T$ w4 o, B: s$ D9 G
) b: ?% }9 n/ H
f) `8 \6 J/ I6 B9 q8 p
2 P/ t2 P2 U( ], l
4 J6 S) d9 C3 k3 r6 t# h" y/ T/ n# O
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4