嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" N& X, X: d2 N) @. |
! q8 z2 D; ]- F; a) y0 @8 @! m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 P% x' c, e4 p7 v0 C
#include <unistd.h>
: v9 L1 M ?/ U9 z
#include <sys/mman.h>
, U$ S6 q$ q* k/ w D7 l: Z% M
#include <sys/types.h>
0 W# n7 g6 o: t- a
#include <fcntl.h>
0 D% Q/ f3 S6 B4 Q
, c+ ^& ^7 T' ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 Q/ d/ i Y" c8 P: u m% l. |
$ F- R3 e; H6 X0 I1 u0 a& u
typedef struct
4 @& m6 Y# |) W o% h
{
; ^) r: \5 a; s; {/ W
unsigned int a;
' T0 l6 X6 a, j' M6 Z4 t9 b4 r- Q, ]
unsigned int b;
2 ?* q# L4 j! k8 {9 V: X
unsigned int packet_cout;
; f9 t/ P5 Q. `3 p; `$ B1 c9 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& t* ^! g) C0 A+ b( n( l
; f# K2 T. P) D. z( e' F! m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 c! X0 U0 h) ~4 J; l
unsigned int count_copy = 0;
; g f# |, p4 @3 X( Q5 X
1 l! { N4 o" k" ]
6 {, e/ X7 o7 r& Z; p) x7 k
int main()
! H5 L5 W3 v6 h, j% e
{
1 G/ c" f, B% j6 r1 S; _. {1 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 J7 @* z" U" v5 N# I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 F2 O- f$ F1 P( ]+ z }
" m/ Y& j$ P' d
while(1)
2 E* }/ @# \7 g2 o# X
{
, a6 [% g. G. v
read_MSG_buffer(pshreRAM);
: \, s/ q* V. N3 V; W2 [* F0 a
}
) y W. A* I5 i7 u) o, N: V5 G
}
7 J7 ^' K8 @ T3 ]: m/ c4 y
8 c. u- {( @, V; f6 c1 s$ M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ {6 X' k6 P% I+ r! `
{
0 v `% w$ Q$ p3 D' R, Y- C o
RX_MSG_PROTOCOL buf;
) L9 n8 b& S0 {6 A* q( l
' \8 E9 P7 r$ W9 g8 @: ` U; c, r
buf.a = pshreRAM->a;
. r1 Z1 \7 `( W& t
buf.b = pshreRAM->b;
* X; |2 _. D; T9 Q
buf.packet_cout = pshreRAM->packet_cout;
) f6 t& V5 s, N) B6 {
) E' u% d, ` D) x/ I1 W
if(buf.packet_cout != count_copy)
/ n' v& D+ u! E, ?( O
{
! @' z' O0 g- j8 h7 T
printf("a is %d\n", buf.a);
0 B- L' x4 g( q+ v1 i. j& z
printf("b is %d\n", buf.b);
0 R6 o3 w! [. l
printf("count is %d\n", buf.packet_cout);
+ s {0 }( B/ x! A y: q" m+ l
count_copy = buf.packet_cout;
% M+ \: Q R$ B7 r! w
}
# N0 C7 ^: X- P# B+ K0 }
else
: _' D; v' v3 U1 U5 s
{
, L6 D1 D6 f5 o+ a# Q2 H! x) h
printf("No effective message!");
$ V/ ]! l. A# L! \# S
}
/ s! \* @ x% Q1 x
}
) I& }- ^' H6 O( j4 C
+ S. P4 J2 L r9 I' O7 m8 u
0 b, {% ^1 @* Q2 T( T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ i1 \7 `; @0 x6 g4 k0 H
使用下面代码,对内存使用了mmap函数后:
; t4 N$ H' ^+ ?5 o
#include <stdio.h>
: v- Z! b4 I: g7 ~7 u9 J
#include <unistd.h>
2 |2 R+ O6 J: @8 x
#include <sys/mman.h>
( t9 ?/ H6 v0 t" l# s7 M( f7 W1 x6 }
#include <sys/types.h>
; J: I1 |) H4 z6 q2 f: ? }9 F
#include <fcntl.h>
" ~& y9 `& Z$ e: j, m, T7 X# n4 A
) u y Y% Q5 q6 J- O
#define SHAER_RAM_BASE_ADDR (0x80000000)
. @ D3 \7 o$ v% f# W
#define SHAER_RAM_SIZE (0x20000)
, Q# S b/ m% Z; h& @ X9 ~! P: H
: ]/ a- Y; A s2 @! B6 }
typedef struct
5 Q& I& z) K8 n: s( _
{
, \- ?" W: n! y" K
unsigned int a;
8 h/ V2 ^+ v# I) H2 }
unsigned int b;
) [6 m& M$ f2 A2 ^; Z0 v6 ]7 P5 @9 W
unsigned int packet_cout;
& b" M, ?2 J- J/ F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* U3 e5 R: b1 @" M1 k* o/ {1 S
+ b0 q' T v' U2 l' g, _
void read_MSG_buffer(int *baseaddr);
5 v% l$ E1 i# l+ q( ]6 W
unsigned int count_copy = 0;
& l% u9 _: e/ Y) X! y: n4 Z# I
: C( ?4 H' R4 X8 a: |
int main()
8 T7 G* E W" z: d1 J4 H) D
{
8 s8 B' \" \4 }$ @& `
int fd;
) Z, W8 j. h5 K( d( |3 }
int *mem = NULL;
, {* ^5 d) C9 i; o
' {* ?' w Q6 |" ?" d3 J
if((fd = open("/dev/mem", O_RDWR)) <0)
8 T: v8 J, v! H# y% `
{
! i3 e( v L4 Q/ X- }) J! w
perror("open error");
! M& @* M9 A0 |+ N3 z K9 k
return -1;
/ {) z& O' k0 O- F" U
}
/ h( o! i) G' F
6 u* A Z) b& D1 q3 Z: V# ?# ?& x- ^' |
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 F( s2 U* [! O* Z& W
8 M/ n. l$ |- m/ z' s# z
while(1)
6 \& |# ^5 f: @4 ~
{
! r4 y6 Y+ A# m3 J% {
read_MSG_buffer(mem);
' y% P4 G& J$ i# m
}
! h7 I/ T3 c+ m5 m P4 e9 W- \
}
" `- K G2 ?! s. x* n: C3 G* [
- x+ j) e9 O" w8 f" R0 ?
void read_MSG_buffer(int *baseaddr)
, P5 @ s: f, z( J& b$ `% c8 ~
{
; e8 ?& i" g* A- m4 z1 E! F+ r
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 A# g7 w" w' M
6 A/ `' h% X7 F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 t/ U$ W( k2 f! B+ U$ w1 g. N# J
9 i0 l# I* y( h$ Z
if(pshreRAM->packet_cout != count_copy)
- i5 c* t) ~) @' I+ z. ?* E7 r
{
! T+ T8 A4 H3 ]* c$ B- C
printf("a is %d\n", pshreRAM->a);
4 d" G! f4 m3 t" T2 H! U& {
printf("b is %d\n", pshreRAM->b);
5 p r2 L3 l; M2 f1 q1 v4 v
printf("count is %d\n", pshreRAM->packet_cout);
4 t* n+ P% c3 f* k9 s: U8 n
count_copy = pshreRAM->packet_cout;
! R5 q: C0 {: B. |
}
9 u5 O: k/ i( w
else
$ u* C4 N/ A& ` \" a+ [
{
' ]6 z5 y8 i& w+ A( {' s
printf("No effective message!\n");
( @1 m0 G- d3 W
}
* ~$ \# V) l6 j% X5 v
}
* T6 `2 S: D- K3 ?$ `4 ?! c
* F( @: i/ k1 C+ V& t" L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 K$ h: R2 j9 j; _- }" W( I
f4 I' R, G5 Z9 `
2 I3 t3 R v/ F) ^
2 `/ {. I3 L4 O3 i1 i
, x& H: \: g( q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4