嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. M% S: A( Y/ d" t# `6 v( {2 Y6 U* K
4 g1 o7 O; n7 n* Q c/ j# g0 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 A6 A. l0 H, }7 i: m# c8 J
#include <unistd.h>
4 @* V! E* a. I* c/ K5 f- F+ _* t
#include <sys/mman.h>
$ Y& r0 [( o( {2 p/ s( J& k* H3 L
#include <sys/types.h>
) w& q* T* l/ t
#include <fcntl.h>
5 @5 ~8 D- E/ {' F. k/ ~) e% k% x
: N- i! W7 I* v& `. P
#define SHAER_RAM_BASE_ADDR (0x80000000)
T& `9 n: D3 O# W! y7 n% T; b
+ E4 d" Y; W6 L7 |
typedef struct
0 X/ @! H( o6 p2 g2 d! g
{
( k6 D, t& C j2 V9 r6 l# a
unsigned int a;
7 j3 f, N& w* B/ Y- Q
unsigned int b;
' ^- o" r8 c6 T+ \: D0 T" m$ ]
unsigned int packet_cout;
/ |% V! q0 v0 L5 O+ J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
}) H: _$ J- U+ \% ]
: B3 P7 `4 L$ _ q6 j: s/ o. L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" [6 Z ?) f" p$ q% q( E6 I& K- a' _
unsigned int count_copy = 0;
2 j+ G. o9 ^& G$ |
; Z5 q! F& D/ F( p G% y
" E& l1 Z5 P4 _! G5 O) |1 H
int main()
M- z3 o4 Y( t# ^8 S
{
l7 a% y/ F. M* {. r+ \+ I5 m' J
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 B$ |* n! B' b) d( g' c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
Q$ U' I+ T2 u! d
* q1 \5 h8 L4 ?3 f3 C9 }" d
while(1)
& M; f7 X; u' n
{
/ u( P! z: d* [% c" {6 b
read_MSG_buffer(pshreRAM);
5 k4 I1 F" _: Y0 m- D) R
}
: R4 R3 ]4 {- [$ \ O) [
}
6 W: u6 E6 ]0 L; L& _. S
& D. h8 `; m% m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 d; v! ^. w, N9 s; F: u
{
6 F# A4 L% H# ?: A
RX_MSG_PROTOCOL buf;
4 P8 t8 @/ N6 c- m2 {* a
2 A* B6 M4 V" Q' p2 b7 H
buf.a = pshreRAM->a;
/ k, p$ [! h$ r s3 h
buf.b = pshreRAM->b;
) R# Y/ R* `- l; p3 j" o
buf.packet_cout = pshreRAM->packet_cout;
" B3 A1 S$ G; @* u; J
]( j. S3 d5 P" L! q1 ^% S
if(buf.packet_cout != count_copy)
6 N0 E6 a; Q' r/ _0 h% E0 l6 W0 t
{
9 Q3 ~$ y+ [& Z9 O+ H4 Z& w# t+ z3 g
printf("a is %d\n", buf.a);
" T4 x+ X9 O" f- u
printf("b is %d\n", buf.b);
1 S, `, |9 h3 j) L( S$ {2 E+ t
printf("count is %d\n", buf.packet_cout);
2 K1 |) q& o$ D; S! e3 k2 `# T1 ~: z
count_copy = buf.packet_cout;
; D& r- R1 k2 F% u
}
5 W0 J6 B7 ^4 n1 X7 E5 U
else
8 A1 q/ q' X: f0 t7 h8 p, p
{
$ N8 [9 q' ]* C6 V" M" D7 j
printf("No effective message!");
3 E7 _ c3 j7 E5 g; q; a" n
}
7 G& e8 J* J/ Y# h0 ` L; E/ P9 e
}
5 R6 I1 O: h3 e
+ f3 C p! y( i: g1 x/ u, y% y
: C! x) s. R2 N# ^3 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* F, Q/ U; R1 e
使用下面代码,对内存使用了mmap函数后:
$ e0 @, |4 h5 k2 z
#include <stdio.h>
+ Z8 s! i, q, L
#include <unistd.h>
5 I k X/ H! D2 H! R, C- ^
#include <sys/mman.h>
) O* @& G3 I5 S6 {/ L) t$ P
#include <sys/types.h>
5 Y2 K- r0 l, z& G+ @1 D
#include <fcntl.h>
5 K$ O4 N; q! l' g) u
v! c: M1 M- c, Q' u( r
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ m! [! @4 C) M$ m( ]; u1 M
#define SHAER_RAM_SIZE (0x20000)
$ h9 L; K; r7 A1 e" m5 M
* l, x- o+ j- |) m L5 t! }
typedef struct
0 Y% X- f; A9 [3 }- S$ j- T
{
' `% S K. M; W! w$ w$ D
unsigned int a;
2 v/ s! r3 [, v' |& j! A
unsigned int b;
, p" i) G0 ]: t- b( P
unsigned int packet_cout;
, _6 v- k( I( V' ^% X: {" I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 M; V; e% R" |
# d5 b* n8 b4 U8 N: O
void read_MSG_buffer(int *baseaddr);
( x6 x# M7 O H: L$ q1 A! E- o
unsigned int count_copy = 0;
* f: | E2 Z7 H$ D5 G2 N5 u2 R
) Z9 I) Z5 A4 I4 v
int main()
* i: I0 K3 l& s) Q
{
! V* r( _! M, e5 G; \. E
int fd;
- U& o4 C$ h2 X/ x# K
int *mem = NULL;
& s, ~- ~! g# ?" }: \
I) |4 y% M( P& K! p5 A
if((fd = open("/dev/mem", O_RDWR)) <0)
, C" Q8 N) l- Q! B! h5 a
{
' m4 T+ W. J. |, F
perror("open error");
. L1 a; S. K* \/ Y V
return -1;
- P: J, q+ B+ z
}
0 l0 C. K' Y; T
+ b6 _7 z( I6 h! {" o& ]* t$ o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 x( h- ^9 G2 f0 a, V9 N& K/ ~
& c, C( l9 F5 u+ F
while(1)
1 I& t5 a+ |) s9 {7 H
{
8 |4 [6 x/ l! k1 R ~3 |
read_MSG_buffer(mem);
, O( o- y3 ]7 @9 ^
}
" q. K" f* S4 l% b7 }
}
. Q8 i- S! E% r+ i
3 @1 r; r1 `" l" b! Z
void read_MSG_buffer(int *baseaddr)
2 f" n& \( e6 q8 o6 |! @: [# d
{
; |; `& j, i- S" @9 s
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ~" b0 y1 |; }3 s8 c
, S/ g8 a! {3 y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: }$ u2 `7 V9 J7 D) J
" W* L1 ?( s# k! m# {; C
if(pshreRAM->packet_cout != count_copy)
1 l! m W1 R5 e* q
{
* b# a' e3 X( Y: q
printf("a is %d\n", pshreRAM->a);
L1 ?$ H V7 Z- T
printf("b is %d\n", pshreRAM->b);
2 D5 O% A k# }
printf("count is %d\n", pshreRAM->packet_cout);
0 E' q1 }* ~' h) c
count_copy = pshreRAM->packet_cout;
! B1 y5 I% {$ [" ~
}
: i9 M. x& j2 G6 Y( T: C
else
; Z6 N" |) |! ]1 R8 G r+ h
{
2 }( i: Y/ j2 p
printf("No effective message!\n");
2 @: ~1 Y6 z: W/ K
}
$ [# E' K$ o7 r# K0 u
}
8 z S4 G0 H$ o+ f/ N
0 M S, {- x* {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- Y- q8 d. q! k y
4 L. _( o- n3 }
2 c% N- o. K, l9 q6 O/ _( k6 X9 Q. p& p
J7 P$ F3 m3 |7 s
- X# k% C/ t: Z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4