嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 d. y4 q3 x9 N6 V. C) [8 T
+ L6 E6 e; V0 g P, d6 c* Y0 X5 R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 q, y' e+ _; @# u1 n; }0 ~
#include <unistd.h>
/ ]% U5 g7 t0 Y. u5 h& H: p
#include <sys/mman.h>
. F3 h3 e: c- f4 m
#include <sys/types.h>
D. m9 a0 Z) m' B8 ~& z* Y
#include <fcntl.h>
, [ e% x* h: m! W
' z, @; j$ ~ A G
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 T4 t: p0 i# h7 w) N- Z! j
) x0 P! X; z. G* A% X3 m7 ^. ]
typedef struct
; S, o1 A7 O' w/ h/ a
{
/ o* H& t1 y7 c4 u- ~0 u- H! ^
unsigned int a;
`( t( _5 _( l- a
unsigned int b;
- N9 S7 K( G) X. |( u
unsigned int packet_cout;
: m. t8 O. b9 A6 V$ c7 Q# Z s6 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 x8 {. {( x: E! ]& O# @
& m4 j9 |$ A2 y. n* W' s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% f! u! l% s6 W1 R+ ~7 y1 c% c
unsigned int count_copy = 0;
; o3 V# s# n9 ^! @, j
) Y" X' o ~+ e; J( E
3 C, w, L1 d" [2 a% E
int main()
: v* O: A/ h4 {/ n0 W8 J* N
{
- I8 q% U& S$ v/ _* L
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 K. F/ M; `, X( X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, v9 L, Y/ M! K$ _$ ^. i$ d( e8 a
5 m' X: Q+ p6 \# }. {, W; w3 z7 t: L, C
while(1)
4 O4 {8 m$ L i3 z/ f1 P( e9 q
{
- u) B0 w- x1 X9 N$ I, `
read_MSG_buffer(pshreRAM);
. G8 R* z8 i. C1 V+ \ z
}
% i' j' L B f' c2 p
}
7 j. t0 D0 l& f1 b* Q+ X
b5 t4 \; b! Q2 V7 r* z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, e- R! q9 T1 t( j2 ~. M
{
; Y y$ N3 T' l% O- ~0 q6 f
RX_MSG_PROTOCOL buf;
( w% _# S H$ [
( m! d1 E/ U# C. p
buf.a = pshreRAM->a;
; \% a0 E% i( F* F& ?
buf.b = pshreRAM->b;
+ @: E* W/ h) f2 ~# n* v2 \
buf.packet_cout = pshreRAM->packet_cout;
) p0 j/ p( S- G! P, l
" c" R! C+ D0 r( w0 A( j
if(buf.packet_cout != count_copy)
7 h/ @4 _8 v0 [( ?' b7 z9 T; s
{
, P/ E& P2 I8 U7 m
printf("a is %d\n", buf.a);
( ~ ~( q5 i& b* r/ [! m
printf("b is %d\n", buf.b);
+ G$ h/ L/ x5 J% ^2 K
printf("count is %d\n", buf.packet_cout);
?( U6 X7 |4 }( l$ f0 ^( z4 b; I5 [
count_copy = buf.packet_cout;
9 d/ e4 N* D- @
}
) S7 _) N8 R4 v" s$ U
else
6 X. l- x2 F- {( ^# ^8 _
{
% n) g; V$ H- @5 p9 C
printf("No effective message!");
0 P- h7 s; p& p3 N# O0 x( r& c
}
( h I0 V4 z1 w+ b5 h) S+ v% G" f7 k
}
+ o% T( v% K8 Y2 y8 t5 J9 y
* O Q' T7 z. s) L( {
9 v; @+ N4 m3 v# } K2 R0 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 ^/ c. q+ O- j$ b2 y4 r& K a
使用下面代码,对内存使用了mmap函数后:
! H2 j2 Q$ d5 d, J
#include <stdio.h>
" Q# O3 O' P- h% m9 K
#include <unistd.h>
, \" z5 P8 M7 F! @1 s
#include <sys/mman.h>
) G6 m! R$ r6 b- w+ z# `9 A* t
#include <sys/types.h>
& `$ A; f. q7 B
#include <fcntl.h>
. U8 a' K3 A2 _& c t; e: ?
3 U+ a( w1 V! A2 ^$ M0 z
#define SHAER_RAM_BASE_ADDR (0x80000000)
: s$ I6 |, |* j3 ]& g8 ~' O, S
#define SHAER_RAM_SIZE (0x20000)
! _: d% I `5 d5 {3 C7 [
: H O w( c9 }
typedef struct
/ q+ R. m1 o9 j) V! q
{
4 Q' J7 o( Y) q; K: r1 g
unsigned int a;
, A s& j B) }8 | | h$ s' a
unsigned int b;
' z: k+ g X2 {0 u3 [, m- m
unsigned int packet_cout;
3 v! W# r' p& G9 T6 I# p& Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) G j! R0 V! w/ l0 W; Z) x5 w* f
- [+ C, D$ Z" ?
void read_MSG_buffer(int *baseaddr);
# ], s/ e% s1 G% z. W8 W* F1 d
unsigned int count_copy = 0;
4 F3 z! p' D6 I' d
- ?" U; U$ H9 X' o1 d/ m& R1 _
int main()
j2 p4 i" A! m& |
{
8 {5 Y% Q v* ^: T8 {
int fd;
1 s7 e' F" ?8 z
int *mem = NULL;
b) E- D: c2 e4 L
^0 E$ T& l2 Z4 u Q) U, `* C
if((fd = open("/dev/mem", O_RDWR)) <0)
1 @/ N; z% b4 {3 l/ d: E1 e
{
$ }8 v5 K; ~0 q& K& j5 u0 o7 ?& V
perror("open error");
8 a6 y1 D+ K( m: P" `% [
return -1;
# D1 ~, z/ {+ C) }3 K+ r
}
) c, l3 Y8 _5 P# e1 u
i0 \4 M: K; p y1 W6 A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" V/ F) Y& c) [6 g
7 W8 k9 }6 U( h2 h. m$ }
while(1)
/ ~7 h( G0 t6 N1 }4 v% i3 q. y
{
6 L( p; ?$ N/ k7 R
read_MSG_buffer(mem);
* d4 o0 x/ M& Z3 z4 a) c$ s. h( R
}
% _( C: i; k' d+ s. \& l
}
7 u+ M/ g* l: p! S. a
/ T( I1 S' J' ?) ~ r
void read_MSG_buffer(int *baseaddr)
6 \; K; K3 w+ f% H2 h
{
. Y. A# o. l0 M" O4 u. l$ V
pRX_MSG_PROTOCOL pshreRAM = NULL;
* `1 h5 G# U3 y' l5 W
; ?) I* Q! t0 U! _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( b4 B1 ]/ q8 }- ~- ~
$ t7 H! L7 n) p `( {
if(pshreRAM->packet_cout != count_copy)
+ a- z: |4 A0 L" C/ y
{
, l j! P& Y' ?- k. m( w
printf("a is %d\n", pshreRAM->a);
; i% a3 Q8 Q" {" u
printf("b is %d\n", pshreRAM->b);
) h- H9 D6 E6 i+ x# c2 k2 z- b; M
printf("count is %d\n", pshreRAM->packet_cout);
! L4 x% x6 p6 g; h$ g+ d3 L
count_copy = pshreRAM->packet_cout;
3 T( u* i7 Q$ P
}
% O# l+ [4 h% b7 g% ]( X# ]) ?& a
else
1 ] r4 h2 ] x4 c# U3 z
{
) |3 a& C' v8 k- u
printf("No effective message!\n");
2 b9 o4 t9 n& E9 s
}
/ }) y0 m q3 y8 I& q4 I
}
1 O% `! d0 @) h. M
# I8 \( d9 U6 f4 b! X5 E: a6 I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 n+ q% v/ t& J" X# T4 ~
2 r$ [" ^+ I, o1 E" n4 M7 P
) P! ?& N) F5 S) t
( D: y9 h- O% u- p P2 i
5 m' {1 k) ], ^- I) a! H I
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4