嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 x) q. W- ~& d2 F/ p$ H8 b& k
8 A3 t$ W: R1 q4 l; {$ w# K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 I8 }3 u- y8 B N4 [: e
#include <unistd.h>
' P/ ]: ~9 D3 W+ E( _7 [+ t
#include <sys/mman.h>
$ _% v* ]/ |8 o
#include <sys/types.h>
4 r' x9 q3 j) q6 @& I
#include <fcntl.h>
- x/ N1 p' X% D6 t6 u
$ B! \+ k; I3 n
#define SHAER_RAM_BASE_ADDR (0x80000000)
" c5 g. [2 ~3 c0 m
/ A+ A( A* p: U% A
typedef struct
" ?* j* K! O! E2 ~1 l" w, s$ T6 P. Z6 n
{
+ a5 q$ E8 r0 @
unsigned int a;
- h9 h! b. X, B
unsigned int b;
& r6 N0 |, |+ O9 o( e
unsigned int packet_cout;
0 L( J P6 S3 ]" I- {; G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. }, e& V: x. d# a0 }& U. A
; m, Y8 ?9 \0 r5 E7 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
c6 ?( T0 D! }) `% @, B4 D$ l% Q& I
unsigned int count_copy = 0;
' ?9 M; j, ?2 v% b/ L) G" ~! u
X; C' C0 A3 ^3 }! U* a; J
3 q9 t$ f( Q+ x+ k
int main()
7 e& A, h, }2 A/ `; m' E
{
& i5 f, O$ T" e# o& J" |
pRX_MSG_PROTOCOL pshreRAM = NULL;
) j. J4 D: Z% q. {) ?/ J: }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 |6 ?5 q# q4 \2 y
4 h3 L" D6 X0 i% L6 S9 C
while(1)
& E( v _) w) O2 R
{
% i, {1 B8 o& H( c; |9 X1 Y4 q
read_MSG_buffer(pshreRAM);
0 X# a# q2 D% `, R6 k/ C
}
; G0 U9 _" T) D, D$ x" V- \+ E8 z; u
}
1 g; f! u7 d' ^2 ^ r% N6 I7 o' l
( \) W. R& t" i0 L- E/ l. y1 ? K: H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% ]( C) B$ E* I1 [" }- d
{
: b4 S4 B9 q1 C4 W8 Q
RX_MSG_PROTOCOL buf;
! h1 g, G; d5 w- b# {% @, b
& K: O% j' A0 q9 w( C) A: F
buf.a = pshreRAM->a;
( f* K9 p! Q7 _: t. E" y! f: T
buf.b = pshreRAM->b;
1 x1 }1 o; b2 x2 Y ~' I
buf.packet_cout = pshreRAM->packet_cout;
7 P% [; b9 r! B4 J; C7 ~
2 Y) X9 k6 [. I" E& j
if(buf.packet_cout != count_copy)
$ R; r. y' j+ w o# j3 I
{
% @: |2 A2 m; T1 h) H
printf("a is %d\n", buf.a);
4 |8 ?. t' x0 u- ?6 V, N2 T4 h* _$ h: ]
printf("b is %d\n", buf.b);
0 i6 R) v7 Y; J; J" s' Q
printf("count is %d\n", buf.packet_cout);
+ \9 G3 P- ^- P) O1 Q
count_copy = buf.packet_cout;
, W2 r- c4 c) {; _. N
}
d5 h, |$ y' x5 r1 C- c; M( t& l
else
8 C/ p6 ~4 m7 c% a1 }. w( o) x
{
& ]; e- ~3 q* r* d5 c7 U8 ^4 d
printf("No effective message!");
/ }; Z- N/ _1 t3 J) n. B" Q
}
8 G' e' ]% q- x- e" n. X i2 J. w7 B
}
6 n! u" w! _3 \: ]/ u( o
5 N3 R% `+ C% g, `! H' I- C
8 z1 d6 }1 U1 R2 b* L$ q2 f; D: ]
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 R! d8 r' i3 R x' _7 ^8 |
使用下面代码,对内存使用了mmap函数后:
7 u6 a+ o4 Z0 Q
#include <stdio.h>
6 k2 I$ f5 C7 E4 X. S% U
#include <unistd.h>
' [. W- x; Q3 n
#include <sys/mman.h>
& v; Z0 h6 {5 p% V* Z/ a) K% |) t. R2 b
#include <sys/types.h>
' h2 E& Q" ?4 T' p o3 d
#include <fcntl.h>
# j4 }5 b, H( K5 p* m5 {6 L
# Z( E4 b) T, [
#define SHAER_RAM_BASE_ADDR (0x80000000)
: K, S2 H; w& C
#define SHAER_RAM_SIZE (0x20000)
. I0 k0 F* _' C- R9 w' V5 a
* }( a. e4 U' ^ f, {3 t/ d
typedef struct
, Y$ w9 w1 \) Q6 V7 z X2 ^. H" @7 c" D. Z
{
' Y9 y0 }3 u9 N5 U3 _. E3 R4 S8 _
unsigned int a;
$ `. Q; U% n& H9 `5 T% a9 @# d
unsigned int b;
9 G% Y U7 }- i" l I9 ^3 E- X
unsigned int packet_cout;
; m* o) o' o x7 @" `1 T9 L# q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 \4 ]: F8 `* N) q
1 S8 ?% ~) t# @& L4 E$ G
void read_MSG_buffer(int *baseaddr);
: x0 r" x- J5 Z0 G$ |8 p7 \3 Z* y
unsigned int count_copy = 0;
, l) e3 c5 N- N) G u& a. x
6 \8 m- {( z* n b v$ m3 _
int main()
0 u* P2 Y0 G( [2 _) Z
{
6 ~( M: {4 `& V4 G* A, p
int fd;
! L2 B: d6 i7 u# F/ s. Q9 Y3 |
int *mem = NULL;
, t5 G$ o8 N% K
2 H) I' ~9 Y; {+ f+ {
if((fd = open("/dev/mem", O_RDWR)) <0)
/ C4 i3 y$ i, R: C
{
: p$ q2 H- H+ P1 X* _& o. N
perror("open error");
* v' H/ w3 \2 y$ _8 S* K7 o* [
return -1;
# B% p6 [3 n$ }* w' |8 t) F
}
+ T# Q8 h9 Y/ H; t% H& N
4 V& |+ a# g) [5 v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 u! [! {+ G% f v& ]/ {
7 B% t1 x& ?6 M3 h2 l
while(1)
5 w8 |4 i \: `$ M' A& E
{
4 S* G4 }3 d. p: o
read_MSG_buffer(mem);
3 ] v9 M6 T+ ^! |! S
}
; `% W, F; Z. b; P3 J* W# _
}
* a9 B! i- I; b2 O! F; V) N
& M0 q. @1 p( d- }( X4 p
void read_MSG_buffer(int *baseaddr)
$ ^* q$ }: Z% v% S j0 R
{
$ ]/ T. H6 m) X, z; K2 H4 z
pRX_MSG_PROTOCOL pshreRAM = NULL;
( l3 k) K K% I9 _. E' h0 H
( y" _- `- A$ Q. \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ x+ F0 W- d$ h0 q9 _
$ w. K8 J, L: {& u
if(pshreRAM->packet_cout != count_copy)
" ^7 J: d7 \ T( ^. Y
{
2 g- C" }2 t9 y# }* o9 t
printf("a is %d\n", pshreRAM->a);
8 d% W8 a/ O ]( U
printf("b is %d\n", pshreRAM->b);
! k0 O7 c% ^6 M6 c
printf("count is %d\n", pshreRAM->packet_cout);
% |4 ?9 @- c6 W$ p+ k R! H5 Y
count_copy = pshreRAM->packet_cout;
# [' c# [: u/ k# C+ {7 b
}
9 K, ]- P% m8 m$ l2 b
else
/ o, P" Z, ^. X& g8 B" b" x( _! L) M
{
* v! D- P1 i8 b
printf("No effective message!\n");
9 W+ D+ l Q+ ^. M9 U9 e" y. ~& \
}
) g( }3 w5 }2 z6 M
}
( z+ t* y4 O2 ~0 M
, i3 O) P+ Q4 k0 x: b: N, J! o, D* g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# ~( s( K" _' A0 C
1 [4 r9 Z- A7 `9 m1 j0 ?
% i' G8 E$ z2 C( _: _9 f
- Y/ \' n" V! f! ^, {
6 i2 ?) G; f$ O- J# Z2 L* q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4