嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 |8 Q. D4 r0 g; ]2 j" W+ W
3 y& w9 `' c5 O! Q7 R6 u! h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# B# {$ v# Y5 S8 h# ]
#include <unistd.h>
7 @5 \+ M. _) T* A A
#include <sys/mman.h>
" D% j3 T& V! d7 ^% \$ H5 @
#include <sys/types.h>
& O( b0 z5 f3 Y' W [* i z
#include <fcntl.h>
- M! X2 s3 }; u( k" S7 ^
' v% s; a7 d, c A; U4 W& `; X" B( N
#define SHAER_RAM_BASE_ADDR (0x80000000)
) U8 p2 e5 f2 C8 g6 K) g' s% D3 c
6 u, V* {, f5 }! U& \3 D+ z
typedef struct
0 O( Z; p3 j" E+ `9 C3 n
{
4 |' m. n+ F. A, {. \
unsigned int a;
4 d" ]/ I& ] x( x
unsigned int b;
" [0 l+ i# J% l" e- q& @
unsigned int packet_cout;
* I- e3 k* x2 g5 c) z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: g' b0 x0 i3 W7 M) j. y3 `* N
6 o! ]: L! M3 P/ X# Y+ S) h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' `3 ?: K( b8 r7 m W# _
unsigned int count_copy = 0;
" Z9 y+ O4 j) m4 ^6 {6 M
, f3 c/ j4 g/ Q0 C/ v7 _; R: O
) r3 `+ s/ m8 h' P% r
int main()
' K- ~7 p) J# ]- {3 {
{
7 r8 q! m' T2 N3 D- `
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 g+ T0 b/ F6 D/ \' y. |3 u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 Y& U! G2 N8 B8 ^; s
8 Y# t6 e) M2 Y! t! e& z8 j
while(1)
' r. {# p6 J9 w. _/ }+ U
{
2 j5 x( t- V6 B1 h& E6 R+ d. i
read_MSG_buffer(pshreRAM);
% O1 ?% K$ V" p8 ?
}
( {0 ]2 u- q- X6 X
}
' n2 v/ _8 u% M; h1 @
; h9 L% G# a% v" n5 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( w) x! r5 x8 H: u
{
3 s: {, s, B9 X3 g: D. |; C* A
RX_MSG_PROTOCOL buf;
% H! | X9 f! F$ t8 l
+ d% D9 p3 ~" j9 d, {5 }- x
buf.a = pshreRAM->a;
: F- F9 S! e% S% T5 I
buf.b = pshreRAM->b;
$ Y* t) C6 _0 z d/ A; x" J
buf.packet_cout = pshreRAM->packet_cout;
# U8 y' c7 D: q, X+ U4 c4 l
- _8 h* P7 z4 b! I$ p
if(buf.packet_cout != count_copy)
! O) S( l+ g! U+ ]$ N1 @
{
7 r4 H7 C, q$ [
printf("a is %d\n", buf.a);
5 K* R2 ~. y8 {
printf("b is %d\n", buf.b);
! T3 L; g6 r9 {9 Y: i5 g
printf("count is %d\n", buf.packet_cout);
5 `- P" r s4 ]) P, S
count_copy = buf.packet_cout;
0 M: G/ Q; e8 j* t; w
}
/ x: S8 z6 @! D; P. i) r
else
1 g( D6 z: [6 x& \9 L
{
* v0 n' }1 w! G9 X; ~& V% g. `
printf("No effective message!");
$ Y; K6 V' A0 ]
}
5 X: @8 ^2 l4 V
}
& \/ _6 l, J$ s. V, Y
# \0 d0 m, _, i5 E. S A
2 A* W& v/ i* d& `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" \" S7 @' E. ]& o* u0 \
使用下面代码,对内存使用了mmap函数后:
, Q. h7 M' I- L& [/ H# M
#include <stdio.h>
6 L9 I# T. C% z. m) ?& ]
#include <unistd.h>
' g+ I/ M# l: W2 [& T1 v
#include <sys/mman.h>
, Y- r9 n1 W5 r, D! b1 s; }9 H
#include <sys/types.h>
9 z8 ^; n& f% C0 w5 m4 r$ _
#include <fcntl.h>
! T" W. o$ d% t6 R* V$ D
N- U3 @( [% `' x1 v/ x0 c
#define SHAER_RAM_BASE_ADDR (0x80000000)
( c9 ~7 f5 {/ g+ n. }
#define SHAER_RAM_SIZE (0x20000)
/ H% e+ \/ y8 P0 z! N
6 N# k# L3 o# e; g
typedef struct
; u% u0 T0 f' h5 b% c
{
. S7 |; {( }; ^1 c' r
unsigned int a;
9 V. L3 @) F9 O& R- _
unsigned int b;
( O/ w% X8 K3 v# L7 o' x
unsigned int packet_cout;
4 R1 S4 C. u$ ] C5 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 q7 K7 W/ c! d$ @/ Y" _: d
# V# A% v0 @, D; _2 F# Y. H; O
void read_MSG_buffer(int *baseaddr);
3 U8 P% E) m% F K* E
unsigned int count_copy = 0;
, `8 d1 L; v1 ]4 g7 _
* g# f5 Y3 Z; n' u7 l( }! h/ g
int main()
p% y6 w2 T3 E. T4 n' w0 n
{
0 `& p7 w% f% ]; Z
int fd;
* I) E7 a r' b2 G% r2 q; h& T
int *mem = NULL;
! L( `$ U$ ^8 o( t3 P2 e
8 B, f; }: B# r7 v8 D& L
if((fd = open("/dev/mem", O_RDWR)) <0)
( }* B" n" x6 @0 G) f3 {
{
, L/ R. W0 N* \% V2 v6 @/ t0 @
perror("open error");
[" M* c; G" g' m" y* I* d0 Q
return -1;
% Y6 N- V7 c) K- m V# r, M" L
}
; ~6 ^2 E9 I* D7 O/ H: O: Q
! p% _$ g( m' S; V% u6 X! N' ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 D% |: ~ P+ G
$ T7 R. q. X# @& [: x3 L6 a ~
while(1)
) ?8 B9 S* A# V4 q7 \3 v. j
{
: |4 c4 ^1 n% m. k* n1 A
read_MSG_buffer(mem);
7 z+ |. a7 L& h7 s7 U
}
$ M( t9 H* J1 _ ]+ _7 l' G( w' ?( d
}
: \3 q; D( e6 ]. D/ v
; z7 x; q, V* q9 J3 R3 J+ c
void read_MSG_buffer(int *baseaddr)
1 s! I8 t9 o* F9 {4 v3 T
{
) R0 h! D4 K& P5 Z" U
pRX_MSG_PROTOCOL pshreRAM = NULL;
& c- G! D8 J/ q
2 @: ]/ F" a; ~8 O6 v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! c- u# ?7 u! e2 T$ h0 z0 e, z
2 V& M& G# z# U0 N9 R4 n: [
if(pshreRAM->packet_cout != count_copy)
, Q/ Y( ~" F& g/ U6 P
{
$ I& P$ B& l) ]& W* H0 C3 ~+ I4 g% j( u
printf("a is %d\n", pshreRAM->a);
" _7 r% S6 d- `# H" E
printf("b is %d\n", pshreRAM->b);
% k: O5 ^: F2 C9 P/ I1 B' h) T
printf("count is %d\n", pshreRAM->packet_cout);
) y2 Y* P! H2 |( R( ?
count_copy = pshreRAM->packet_cout;
% E! G# p/ T* u" ~
}
2 h- u0 E7 Q6 D9 X, {1 ?
else
3 H# ~" e( R Y( \& p u
{
8 V( t; X( t: W
printf("No effective message!\n");
$ T( F0 R+ C" z" U* n& D' T1 e& U
}
k* f& Q$ s( ~* r" `; i( J0 f
}
+ s0 a3 U- ~1 c l6 f
8 g1 U/ ]5 l) w7 [% ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' E: B5 d+ t# x: R( x
) o# s. N) O5 I" I5 v2 a- r' J
0 W! {- n }$ m
# P# ?5 s: F3 E7 D. `! V' J- e
* F! U5 I% H! ^! E+ |
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4