嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
q' O4 p8 \* a! E) f' [
2 U+ k5 |* z5 s' c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 i! } M$ O0 B& A- P
#include <unistd.h>
+ B$ L2 J, R- N, W/ l
#include <sys/mman.h>
; [7 e/ A0 S* w: F, F0 E& S( I
#include <sys/types.h>
" p. z! Z; @* p g5 H; l
#include <fcntl.h>
: N( ], \3 Z0 D1 K& i& x
$ V' l: h8 a# G" [9 z7 ]# N1 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 I' z8 n$ K! l, N G5 k" P& _/ f
1 i. a1 }2 x, ^. d% M9 P' T
typedef struct
8 _/ A6 m7 E0 H# m( s4 f
{
9 s' j1 N2 u) L& ?1 V+ v- V
unsigned int a;
* G' n9 y2 b* w4 w! V O5 B
unsigned int b;
# R( t+ x. Y8 B* l
unsigned int packet_cout;
8 z; c9 R+ e7 Y, c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( ?7 |' M2 @8 ^! H- w: P r
4 u+ y$ p8 I! _7 a+ G; A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 h, V! }+ g; m" t/ x7 p
unsigned int count_copy = 0;
( x2 A7 y$ Y$ D& K- M' _3 r5 [
+ v& m! L/ h& @, q# x2 q
& ^9 Q% m) K0 Y+ r
int main()
7 P8 o: P* D* C1 q. E% P) n1 U
{
! k- o4 {: I/ W# ]& d
pRX_MSG_PROTOCOL pshreRAM = NULL;
* F' |) y. E {. }4 W4 s8 H6 z' N
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
h/ L S7 |2 M
- o7 g& z4 F) o- {% ^
while(1)
& S6 d5 U+ n* [: x# v0 h% e$ g8 G
{
2 ~: a! U' X9 m1 A7 K% m. ?( O
read_MSG_buffer(pshreRAM);
, I& w/ f2 ]0 j0 _: m( B
}
4 s U) v) e% C9 c; k2 ~
}
& ]3 }; c6 Z4 x N
9 p: ^& c) W1 _2 v: V* k5 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 b3 e' k5 t V, c/ ]
{
( ^9 [2 b, A* T, t) O
RX_MSG_PROTOCOL buf;
7 L3 _7 G, s. Q; i- y, v
5 t* @' `! K k& G/ g" f
buf.a = pshreRAM->a;
+ q2 h \ R9 \. k( ~ |. M
buf.b = pshreRAM->b;
# [" \; _; X) j% t$ a2 L2 n
buf.packet_cout = pshreRAM->packet_cout;
$ ?& B: s$ m2 q
! ]" X- o& { F [
if(buf.packet_cout != count_copy)
, M1 n0 R& k+ c5 A+ f
{
3 ^8 O& \& E, W/ G2 f
printf("a is %d\n", buf.a);
. ~4 S! H( J0 X& N
printf("b is %d\n", buf.b);
4 V3 h1 x! Q* X
printf("count is %d\n", buf.packet_cout);
' R- [3 c8 E; r: t
count_copy = buf.packet_cout;
5 d4 z/ D. a6 F
}
8 c9 Y+ A& t# T: _
else
$ J; ~4 g2 _1 k1 k" E( i
{
/ w0 T% F e9 u1 p) y8 c. n2 u
printf("No effective message!");
1 B, A1 O" \3 b( \
}
* i) t5 Z9 F& ^% q. ~! G
}
8 `( _! @& S8 n
' `" N2 h9 U. {8 w. W: U2 u
( W: |& Y. c0 m& y; s n0 u! j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: D) J; \0 ?3 `$ R8 F# k
使用下面代码,对内存使用了mmap函数后:
8 y% {. i0 y. \0 h& v7 a& S
#include <stdio.h>
! ~" U, j; L- ^2 s! f, @
#include <unistd.h>
& V8 F% B5 v+ G0 {
#include <sys/mman.h>
# `$ h( s7 ~2 ~! q& L4 A
#include <sys/types.h>
# {) J$ d: P0 x' w7 \. K
#include <fcntl.h>
9 C; |( `, k2 w
- b- G6 V& m) z: J5 r
#define SHAER_RAM_BASE_ADDR (0x80000000)
" f5 k4 {* K( d
#define SHAER_RAM_SIZE (0x20000)
8 i- V7 U0 ~) J* x7 l. |
2 w4 v1 g2 l: G* {) h y6 x5 i
typedef struct
z) I* |8 D; n% f& `- w6 a1 |
{
. \+ Z3 g. l& q: R" _9 Z G3 O
unsigned int a;
/ @% E! G( [+ D3 S; P4 @0 @# v" b
unsigned int b;
P' s' ^% g' y7 F& _
unsigned int packet_cout;
! H; X. J: N4 F0 z1 S& q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# k# U/ R3 X+ \3 X9 h- B
! X0 H2 D( d" u0 m
void read_MSG_buffer(int *baseaddr);
- C1 z6 V0 Q* j% S3 e
unsigned int count_copy = 0;
9 F0 \: p, G- q9 b
$ `( Y( h: N' S3 N2 A4 c1 p0 L
int main()
$ I) O2 U% E% m. g9 f
{
7 t+ z. S* n- ~ Z0 R" M
int fd;
( `/ l% f9 Q, ~/ D+ s
int *mem = NULL;
( `: M; ~% {4 X7 [: n1 p! V" L
) W# y7 J' ~ g) n6 `
if((fd = open("/dev/mem", O_RDWR)) <0)
* V& ?$ p6 Q+ \$ z" O/ u( F
{
5 F4 Q' ]/ p$ B) n
perror("open error");
& t" L, b+ w% y1 T: @0 K* t/ ^
return -1;
/ I" W) D9 E; s! j0 o
}
+ E4 m1 p! b# L0 h$ e4 X
/ F# I4 |7 y0 d1 y5 _! N) z" [$ n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) [, ^( O7 u+ r7 K _2 q
) M' ~+ X4 i* i# n
while(1)
2 M3 p3 y9 }5 y! |% V
{
9 E1 X) ^* T5 Y; g7 e* |. q
read_MSG_buffer(mem);
b. l! Q7 H2 g7 Q% @- O5 Z( l
}
( l h3 \7 ~+ J/ A6 \0 a
}
. Z, `9 ?- x1 n6 u
& g# v+ s, N% Z( l& |2 N: ^% i
void read_MSG_buffer(int *baseaddr)
! y; I/ i4 \" |% @0 J7 B
{
4 s9 B$ z* p6 n/ j
pRX_MSG_PROTOCOL pshreRAM = NULL;
# t2 s q! h$ W* P& C4 Y/ s
* ~( l: v% N5 b0 C/ R/ O. _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* k! e% l5 {9 o6 U- T9 T$ j
' v: h" {; p. z$ e% M5 I: U& i& W. O- |
if(pshreRAM->packet_cout != count_copy)
4 j' w. w C- J2 A/ X4 i
{
E- t+ _% B0 e) Y+ J$ M4 k
printf("a is %d\n", pshreRAM->a);
: W+ C0 b' x: v: Q2 c
printf("b is %d\n", pshreRAM->b);
3 t( ^. g1 ^ Z: M& T6 k
printf("count is %d\n", pshreRAM->packet_cout);
1 r% J+ f' [4 j* S$ Y3 C! R
count_copy = pshreRAM->packet_cout;
9 p6 ^8 B9 Y. I7 e: ]; Y: s4 F& [
}
: ]! ` l6 _/ h2 M# Y2 r
else
) g2 B- R6 Z! @1 c+ S
{
4 E3 ?# R" p7 R5 J, b: J4 G l
printf("No effective message!\n");
2 g- f. R' r, D0 @& s
}
: ~0 A0 N. p! D4 i' M' ]3 f9 I
}
! A( M4 k( ^) T' ~" T
! b) R; `! u: ?9 K( A3 C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, {. s* j# u' c5 V5 R
. a' x/ r1 E% a& `: U: W. H
7 h# {( e+ {; O z+ F* r/ }9 B- E% {
6 q# k5 U+ u$ F u: R; r
. N6 u5 i9 Q( w: f2 I
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4