嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. o3 ?! F$ U# `: M, n9 G
6 C W' q! M9 z5 v5 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% K7 _- Z1 X6 P1 V1 G
#include <unistd.h>
( S0 m4 Q0 t! ^+ j
#include <sys/mman.h>
6 \4 ^& H6 b0 J4 H1 X3 _. z
#include <sys/types.h>
5 i/ P5 w/ d7 ^2 \5 L" a
#include <fcntl.h>
- j: G8 U/ B2 L% i
7 D3 v: K8 a% h' \2 i j% B
#define SHAER_RAM_BASE_ADDR (0x80000000)
% ~6 D7 P& h# _5 N- y2 j( q
$ j3 ?) f! Q: L) r: A4 B
typedef struct
1 _. p+ O3 G, ]. h6 z6 F
{
4 m9 v; z- W( {' A7 f
unsigned int a;
" j/ ]2 S A' |- q' k- c3 M0 i
unsigned int b;
- I0 Y% ^$ Z7 r _" ]. Z/ m# ^
unsigned int packet_cout;
3 d- S+ M7 f) X- [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 C0 _3 T8 D1 J) _8 Y
# z8 ]( B, [+ V0 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& ~ q/ n8 o! D; p& r
unsigned int count_copy = 0;
# O" H. b5 g6 J( e# @2 ?5 M" ~
' a+ v4 d4 V. o# N- i& _, Z: P
8 `5 F0 C" _$ i7 {' k& ^
int main()
4 c" Q- T) H' h, m& x& P
{
/ s) N$ A/ y( _7 N1 v* i
pRX_MSG_PROTOCOL pshreRAM = NULL;
- J+ \& o; E8 Y2 C" x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: ]- V& E8 M; N
" y! J1 k+ L6 H' J+ d4 |. t
while(1)
" _8 Q# v: y' f2 `. ]
{
0 l5 ]8 b0 @ N% f# \% R& i) i3 C
read_MSG_buffer(pshreRAM);
: h* H. w4 d7 @' z a
}
/ C/ Y# ?& V6 \' f% F" t
}
4 i& \4 z7 ?" w
. o- ^' r" f, Z4 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 g" x. L: f( t' m- G2 p
{
2 [ v4 T# Y/ a6 s3 l+ q6 n6 J# |- Y
RX_MSG_PROTOCOL buf;
- @2 i) F/ R4 S! ?
7 A/ D* W3 ~; s; c" y; R+ \
buf.a = pshreRAM->a;
5 G- h7 x: y% ~9 w3 L w2 A3 v. ]
buf.b = pshreRAM->b;
" X3 ]7 C, l. g! S/ D/ C
buf.packet_cout = pshreRAM->packet_cout;
. f3 x- E. m! L/ J; Q3 Q+ _3 j. _6 W
$ L8 [/ Y# o$ v+ M ]9 K5 H/ C
if(buf.packet_cout != count_copy)
' T$ @* T$ b) |: L) r9 u }
{
+ f }, {! W5 D2 C7 |, C( y4 J
printf("a is %d\n", buf.a);
4 k7 {( p: y* I1 ~
printf("b is %d\n", buf.b);
+ S' b( E, K! x* ~. I
printf("count is %d\n", buf.packet_cout);
2 l( f ^8 c+ Q5 Z3 G
count_copy = buf.packet_cout;
4 q7 e" @# B6 u% W# s
}
9 p/ A$ c( B# d- W
else
8 K% V8 @5 G2 b" `: |
{
: |5 L# m4 g. ?/ g# G6 `6 ]
printf("No effective message!");
( @! g: ?: W' o
}
* p' n; G" c7 _
}
( I8 X8 w( l) `6 T* ~* E" \, ]
2 z& ?3 y: _ G* @/ i
' N" U! Y( x: r4 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 r3 X8 T) D5 E2 q/ D" V) W
使用下面代码,对内存使用了mmap函数后:
7 K/ t1 U5 F3 x
#include <stdio.h>
7 f* ]9 U& j' ]) x
#include <unistd.h>
) x. W d$ n: r$ S" S) M3 p
#include <sys/mman.h>
- K, y: J! o2 `& N7 k
#include <sys/types.h>
. r+ R5 L5 G+ J( Z/ A2 D
#include <fcntl.h>
6 v( P" G& @) H% t- i
9 z# U$ F5 b7 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 ~6 N) t2 S6 u4 v- k
#define SHAER_RAM_SIZE (0x20000)
5 C. ~; a- \" |$ E1 `+ b
2 ~8 s$ i& W; I; J5 J) F& ]
typedef struct
4 H: q6 }0 o, Z/ ~( [9 ~: n
{
4 F! `/ f1 A# y) I- o
unsigned int a;
( J7 @- u- _7 w- o
unsigned int b;
: S& _% W, w8 A" [6 E. |
unsigned int packet_cout;
4 C0 y- | ?& p N/ s: Y8 c1 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. [' o5 s4 G- O& `: e
% J" v) r* T9 P& C
void read_MSG_buffer(int *baseaddr);
# F' F$ O) c6 G" N0 Z9 n1 _
unsigned int count_copy = 0;
. N( L1 _7 U" y* M$ ?; o, ]7 q8 k
+ J/ T9 ~/ ~; }- R/ [1 Q
int main()
- i# ]1 C6 F/ z
{
% a- H# V5 n; G9 Z
int fd;
# y3 C8 a7 F+ Z$ f) y' E. c
int *mem = NULL;
! l$ p" ^* G4 F" {/ ~, ]. h& g
, I0 _2 i/ h. B/ I9 E- v# L
if((fd = open("/dev/mem", O_RDWR)) <0)
- Q3 y( v- Z' U! t5 s# b1 N3 V
{
0 A, B# a) _; C7 U9 y
perror("open error");
$ C: d0 Q& c0 g* S6 Q3 K
return -1;
F# X& p; u" h3 L& Y
}
y, h1 B9 E: S' V- v
0 y2 M1 _/ ?7 E- ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( X) g# E2 A& F$ o
- a" z ?+ N/ L1 F5 y$ [2 Q
while(1)
) D1 D7 U& b. B1 c
{
7 v- H% j1 r4 m8 y/ g0 G
read_MSG_buffer(mem);
$ c6 n& T9 d- q% s0 q2 _' l; [
}
1 p* Q$ N8 R G( V" H
}
) N% Z( @' {( N; L, J& E0 d7 y
& d5 N2 D6 w! f
void read_MSG_buffer(int *baseaddr)
( i8 R y( d- A# K3 E1 q( @
{
& @4 @) J. |) {% G9 W; N
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ G& f$ ?. R+ P5 Y% h
1 s7 s/ b) F: l# X. x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ h$ | \. g/ `" Y% b# Y+ X
; f! S+ k# P/ Z9 s' l
if(pshreRAM->packet_cout != count_copy)
@% i5 N8 {( a6 @
{
( r Q1 {" [* L! T5 F; D8 ]
printf("a is %d\n", pshreRAM->a);
& O1 w3 d& e! |1 T; s6 ~6 t/ ~3 k0 |/ `
printf("b is %d\n", pshreRAM->b);
2 U2 j" u( t6 @/ Z! X
printf("count is %d\n", pshreRAM->packet_cout);
& u3 P! P. `) F* t* M& ]1 i( d
count_copy = pshreRAM->packet_cout;
8 d( L6 T, N+ T/ j9 U" l
}
, w. _+ e9 c6 S3 i: g) p
else
1 t* |, ~" B$ v3 ?
{
1 }: z! S) A. {# P% ^8 I# U
printf("No effective message!\n");
/ f$ h* y+ p. L% E- U5 K4 E
}
4 {3 b* r8 E/ E! v
}
: c, {; `" z3 v; L7 e9 c) P- k
; q& v" z$ j- B' V* [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. r- ?2 l( g3 P% |5 f
# |" m3 @0 R/ S! R
# u+ A I7 V/ J% u; z& P. r
$ C3 u5 v$ S V. q, I
* z" W. l% h3 o7 z: k5 b( L$ h% b
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4