嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 @7 ^9 k7 y: i
2 [( e; K* l1 c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 F* S% ]* E7 k i
#include <unistd.h>
2 ^( Z# P" h. b
#include <sys/mman.h>
$ Q4 _5 ?5 H) Y
#include <sys/types.h>
/ |# f* v% P6 w% c
#include <fcntl.h>
0 q' e4 x7 Y* c0 f! ]2 G9 ?
$ e8 u3 U) d6 R+ a; b: S0 q
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 m8 }3 B% v) x3 S' c
0 A$ V5 F" U' m; l0 h0 D
typedef struct
3 O! G8 P( M$ p, z
{
+ v' S4 G2 R6 ?4 g3 U! m
unsigned int a;
% r' g" _1 y: r
unsigned int b;
" ^5 c* @0 S4 `
unsigned int packet_cout;
" D% I: h2 o: M- u# _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! _* |& y9 J+ Y) G. R* ~6 c
$ P- X( ]; O, m4 K/ P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: K" H8 q- s1 c3 r
unsigned int count_copy = 0;
" R& v- r3 H1 t3 y+ P
9 g) {2 ^" d6 E( ?0 k
* r# ]; n8 [% o. e* z' I
int main()
5 i% a8 J& p- X7 y
{
" x: r, R0 m, t
pRX_MSG_PROTOCOL pshreRAM = NULL;
: @7 m' j5 u* P% N5 U# h! z+ f/ z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 M) j( ~6 c m W8 S
. x5 U3 J3 D3 p' J# m# k! K" \5 R
while(1)
- Y8 w4 H% t3 C, c- F; D% `- t
{
0 `( G% Z6 b, i, \8 N8 T) j9 A
read_MSG_buffer(pshreRAM);
5 z( q) S) I1 d" ~- X {9 d+ {
}
5 K, X8 q1 I5 _% G8 M; X9 R/ t
}
' n- G: l, u9 \! U9 ~2 k1 M: U: }- Q
+ c0 H2 w: q! D3 c& k. m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 p9 y! C. u0 G: Q( Z6 ?
{
- ]% Q; A# f' S* C
RX_MSG_PROTOCOL buf;
7 z8 h7 z; s4 M7 }2 b( i- `
2 N( q2 B, I3 D
buf.a = pshreRAM->a;
& Q9 y+ I0 A* B# i
buf.b = pshreRAM->b;
$ k* C; p! W9 \) v/ R) Y/ n; j
buf.packet_cout = pshreRAM->packet_cout;
& [, W V) j. I& e8 l* x( ]
! {3 [0 y& \, d, Z
if(buf.packet_cout != count_copy)
+ |8 Z1 Q6 ]. S
{
) F* H, F Q+ s3 A
printf("a is %d\n", buf.a);
4 \, v9 W2 R2 d! q$ [! S
printf("b is %d\n", buf.b);
2 k0 V7 W4 ?+ g6 P/ l9 R
printf("count is %d\n", buf.packet_cout);
, L# h- `5 ^) Q6 m2 i/ h3 Z
count_copy = buf.packet_cout;
2 S3 J! d& O: m1 Q
}
- p- c5 o' F( Z2 m! W$ f% I1 b
else
2 Z, O6 q6 G. ]
{
; ^' u. m1 i8 E
printf("No effective message!");
9 J; W( h! r+ V# h( v2 }4 U+ `
}
: A6 e* ?$ F6 o; T0 d
}
( q+ g1 c0 v1 s- s7 p
* [* j$ ?8 [( l% O* M3 V
4 @/ J0 {5 l4 G% a6 x5 ~4 G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 [" [5 T' G& ]3 ?
使用下面代码,对内存使用了mmap函数后:
1 W! Q& s* ]) D3 T. q; v5 ]; I; ?0 l3 @& p
#include <stdio.h>
* |0 Y' o* q! _4 ^
#include <unistd.h>
) J6 _& T1 i T4 I8 Y$ j; y! U5 M( R
#include <sys/mman.h>
( v. G1 R3 ~( b7 y, m( ]2 q
#include <sys/types.h>
# ?7 a0 V& t+ x: w! ~% n9 t2 I
#include <fcntl.h>
, z1 v7 O0 y. L2 a
6 _5 T+ P5 U* g- J
#define SHAER_RAM_BASE_ADDR (0x80000000)
# j2 S9 a- X* K- G% a, l
#define SHAER_RAM_SIZE (0x20000)
# ^. ]- U9 c5 _8 a" i8 B
. j3 E: o: F- `7 y, h4 Q
typedef struct
9 L0 o; g+ W' E9 c! F2 }
{
; _3 P7 @- g7 W7 K. t$ B# I
unsigned int a;
+ | `% O% e8 q' k1 f9 p+ d
unsigned int b;
1 h- _1 @# K' R; C; M0 Y
unsigned int packet_cout;
% N h) Z/ A5 N0 w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 n9 [4 \$ N4 m$ Q" W
2 K i r. Z6 }( d0 d4 A
void read_MSG_buffer(int *baseaddr);
~* }" @( s* s, i
unsigned int count_copy = 0;
3 M, x r+ \- U6 a/ t
: w+ o3 T: J5 ~/ I
int main()
" o% e# K3 e; e% q' c* h4 T
{
' t6 F+ }$ c! A) U4 S% p5 c/ b2 w
int fd;
! M; p8 @3 Z ` P# X( v
int *mem = NULL;
# _' Y9 x4 \. k% ^
. g& \# B( X1 N- I. {/ l
if((fd = open("/dev/mem", O_RDWR)) <0)
1 \; @ o/ \6 T% r" T
{
) r8 J1 P- P+ w' Q
perror("open error");
7 Q( e% ^* a) j+ d7 R- s; l; o& a
return -1;
; t2 R. c1 e$ t" i1 a b& E" ?
}
; s2 I: W" Y# ^' \4 y/ W3 _
/ k6 T1 U6 T. z) m5 j7 X( W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 }( \4 \. a! M/ s
4 }; z, N$ L1 H/ N2 G7 h6 }
while(1)
4 ^2 d- ]% X5 V; L% @% V& H' [
{
2 }2 S- j f& Z' G
read_MSG_buffer(mem);
3 y" z9 T% b! `9 v' O; x
}
1 d6 f0 d5 u, m- ?4 y
}
3 V* E3 P* n- D! B6 H! C
' X: H! I+ D; ]; e' I B
void read_MSG_buffer(int *baseaddr)
: ]" F' c7 j7 |( N
{
1 j5 j7 C. r( P: L
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 R+ z l, W, ~% m
8 w$ e6 A: @: e; {( n d0 j6 ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! W& I% t/ C; U8 z8 z
3 |' Y: u4 ^* |$ z* U0 a$ O
if(pshreRAM->packet_cout != count_copy)
5 ~! T% z2 v! I
{
; {. H& j3 Y+ S X
printf("a is %d\n", pshreRAM->a);
* ^ j8 l1 [5 A* c, `+ t
printf("b is %d\n", pshreRAM->b);
. e5 G3 Q- I: S2 i: m3 J
printf("count is %d\n", pshreRAM->packet_cout);
/ t+ }7 ~) [( W( @3 y! B/ Y
count_copy = pshreRAM->packet_cout;
3 }# a6 z6 A Q% h: N
}
+ ^. A3 U& \+ p2 t+ u7 ?: H
else
9 g g% X; O2 r0 ~. m
{
# \( @& d, H. A/ k8 A
printf("No effective message!\n");
9 i2 A: V9 S/ M
}
0 @& J2 g3 _7 n" o- f. o
}
/ K1 n3 B$ Q. e# N! s# x( a
: Q4 _2 O" P3 ^9 s2 e: K5 {9 H( j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* d5 J7 i" |$ y. W
0 M7 F& G! a! ?
& S2 P/ v2 P5 F+ d
/ X$ t+ ~- B3 D4 D
, u1 Z5 s0 F: P) J5 t, @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4