嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 X& q: t6 Q5 x" P
$ v" j% t }- Q, D3 Y/ J) w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ b; b- ~% ^ r' a! `2 `9 Z
#include <unistd.h>
4 `# B: Z) s3 c1 [' b! K
#include <sys/mman.h>
, A8 E/ i1 f- W- L
#include <sys/types.h>
+ {+ q/ {+ V3 T5 X( \. h) @
#include <fcntl.h>
" t1 O+ A, t( n8 z
. R0 N* I+ [8 q6 B" Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
* n y1 r8 q% E: a; c
! ]: N. z% _5 A* v" L
typedef struct
4 i! B* }' x4 v
{
; h0 P! P# C: K- ^6 ?
unsigned int a;
8 i: T2 O- l' J! A9 f9 `
unsigned int b;
: a4 _4 f% [8 M0 d/ l
unsigned int packet_cout;
5 A- g7 v. }* {2 b* y7 f) p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! S- L; Z4 k1 O' ~( E5 f
) p' J* r9 Y7 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 |8 E! b3 Y8 |- k& {
unsigned int count_copy = 0;
0 V$ a% g; {$ H# W$ P; |% o
1 i: E) ]4 W) S9 ^; J; M* u& [1 w
0 _5 z1 ^' G2 B
int main()
: G9 x& T" ]( u2 Q: y
{
p/ m& u3 N" q' l8 p1 K' E: C
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ W9 `3 S5 d! J! e! M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& n$ W, x" ^0 }
- S' T, c L/ o+ [5 L0 E! ~6 c
while(1)
2 b1 d0 `& t; g" ^, j" u
{
3 N) z E# J( x S/ Z
read_MSG_buffer(pshreRAM);
4 n6 A8 l u( s0 I- Y
}
$ q8 L/ }( a9 y" e$ X! v
}
7 o7 x2 h+ n2 R. Z( h
5 a" f) ^* d8 d( i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& W4 F1 }% z$ r; E$ r0 d1 j* y9 q
{
# B7 H: `% f/ S
RX_MSG_PROTOCOL buf;
6 H$ M' P1 P' v( h5 e+ K
) ~( f5 l. U( P/ N5 `- J8 @
buf.a = pshreRAM->a;
: m( e- h$ F; B- Z
buf.b = pshreRAM->b;
9 Y) q% Z/ Y6 R' S
buf.packet_cout = pshreRAM->packet_cout;
* V5 J: l; z% W; n5 i' f5 B8 f
D3 n$ T" m5 l7 @
if(buf.packet_cout != count_copy)
: m8 P. L* z# A0 F
{
- s( S2 U/ n1 R( \, i/ r
printf("a is %d\n", buf.a);
' G4 a _+ D( N( A0 b
printf("b is %d\n", buf.b);
/ h! ]. ?; P$ _
printf("count is %d\n", buf.packet_cout);
' E. U9 G* P' O
count_copy = buf.packet_cout;
3 M/ R* J5 s i' m( V
}
& ]8 D" P8 A J/ {, N4 U
else
$ l' g, f" B6 w$ v! z
{
3 c z$ ~- c2 {
printf("No effective message!");
% K! _& I8 M3 B( |
}
- l9 g1 S* V A/ z; w. c
}
& E3 B- [9 ]! ~& G5 h6 C
: [+ l! u1 S3 [
0 ^$ S7 h3 _. f' W" l5 ~4 q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ [' l/ M; O6 G
使用下面代码,对内存使用了mmap函数后:
^$ H6 \* L$ K+ y, [
#include <stdio.h>
9 H C5 i: A4 u8 f/ b6 j4 q
#include <unistd.h>
# _, C$ C6 ]5 p3 B
#include <sys/mman.h>
- c5 k+ j2 s1 f5 q8 j6 ]
#include <sys/types.h>
$ @( ]% y2 F" [/ E" a% R2 u% A
#include <fcntl.h>
9 t0 x) x( [- k' z! \
! E9 ?# a S, w7 o* _& c
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 p& B7 J2 B$ d/ k9 X D
#define SHAER_RAM_SIZE (0x20000)
' j& ~! B1 i/ @% I
+ v( a6 f: o+ ^9 I
typedef struct
; G8 J: @# B7 h5 t ?7 a5 B
{
% Y8 u- p& G) m M. ]0 a& R
unsigned int a;
, L7 t- N; l9 C- O
unsigned int b;
' b0 H5 u# V3 h3 |/ Y3 w
unsigned int packet_cout;
/ }1 F. D+ {2 z& a4 n* {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- A8 X& P- }; N/ }
0 k* H5 h" r6 C0 m8 I
void read_MSG_buffer(int *baseaddr);
+ F0 i" h% @8 t# W
unsigned int count_copy = 0;
6 y2 k* X& Z# `3 ^6 c# [ e
3 A9 i4 v$ s" T- h( m% a! ]' m
int main()
& L6 Z# H3 y& x# N7 U
{
! x+ s) c: N$ C2 i
int fd;
/ e: ~/ {$ u% k1 l" i5 P
int *mem = NULL;
7 X- C% \% ?4 H8 j. N
/ O- ?4 d- d& N; e; ?5 E
if((fd = open("/dev/mem", O_RDWR)) <0)
0 s8 Q* Z, u% n6 P! s) h5 G
{
2 y- N: _6 Y, M! J$ P, A: P6 ~: @
perror("open error");
- o6 `! j! \; O5 }$ X3 y5 L
return -1;
5 {# u ?$ h: i* N& g9 [
}
" r9 a. ^. b5 P" y, H H" e
! M! f) X. z; O# ~8 w4 W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 s) W. K0 m& J0 c1 L) _ n
- D5 W! Y& ]" e! R/ q8 ?
while(1)
$ |& @5 ^* H- I6 |/ m
{
- `! D1 ?5 C. ]' N3 {$ c' f! n
read_MSG_buffer(mem);
( [2 i5 i* q+ I& A& C& W0 t
}
9 Y% \$ ^, ~9 m* `; i5 w
}
0 ~; J" G6 p' S
* J. p* s7 M' g' s
void read_MSG_buffer(int *baseaddr)
# @1 o0 J( m$ w/ C) s- _& J- `
{
5 D9 p Y) N' P, }, T% g2 I' W
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 b3 G O* w; r4 ^9 X* e
( v+ C. ~7 ^9 @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 |# B' G' D! `( w7 u
( H. B# {) ]: b* T# B5 b
if(pshreRAM->packet_cout != count_copy)
0 Y7 U. U( K, y, R1 i: c4 s M
{
9 \, i# [1 h) p% p3 {
printf("a is %d\n", pshreRAM->a);
5 b' ^! K: w ]5 W. C5 _
printf("b is %d\n", pshreRAM->b);
. r( N7 R. t0 P# S
printf("count is %d\n", pshreRAM->packet_cout);
2 C" K/ |3 t! ?
count_copy = pshreRAM->packet_cout;
2 I) |2 B9 p! U; [! r7 I: _
}
* U, | f& K d- A
else
0 B4 t* v: R0 O4 y1 }6 R
{
* O% ]' A9 V. t
printf("No effective message!\n");
0 b; C* W7 e1 T; r
}
! \( A) }; B' d, u" z2 k$ t/ L
}
8 R7 l2 V9 l4 O8 X. G
( r- @8 n+ l# b3 A+ Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 i) K0 p2 l x2 l
. }7 G% j- M3 e0 |
0 q- S8 q @$ X
; d5 i2 `1 o" K- P* t
% c' V- Z4 E4 S4 E" w% Q' I; L
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4