嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 q2 N8 x. q1 \3 h" [1 w
0 A& p9 a! @* v# r, \, q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 S. ]* M# z- ^+ p+ c3 \
#include <unistd.h>
3 F: f7 u. G1 a3 M4 k* F
#include <sys/mman.h>
3 S& N" z+ `- s/ i3 ?: n4 D
#include <sys/types.h>
2 E- z" `0 d% l7 r9 D$ h5 Z
#include <fcntl.h>
' s4 a$ d6 h5 J: M1 M& n. y4 b! v
7 s. [7 l+ [0 Z7 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
' @( d2 o: s. e# O1 z4 D
& L3 }% B) X3 m2 t. E+ G
typedef struct
6 L/ M5 ^5 e0 ?% S" H5 Y
{
& z3 {3 c% F! I1 |3 l
unsigned int a;
; |+ r" j& o4 i @" z. @
unsigned int b;
8 @2 {3 b/ r: s1 Z. ]3 Y/ ]
unsigned int packet_cout;
2 m2 y- q' U% @) t' [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 I0 Q3 H6 C m4 z
|9 E1 t( m$ d& d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 y+ s% E: E0 e" g- w- W, ~
unsigned int count_copy = 0;
1 A$ d8 t0 T( P$ V2 k* N
2 P( b4 P) W2 I3 a5 p* L
, b/ m' n9 ?* T/ k6 p1 H
int main()
2 F" }. Y2 j Z9 D
{
$ T: N! }+ ]7 K
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 R/ v4 r6 W7 d3 h4 Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 B" m$ E6 H. C: v
6 U. I0 f, V. c* {4 x
while(1)
! p9 E( [4 N/ T e; T! z
{
+ ^/ K# E+ O& Y2 n+ @
read_MSG_buffer(pshreRAM);
% u6 C5 L. A) e4 ^+ H' c, Q
}
' f/ u9 z' c$ U. D& `6 G1 G3 b+ K
}
5 M; c9 A0 t& ]. A, J# O
& I# _; Z; q8 G1 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 r! C0 M$ x1 a/ G, y
{
4 Z% k% ^) a2 v# O3 f
RX_MSG_PROTOCOL buf;
! X, @! [- D4 B* E1 M- w, i
3 {3 o% a6 _8 i. q3 s
buf.a = pshreRAM->a;
5 g' F& j+ @2 i9 |5 p- t
buf.b = pshreRAM->b;
' X; b. r7 V! t |3 [$ n
buf.packet_cout = pshreRAM->packet_cout;
$ t0 d* V- [- a7 S# t
8 j, f9 r7 `4 {3 D o( P4 P
if(buf.packet_cout != count_copy)
* K) F$ t8 @' S. d! d
{
- J2 ]# G" N4 C% q: _2 C( y' a
printf("a is %d\n", buf.a);
5 q6 R( ^9 Q* o2 v: m% B
printf("b is %d\n", buf.b);
( b. c: x4 q6 ~+ Y2 y3 X9 ~
printf("count is %d\n", buf.packet_cout);
+ o2 _4 a) ~$ u! _8 ~
count_copy = buf.packet_cout;
S, h3 q7 s$ e; ?
}
7 | C4 W5 T1 \( J5 F4 k6 {
else
1 }- k+ p0 h* d e8 a4 y3 E# n
{
; j+ V+ H, P6 F& B2 w# A& W# d
printf("No effective message!");
# E7 E X( u! x0 Y; K8 I. i7 W$ q
}
0 K! E5 T" y: n* k; G! C
}
* B' s7 t0 a0 P2 P4 x
3 y$ {" ]6 s" t" G1 h
% w1 s3 v0 L3 |4 L* F- f) \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( M# |; b7 F& B/ l+ K$ c
使用下面代码,对内存使用了mmap函数后:
9 d: x+ z. {; F7 c6 w* M' I* s
#include <stdio.h>
5 T$ L0 I; z# ?
#include <unistd.h>
0 \: }5 n. `8 X4 F# i% w& q- b
#include <sys/mman.h>
3 c0 }* G- R3 b! h
#include <sys/types.h>
2 Y2 J! j5 _8 `( |# T
#include <fcntl.h>
: k; _* d" U2 J+ }0 W8 o/ ^
0 U0 B! C& U5 D1 @2 ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ a6 Z4 k+ E# b
#define SHAER_RAM_SIZE (0x20000)
+ u0 V3 C3 T9 ~1 ?4 K
; I8 r( o4 V& y& g( y7 J
typedef struct
3 x' D6 m: {( C7 e# T4 G
{
: v5 ? t4 N+ j* P
unsigned int a;
: h% _( H+ }5 G# J4 W
unsigned int b;
3 [$ q; ?' B! L8 W" w o1 C
unsigned int packet_cout;
8 L8 t* u9 G, o7 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, m- j8 _: n, P; v6 b
0 b% _ q0 \# K# J2 H
void read_MSG_buffer(int *baseaddr);
5 @8 y( u+ N7 @8 o% E! s
unsigned int count_copy = 0;
4 S5 S- K5 } R1 u# o
0 T; A, R" d0 D& H: O8 s% ]
int main()
/ Z; b$ t* c5 V! ?; M
{
/ w* g& S- ]/ Q* `/ I* L' M
int fd;
' G# L4 _ M$ k3 Q
int *mem = NULL;
+ @+ j# S5 U$ Q( U- o" |
+ H) X: i ^6 K9 u2 x% H
if((fd = open("/dev/mem", O_RDWR)) <0)
- [% f& Z/ F+ `5 K- d* o
{
8 O! L( }: W. m0 b% ?2 m8 O) x w3 ?, i
perror("open error");
. p: |4 ^+ C( K; r2 l: f- J
return -1;
6 C) `* o6 ~' Q r, u
}
) \! A2 j$ f7 `1 a3 S' m
4 B' w, s' ~/ l5 L' C3 U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! `3 H9 _% F5 t/ R9 H/ X& A- A F$ G
- ^6 v8 ^6 N$ m3 l" J6 q
while(1)
0 y6 S8 f. _# G$ L
{
+ m- p2 h$ ~* @
read_MSG_buffer(mem);
5 B0 L* B R' c" A/ o2 E6 J
}
5 B& m, R0 {7 v* n" Z7 e
}
9 i0 r* T0 p! ~! A0 C x j% W1 ?
& i+ c: J) J, Q' f" o
void read_MSG_buffer(int *baseaddr)
6 @% z$ n o" s: l$ C! \
{
& l) E# U7 W0 `' a: S
pRX_MSG_PROTOCOL pshreRAM = NULL;
. a# D u5 j/ `/ F- X
7 F2 x4 p! @5 j4 s5 W$ w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ h9 D& ]& Z% x0 s9 a# p3 P3 }# q
4 X' \1 u) j& o
if(pshreRAM->packet_cout != count_copy)
# r) T( P* F, ]: L6 Q# v
{
% e. R2 C! Z8 D, w5 O
printf("a is %d\n", pshreRAM->a);
5 D2 s: ?, F$ z y* g' X( C5 `
printf("b is %d\n", pshreRAM->b);
/ R3 S5 ]) x' C
printf("count is %d\n", pshreRAM->packet_cout);
# I. T5 t+ a0 N& r
count_copy = pshreRAM->packet_cout;
7 h5 D& q4 l: C. ~" Y
}
" c, f: J( H! u9 b- K
else
* a# S# q! O) u
{
% n* }( S; G: B- ]. c0 |
printf("No effective message!\n");
( N; G0 d3 l& F( |, S
}
) _9 f* I' Y0 v9 r
}
. |$ j' s; w! Y. q/ ^+ Q6 I! M& A
7 {. ?( \5 B1 E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 O/ t+ y: q+ f
, A4 C2 n2 A5 [2 U* d
/ F0 @2 E6 y" R8 H1 p! `9 G
9 g9 {+ o0 R6 ^% \
7 u0 R0 r( K0 l8 \$ r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4