嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ ^% x. d% u1 k% P
- b5 Y/ b0 U- j) B# S- e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 n7 s+ V9 E1 K+ B. |; Q5 Y7 o
#include <unistd.h>
" O1 e+ z0 R: Q4 d- X
#include <sys/mman.h>
2 c, G. s2 _' _; t
#include <sys/types.h>
, x% A2 l0 ]/ @- ?% `2 y
#include <fcntl.h>
+ C0 {/ X6 j9 W2 q0 L( g6 t. P
" c$ D, a6 p) a7 ]; ~; G! V0 v
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 L3 `! ~- t% a" f% f4 T
G6 _$ ?2 A/ t9 }% n3 |0 `
typedef struct
& j2 O! T! N% n2 f/ m
{
6 e$ l0 n2 K+ V0 a5 W) u% e
unsigned int a;
+ E8 K0 K; Y7 c3 a+ ^/ v
unsigned int b;
6 p! F4 D" k- r+ ~8 u
unsigned int packet_cout;
5 O' c9 X8 f0 W F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; E. n, w/ O: E4 @& d' X
& @) a2 s& u) e9 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( y+ P6 M3 K6 w C4 ]! |2 q
unsigned int count_copy = 0;
9 ~! h( f, x% _. g8 U+ O' n. m
( @0 m1 i4 v X. f
: E4 n: K) H A! x- g! P
int main()
, @# f. K. S! n( O
{
' H2 R; A, F* }6 L6 a( t# \
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 R, a2 C) k8 X4 b& t- K
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& F& N2 H3 w1 s" l, e2 Q* h; l
9 U. |6 n2 O. `" m; `
while(1)
" d$ x5 {. o; C* |0 q
{
- K& q# ~8 z: Z1 l: X
read_MSG_buffer(pshreRAM);
2 [1 Y# _7 {3 J% r' j8 j# m. q+ O
}
+ } g' O# _- e: S
}
( n8 D0 C/ P5 m: k* W6 b* z7 D( q& P. ?4 K/ v
7 g1 F/ |- c+ h" \) i$ i6 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
r+ y4 j6 A+ d$ I
{
! I& L* W( u2 {6 f# I/ x
RX_MSG_PROTOCOL buf;
/ |) u' i% o1 ?4 J
( l; q8 F+ b& O8 g Y) E% L
buf.a = pshreRAM->a;
' I% e6 e1 g" w
buf.b = pshreRAM->b;
- G" |9 Q0 H. W( G9 p# V
buf.packet_cout = pshreRAM->packet_cout;
% }7 U* T8 S! W% O' K& y
# q( A% ^, I1 v" }$ \$ O
if(buf.packet_cout != count_copy)
5 b& \' Y, N! l6 C* y) x
{
8 L5 z6 M1 x# @) C
printf("a is %d\n", buf.a);
6 C( m! e& |2 a- \5 Z9 W2 X' [
printf("b is %d\n", buf.b);
2 E/ P) Z# v0 h! v! b: f! F
printf("count is %d\n", buf.packet_cout);
9 G0 a' K( F* S% M" \# r* m% M
count_copy = buf.packet_cout;
( o7 S% h% `6 J
}
% g8 I8 J0 c. H( Y% o! F
else
* E4 d l$ [* g9 ?9 P
{
6 q7 y9 E% k( F
printf("No effective message!");
9 i3 Y$ s B3 r; p: C# \# ^: R
}
) \5 {+ x0 r+ R% P* m
}
a; I: A- T1 K5 ]
; @7 \$ Q* @( k
V8 S" J% q* K8 r" X2 d( @; y0 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; _# v9 v4 y1 V
使用下面代码,对内存使用了mmap函数后:
" W# ?8 j) V/ w0 C7 {
#include <stdio.h>
: P T: E- J* J4 A0 `
#include <unistd.h>
: ~5 g6 S$ u2 }
#include <sys/mman.h>
Q2 T* D/ R3 u& a3 E& Q
#include <sys/types.h>
) n: _' }: S5 x1 `/ q/ V0 z
#include <fcntl.h>
: u# P; ?( y; K# M5 g
; r' Y/ J+ l) G, _
#define SHAER_RAM_BASE_ADDR (0x80000000)
; w7 d; V; E# h! c
#define SHAER_RAM_SIZE (0x20000)
% R8 x5 G/ ]6 F/ n r$ c
0 h3 }. l j$ i2 w% u$ ]
typedef struct
M8 \& p% ^' g. a2 p3 s( e
{
2 h9 }4 l9 M1 v8 o" `3 S+ p7 _
unsigned int a;
k9 R4 Y8 I1 h* V: I: K
unsigned int b;
1 Y1 w) a1 c/ ^* a/ M, `' n9 H% ]5 e
unsigned int packet_cout;
1 f+ s( d# |# W" _' a( U; F; E! \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 _, S: F4 [4 X4 A: |0 e8 v
, Y- I4 |+ j/ E" R; m
void read_MSG_buffer(int *baseaddr);
% Y ?% n0 D% X9 o" T( {
unsigned int count_copy = 0;
8 C" X( S5 p/ k* J9 |, b
1 T) W- f p% _8 h3 O* w
int main()
7 O t" T# Y0 Q3 ^3 z( }* K9 |
{
( y% t: M e: R3 Y5 e1 V
int fd;
. k; P9 ?0 w* D6 o |
int *mem = NULL;
! W5 I+ T1 l8 ^4 Z
" O4 t8 M/ F6 \( i
if((fd = open("/dev/mem", O_RDWR)) <0)
9 P7 u! M# | A9 D W7 P
{
( K/ ?; v* ^/ D" ` d
perror("open error");
+ H- z( t# I% t- t( _! h
return -1;
- Q8 J; K3 D5 J
}
9 l. }- R# w$ W9 W+ f2 l
9 q, q( n1 F j# t# P; p. x: f
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 K3 G2 w2 O4 P& i+ e
) F+ P3 t1 t: T x# [# |. n. v- F( u
while(1)
4 K6 Q4 K9 p; a* q- G1 ~4 ? {1 k X/ J
{
) k, R( u b% ?8 B& `
read_MSG_buffer(mem);
b8 q& E! q8 a; @$ C, ^6 ?
}
% v7 B2 B* o% X1 F9 J! e7 d; k
}
# K9 r4 b P; h r3 \
/ ]# g" o+ G% \( e
void read_MSG_buffer(int *baseaddr)
/ ]& Z' G8 b2 Q
{
5 C0 w4 d7 d2 k4 M* p2 u" Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
M$ p* m3 M6 n2 C
- a; b1 ]: p* m; u
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 C* T# M( L* O( j' @
4 H0 p- \5 g5 w0 t9 V
if(pshreRAM->packet_cout != count_copy)
0 _1 C# F3 E+ T& t6 o4 Q
{
' I! W9 w& F1 i" [
printf("a is %d\n", pshreRAM->a);
7 [" e& J9 R! h1 s5 p5 X
printf("b is %d\n", pshreRAM->b);
( m4 e- `7 U; f7 d! Y5 h
printf("count is %d\n", pshreRAM->packet_cout);
+ I. O! A- J; G% ~( J
count_copy = pshreRAM->packet_cout;
3 t% N. K9 n! b3 q( Y" ^0 s
}
. F( b; y# V- v" s5 r* R4 S
else
0 r: j- w% B; ?$ H/ Q
{
+ H5 u+ G% m( Q$ C! C# c
printf("No effective message!\n");
* ~, O4 f3 {( H4 G$ n: z2 W6 ]
}
" X5 n' i P4 X) g% c
}
8 i. l Z7 a: N3 y. l
# x7 J7 Q/ m$ a* i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ s& d, y- l+ u; T- m/ m
; c. D3 ^* i# Q9 W
8 }+ P- K- I. S; K+ v
4 Q" g6 _3 a, n" p' P# y7 N
# z7 X, Z8 ]6 g0 S! W/ a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4