嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
P5 |, r* w; ?( _+ S! H
' h8 r! h/ x( i. M( M& ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! K- i6 X9 e& N+ i* h
#include <unistd.h>
6 t7 [% e2 r2 v
#include <sys/mman.h>
: e! k; g* Y5 a/ _+ Y! p5 C
#include <sys/types.h>
7 h0 h6 z- Y0 h
#include <fcntl.h>
9 W3 x" V `$ B) q
+ E" `- E3 a! b g
#define SHAER_RAM_BASE_ADDR (0x80000000)
; S8 }8 `3 a& w% H
m$ s( X3 X- E/ G4 Y5 p }! l {
typedef struct
9 e! N4 f# {4 R- K. H
{
% m, f$ a" N" H4 t7 p! _
unsigned int a;
& W/ {" [4 v, D+ E T3 d
unsigned int b;
* s# }) y3 _6 N1 Y2 b6 k, t% V
unsigned int packet_cout;
$ T2 S0 p' {' |' |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( t8 N3 \7 w1 k+ A7 X3 O2 A# _. H7 L
( Y2 b9 k9 q+ i/ T& l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 j9 C+ r7 n$ B5 w F4 G4 L6 G
unsigned int count_copy = 0;
9 }3 M7 I/ { l" Q( j! u
3 A, |- V3 }" U/ x- B" e
1 n, o- T% g' q; m5 L
int main()
" O; X: z- a- f! x; H1 h* B% J
{
- g2 _1 K1 d- U3 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
) T. l6 x! ~5 D7 H+ C! P6 l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% J3 u U" H7 L1 N' G4 k' T
0 s' A; u. B6 [' _0 g- T3 w' N% `
while(1)
* @; [; z/ F4 c7 F+ @3 u
{
; @( }2 N3 { P% h
read_MSG_buffer(pshreRAM);
; T3 T0 D# |9 Y
}
& e; Q. P n9 p0 m* r* {) P: T
}
8 M$ s4 J5 c/ W( o
$ b6 b& A Z9 u1 C6 i3 z& x/ ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- \0 V b" V: k. L2 T
{
6 R# |; C4 z" r& x+ Q- c9 ~7 Z
RX_MSG_PROTOCOL buf;
2 t# r& y* n" W d- o# r
0 Z( X8 W1 e' Y- C. }
buf.a = pshreRAM->a;
! S& \6 m+ T' y4 {
buf.b = pshreRAM->b;
, H9 q$ }& E5 L2 {9 S* s9 R! c
buf.packet_cout = pshreRAM->packet_cout;
5 n' y; H p5 ?$ N, ?1 ?6 G- I$ H4 t
/ L/ O" S" w' U+ b: k
if(buf.packet_cout != count_copy)
) S' p6 `& \: {( |! P
{
; Z$ R- W2 n8 u$ M% O
printf("a is %d\n", buf.a);
% X" I, v; ]( J8 C/ B# K" W( ?' U
printf("b is %d\n", buf.b);
6 g$ i" t x3 K' C6 O- K
printf("count is %d\n", buf.packet_cout);
( }* a7 _$ v( f( Q- M+ `
count_copy = buf.packet_cout;
- l* c1 D1 Y: g- J4 M7 b% Y
}
8 i* s* G t1 m
else
( M- l, ?: v/ Q9 l; n5 p
{
" P$ k9 x/ R( j) B
printf("No effective message!");
& a2 |4 L! O. S) r$ g$ K* b
}
( b( f6 h5 i( m% l8 `% \' ^
}
6 K3 M, X8 Z: b' Y; Z
, v% t/ N; s" S8 F
$ E' N( Y; q+ Y$ i4 a# K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: K; A/ |! n" i6 h# N& C
使用下面代码,对内存使用了mmap函数后:
% O6 x0 ?1 X- W# [4 E
#include <stdio.h>
) r, [0 X9 U3 t% |
#include <unistd.h>
" P7 V4 Z* X8 ~7 h! ~8 ~" p# Y& ~
#include <sys/mman.h>
4 A4 U) H7 r6 T9 Y. ?" C" j0 s
#include <sys/types.h>
" J8 L' v7 g$ @
#include <fcntl.h>
% U) C1 N3 V- r6 R* e7 z! d, m5 [
" v) [1 [3 [% G/ D7 E) s7 N R @
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 t3 E# l2 q6 G9 s$ l
#define SHAER_RAM_SIZE (0x20000)
$ ~% z2 ` y+ A) v( I" ]
' A; l7 {, C; R# N( i+ L! c2 I
typedef struct
" u+ m5 P8 f# l6 A1 P( }% W
{
( B" V* g0 E% z: F7 v7 M' i
unsigned int a;
8 W1 l1 n3 ^) \; d9 U3 |$ F5 t
unsigned int b;
: L' O+ }. z# j5 F0 Y4 M1 \1 l
unsigned int packet_cout;
4 k8 N% t/ l0 Z9 z4 ~$ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 n! E% o4 y7 a) [, b' ^
0 s7 P; P' Z& o9 t$ J
void read_MSG_buffer(int *baseaddr);
9 J5 E8 V0 J0 l
unsigned int count_copy = 0;
: ]" v8 ~$ c7 m% M/ J: O! q# Z
* i9 H' O; G' z+ y3 ^5 G
int main()
5 `8 _5 C9 q* e- S
{
3 D* T, G0 W% Y3 Q
int fd;
2 \& k" I+ F9 u3 B% [1 P- F# n
int *mem = NULL;
7 K/ z9 j- g# h& }3 U! D
7 M9 x+ [; k- O/ P2 d+ p( ^) v
if((fd = open("/dev/mem", O_RDWR)) <0)
6 D" X) U y* S6 }) g1 p% _
{
3 |' h( x7 }. p) m! s) K: ?
perror("open error");
1 Q7 d/ @3 b) L( I- |6 p* `* C/ _
return -1;
7 N# j% W( X2 l. M5 s0 ~
}
2 A; m2 ~+ P) A/ s' N- j7 n
9 o' E5 v- n r8 y/ \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 I. o4 g2 k! {$ N
- J+ z" _ s5 @- I2 Y
while(1)
% B" T$ L( ?$ L: ]
{
. g/ U! x% X w5 ]* R: r6 P
read_MSG_buffer(mem);
1 G# P3 K- h3 R Q: f
}
) i: P; ~- G) C) y. K, U
}
: y8 d8 l* `$ h& B1 o; j/ v& n2 W
5 y4 J! m7 @' Z- @: R* l2 R7 G
void read_MSG_buffer(int *baseaddr)
" x: B% h& e; y" C: z5 T @
{
4 e/ z, h9 D: P4 P7 A, e
pRX_MSG_PROTOCOL pshreRAM = NULL;
) T2 v M( S- N6 s) g6 I
; }: U* u. a2 w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, K( {& X3 k; b7 F' Z3 z* |
, R9 }% M8 L# l8 S
if(pshreRAM->packet_cout != count_copy)
4 c2 r% D6 a$ @) V5 h% f7 a
{
" m$ B# e; Y) \' V! l: M5 ~9 R
printf("a is %d\n", pshreRAM->a);
, G! L. X" `' d. ?
printf("b is %d\n", pshreRAM->b);
9 q( {+ Q% m# p% f9 I5 L0 K3 h& v
printf("count is %d\n", pshreRAM->packet_cout);
3 z! D% Q/ y1 ^' y# T
count_copy = pshreRAM->packet_cout;
; B2 d" E& g/ h" Z% B' l! Y
}
$ w6 [* }, }0 S$ q
else
0 {; c# s S: }5 @: x% P7 f3 H
{
( B- w( t6 Y* g
printf("No effective message!\n");
9 r! e) y1 g4 s# J- C+ H0 x
}
( @# S! F: ?& q* T- l- Z7 U
}
% R v' ], w2 r% n; G
* K- f. A f# X( @7 B/ O1 P' V
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 T# L4 c& x. [ N& b! U% F. F
$ p1 n# d) C# C: X* b# w
- q% D% g+ C2 r2 m5 `! i. k
. z5 A- _. V& `& H1 @3 W# I
. h7 w" Z* t' M* u: C7 I8 U+ t
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4