嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 F I& J7 w z
/ g7 j- c. U3 o1 H8 x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 _& k8 M% ^: L e2 |$ L# \
#include <unistd.h>
8 W9 }2 a3 B9 G" \; s$ x
#include <sys/mman.h>
' f5 h1 W$ u! s
#include <sys/types.h>
; A' C7 m+ v3 [ X' S
#include <fcntl.h>
) T" H+ F8 J2 J+ a! a4 U+ [
- K2 T4 \ N0 I- m
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ~" W, q7 X1 Z
7 H3 q% T7 U9 }' O1 c1 J
typedef struct
- K! |7 d8 r( |& a9 G
{
- N. t1 {( f/ c, S; I
unsigned int a;
; k% R8 ?! |* e. k& W
unsigned int b;
& J- K# R k g( o. g- B X
unsigned int packet_cout;
& V9 B0 j/ E. u. m6 A# I% g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" X/ J: C7 H+ D+ f n O# A* D
m8 C& t/ v- g8 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 U! w: ~# P. z7 f) }
unsigned int count_copy = 0;
6 q' } m* } s' _6 C& R- n
) X ~+ S1 {( ?4 i+ P0 f: @
: ]9 U- x) P* N5 g
int main()
t) T0 Y$ B% d
{
& X) z/ R: [* L( s
pRX_MSG_PROTOCOL pshreRAM = NULL;
& `5 X; E/ M6 B- }, w3 i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
^, I+ }# k' R% y! v3 M
. H& Z2 y0 T3 c" E0 w
while(1)
: t# l- \. l5 J5 w+ `
{
4 K2 T, T2 F) b: [; ?* l
read_MSG_buffer(pshreRAM);
! K1 G- ]; E+ _ Z& F6 \
}
2 K0 @; `, p' T* q7 e# z
}
d4 {! C1 ~; e# u! }! i
6 Q, L3 y! ~9 G6 H, x9 G! m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: n7 I* h$ U4 H: D# Y
{
6 L4 ]. F; x5 n, u& F% w2 [
RX_MSG_PROTOCOL buf;
1 `( r4 y& n" g5 i
( Z7 f, R, c: z3 E% L* f
buf.a = pshreRAM->a;
8 F4 }- U1 c! a1 N; M; ?
buf.b = pshreRAM->b;
9 m2 o& I: b5 p; {* m) K
buf.packet_cout = pshreRAM->packet_cout;
: Z! V6 j) X4 u( A
6 T+ ?3 @, l$ T
if(buf.packet_cout != count_copy)
" u( i+ c8 s0 t' r* ~
{
P9 |9 k* V% [. [7 y& t/ O5 T; \
printf("a is %d\n", buf.a);
( S. a# J* \) O: a/ |& Q
printf("b is %d\n", buf.b);
) x+ s, K# N, K) i6 K' K- g
printf("count is %d\n", buf.packet_cout);
3 M; Y9 Q" ]6 C M4 k
count_copy = buf.packet_cout;
1 l' R5 y I4 X( c \
}
- `- G- r; g3 |
else
) q: D* N; T5 Z4 _9 D7 V
{
* G) w! G1 E0 H- o4 |5 N. a& M: T' k, |
printf("No effective message!");
; y0 w6 P( Q5 F
}
" Q/ |' h% \8 i9 z( ^, W6 b
}
3 h7 W+ `8 o' g& d5 t! P
4 U3 _# m) d8 { P
2 V4 L& o* [, _8 @# h L! L) j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' B' n- n- ^9 W' k" H9 Q
使用下面代码,对内存使用了mmap函数后:
: g3 U! X9 [5 \7 J" ^: k
#include <stdio.h>
) z8 ]) [6 I4 _+ c. h6 A
#include <unistd.h>
1 p, z) H G4 I/ H0 L
#include <sys/mman.h>
' n; C( J+ f8 g6 H
#include <sys/types.h>
/ ]* [# {. l( W8 |% L. S
#include <fcntl.h>
! R$ A+ r7 Y5 E$ E" r! c( c
3 ^' C. |$ c9 `7 p) O2 m9 ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ a% Q4 ?6 H% W
#define SHAER_RAM_SIZE (0x20000)
9 m$ Q. K1 Z( z7 g& d# F; g
) r; E# E5 u+ i L8 {
typedef struct
2 f# o' f$ [% |% X+ m
{
+ q' s5 i2 g7 T5 } k( I
unsigned int a;
- q; [4 e, N3 K
unsigned int b;
5 V8 s; {3 U1 p6 L. Z
unsigned int packet_cout;
; C0 O' N8 y8 J6 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ J, Y/ F9 y: J$ F3 t; n
7 k& R, g a7 R7 N; I+ k- I5 Q
void read_MSG_buffer(int *baseaddr);
! {$ q; j+ h/ ~6 H$ `4 G1 G
unsigned int count_copy = 0;
8 T1 ~# @% t, k0 d1 d2 D3 E/ V
% j2 a; Y; p3 c
int main()
0 P7 Y6 T6 S. e t1 g+ ~
{
0 U: D' E* @( t5 p8 N4 I4 z3 w
int fd;
, k& P+ h# x6 r3 F
int *mem = NULL;
' ]+ d: D* a4 M) h
" B) ?. Q0 _( }, Z) b6 @
if((fd = open("/dev/mem", O_RDWR)) <0)
, ?9 ]% d& P4 ~$ y$ _# |' U% I) u9 `+ P
{
! _" o7 l3 B' t5 H$ E
perror("open error");
9 n7 Q) q6 A. B* h4 j- ^4 r
return -1;
( H5 b, M% N4 R5 Q: C7 b3 p v
}
( j& ?- A* |# [% }4 p( Z
/ C1 n0 U/ q) x1 }$ k& M! Y! @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 N" T1 W" W% A$ J
: |* I+ j2 C. ^4 K: n }, Y
while(1)
0 j. _ d4 `. {8 ]# j$ d
{
. O- |9 Z8 ?: P8 r
read_MSG_buffer(mem);
! Z$ }- m: ]0 a
}
3 j2 F* }5 v1 r3 m3 m1 S
}
; x2 g, I# F9 @3 P1 P ~
. [: v O. V+ A2 Y, a
void read_MSG_buffer(int *baseaddr)
1 e5 F! f/ }: h, j" y0 Z# a
{
* V5 o, V5 L4 D, P4 w- A( v+ J
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 b* U0 u* B& F% x% N# N$ m5 G# @& n
7 k' o+ D: {; C3 z( S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( m8 Y, p( |# I9 f( N- g
0 v" Z3 F) S; g8 ~" I
if(pshreRAM->packet_cout != count_copy)
1 `0 J; H/ O- C
{
* b' j2 y* s4 X% F- a$ w, T F5 b
printf("a is %d\n", pshreRAM->a);
4 e/ K. D" I, G
printf("b is %d\n", pshreRAM->b);
* Y. u. y9 I: O8 Q% K
printf("count is %d\n", pshreRAM->packet_cout);
( ?5 p+ Q, @$ Q" H/ c
count_copy = pshreRAM->packet_cout;
1 @: i0 C- K1 T
}
p A- Y8 a% L
else
) x1 `( B$ {1 D
{
z8 \ ]. y- Z+ a$ M
printf("No effective message!\n");
/ [2 k; w2 r; f
}
6 i/ e/ ~8 k$ i9 r& o4 r
}
7 K( [( e- ^8 Q, H1 r
: q u: L" J j2 k0 E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' o' c9 z/ }. G5 V
' l4 K }; |# x
+ S0 h! ^' F, O3 @& \" \/ }5 {
2 e7 |# ]- i \8 `
1 X4 v) Y3 f: r# \
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4