嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ k9 q$ v8 v( \. D( w
* A4 |8 z' f, W: b- c9 w0 k* X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 K/ G1 ]: J( Z5 X- v" k' s6 q
#include <unistd.h>
+ F/ L6 q: |; Z W/ L
#include <sys/mman.h>
% |2 x/ f. e1 s2 _
#include <sys/types.h>
; }9 ]7 V7 }& U# y( |: E
#include <fcntl.h>
- E% }; R+ ]* y/ ~+ C( [7 F
, u) }" f D$ @7 }% i) E2 _
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 A: [( W( C; S8 P
0 I8 @! |# `: a
typedef struct
2 m6 I/ ~( p" j) A6 b7 u
{
5 `: e/ ?9 L$ |; I- S' R- K ]
unsigned int a;
# I$ n7 Z1 v6 z, l- U$ S+ P
unsigned int b;
8 J5 |8 [6 Y1 S# N" Q) U; B
unsigned int packet_cout;
7 Q9 n/ m+ _- g: Q8 w" h* z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% N# P/ S8 k2 T1 S7 B( b5 c! l! y
9 A1 O7 H2 q1 o. O6 U1 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 M2 b5 G- q# p, z& e: h
unsigned int count_copy = 0;
0 o& h, u& @+ `' [: ?% ]$ R3 n
1 z2 {( d+ P7 B
/ e7 f1 t6 R8 A- r$ ?) ?+ Q3 n
int main()
* o5 s* z y. e# M$ \. f* L
{
* `+ ~" {0 ^% _3 i6 g) M
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ R9 L. K* F9 L0 I( ], Y# k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ I9 Y- {8 Q: f1 h
5 B* C4 d e. [+ b% H- @0 @
while(1)
* W6 I5 b2 f* e7 a2 g( e' y
{
8 _5 A6 v) W% D
read_MSG_buffer(pshreRAM);
' J% K1 s& j' R; W1 w. ?
}
7 |8 E7 C: U0 x- x
}
_6 }6 `' s2 I) c( N
- X* x$ X; x2 ?: `2 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: \2 R2 ?1 f7 m. o8 [- u
{
7 i1 d" {- |& c& u+ t+ W
RX_MSG_PROTOCOL buf;
. s) U) A ]4 R
8 X7 |1 {8 S- W0 K, w! f
buf.a = pshreRAM->a;
( s) e- C' `: B1 z. q# x
buf.b = pshreRAM->b;
1 Y2 q. ]2 K: j- e% i
buf.packet_cout = pshreRAM->packet_cout;
+ {! n& r; t: `, ^& ?
5 n* N6 Z+ W; b' c
if(buf.packet_cout != count_copy)
! J' g' S( z/ t, E; s' d
{
0 w& u$ T! o0 x, V. h L
printf("a is %d\n", buf.a);
" A5 }7 Z$ w& k
printf("b is %d\n", buf.b);
6 ?) G( n% I) b: i3 f
printf("count is %d\n", buf.packet_cout);
+ g; W2 ^6 ^9 r& @' N
count_copy = buf.packet_cout;
2 A* u* O! f m- K, h" @' V1 g# F
}
( `0 A/ R( l* q8 S* V$ `1 T
else
) L: M1 D% G6 g4 p( X
{
/ o0 @8 h+ e! k" F' v
printf("No effective message!");
2 E5 ^7 \# H$ ?- Q3 r2 ]5 ]( e1 X4 g
}
2 Z1 h* D2 i! h7 ^
}
h! a4 o* j% U9 g, @' N+ O$ O! y
; i: ?2 P8 X' k3 {7 ]4 ]6 r i) D
6 X9 v2 ]3 ]+ J! h/ d. y; x8 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( y$ v& L8 }' D. x+ J; l3 X
使用下面代码,对内存使用了mmap函数后:
. \9 J: l6 ]/ S. I- w5 n) u
#include <stdio.h>
/ M$ V" ]3 F* ]- J& Z1 k. [
#include <unistd.h>
+ G2 ~5 O0 p7 u4 x5 m" P
#include <sys/mman.h>
8 h; ^' c0 a1 Z; L8 U9 M+ B
#include <sys/types.h>
) p) r, Y, H# Y3 X; c
#include <fcntl.h>
* c7 `0 K9 z( P2 D
* D3 K* Q9 m! |" _ D
#define SHAER_RAM_BASE_ADDR (0x80000000)
' V9 P- L* p+ y9 v; j& |+ F
#define SHAER_RAM_SIZE (0x20000)
1 P- e* i+ j7 H* }' X$ W4 M& V% @
! @# h6 y9 O) ~
typedef struct
# T; I' E2 y( S: D+ k2 O
{
y; K$ \0 t, A' f2 R* ]
unsigned int a;
4 y! s* n( m/ v; n" b
unsigned int b;
" @' P2 O G f% S8 j& ]
unsigned int packet_cout;
! ]) M& i! S9 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ J- v" [" i+ _4 _( m6 k! z0 ]
1 c+ W, v8 l+ u( V
void read_MSG_buffer(int *baseaddr);
' n1 S1 t: o# z
unsigned int count_copy = 0;
' x E( r' n$ w- W1 |
# R1 ]* w7 X7 J9 F0 H! k" @) _
int main()
! N! u$ O& }4 @
{
6 n: ^' i- i' U9 o
int fd;
9 F; C7 C. ]$ K1 D
int *mem = NULL;
1 U, Y7 j1 a3 L5 h2 q
. F) y% X4 g: g# Q9 }
if((fd = open("/dev/mem", O_RDWR)) <0)
! ?( j& s) v5 ~& T3 a; O3 M1 h
{
! m4 P& z) X1 {4 X
perror("open error");
: j: A6 v( U8 _
return -1;
: `% o# l: s5 h9 x( _/ H
}
% E+ H. T) v, s) A) O3 s( d
, A8 u# Q4 o5 k) l$ j$ M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, \" F+ }- @6 w) p5 X W0 B
) y3 E( l- H% K, w0 l% u8 w d
while(1)
9 s: F* T5 w; n/ _
{
! |2 C3 J' H5 y% E' t7 z K
read_MSG_buffer(mem);
) x1 ?% Q/ h# t1 M1 V" W% k
}
' L; e" \ x9 V
}
9 Y+ |" N t0 f1 I
, K' x/ B5 C% ~ _1 ^- w4 ]; X O
void read_MSG_buffer(int *baseaddr)
. K2 _( W- c; N
{
% O" Z: w1 E2 F4 ]/ O" y# R
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 D) p) I1 f1 f. z' I4 N. g. @" t
+ M ?6 w- A1 ]7 K3 l) e0 N) o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% u# l1 H! V7 G5 V0 O$ q; J, U
- k; U# B# [+ J
if(pshreRAM->packet_cout != count_copy)
6 j/ O3 M( S7 h4 w5 r
{
1 g4 I/ \% r6 A2 m4 B. S7 P' G6 @
printf("a is %d\n", pshreRAM->a);
7 ]0 r4 [0 S& |4 |7 B
printf("b is %d\n", pshreRAM->b);
, O& u3 W4 y* K1 d! C( I: C0 W5 ]
printf("count is %d\n", pshreRAM->packet_cout);
$ }+ e' Q J* O, C0 u( E! H
count_copy = pshreRAM->packet_cout;
7 g9 P- e, x3 q- Y" B7 ` r
}
+ \6 L5 q& O( F( y3 [ ]
else
/ g8 o7 c1 ~. |9 O
{
( @( b" u6 p! {; R( z
printf("No effective message!\n");
. q$ J5 H6 |* J( d& g6 n& r2 k
}
! ~. k( D' n( p- B: |& _
}
# Z% c. W% B9 m# M/ m2 o2 y
) c0 c1 P1 x# M# R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 A* D" p! o2 Y; Q0 _3 t
/ I: L' t; z# W% s
5 `2 j( w" v) ]- k+ ^, t& H" B
4 |2 w9 V M" v) `0 o
+ d. G* n8 p$ U# f6 N0 o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4