嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 Z' x6 z5 i' [+ U8 j
% ^2 `1 W( c# j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 y- g' s$ o! ]) L: E" }
#include <unistd.h>
! s/ z9 \* Y3 v# h. o" Z
#include <sys/mman.h>
/ {$ w/ v6 c5 `2 _' `' X2 S
#include <sys/types.h>
# ?# \( F2 u1 t
#include <fcntl.h>
# O/ y3 H& h0 _9 ? C: D9 i
5 e. A2 G" \. b5 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ L7 U+ N% T1 x7 q2 ]1 w. w; l
/ C2 |8 s1 h, y1 _3 Z
typedef struct
5 {- c# |( Q: R* _: ^% ~; ?
{
4 h, e. K+ A# _) l$ G
unsigned int a;
0 g9 t. V1 K/ {/ @6 _; \3 v
unsigned int b;
# t! F( k0 @' d0 |# m
unsigned int packet_cout;
2 P. i3 j5 B$ x v" I; ^, V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 {$ ?, b0 A& x1 t; y: K8 Q% L
\" m L$ h6 j) e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# c% G) I3 `5 |) m% K, j
unsigned int count_copy = 0;
' d; ?" x- i# [/ E \2 v9 L
, {% z# Q8 ]2 h: V
$ @5 G8 {3 ~/ a) N
int main()
4 s& R$ g; ?* g7 m6 L" [
{
9 N0 x( u% \- U {, H1 _: F' X7 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
! p* i6 N6 p; N6 y6 u2 z# J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 E; O# |- \# {$ @4 t7 E* _
4 B* n& @% }) x5 h
while(1)
4 S8 m) k& d' Y1 U0 m5 f& q5 @# d X
{
# X0 u! A8 z& d" J, r: M: c
read_MSG_buffer(pshreRAM);
8 x/ [1 l, V% G" k
}
5 o% t( q: M& ?
}
- u: Y o; `3 V. [
, u# ^# C- u' L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 o f0 H( F6 [' e! c+ J. h
{
) L. ^$ m$ R! d: k/ c; }; k! G- [
RX_MSG_PROTOCOL buf;
" V0 d$ K( I7 \/ ~) u' ~# R
3 O( O. H2 K. ]$ ~$ o
buf.a = pshreRAM->a;
0 V& i( f* c% E( q5 q" P* f' V
buf.b = pshreRAM->b;
, k3 y, ^" Y( i% ?8 n3 b- n& C9 I
buf.packet_cout = pshreRAM->packet_cout;
; u. @( w' u$ f2 l$ L" Y
3 d2 L- `; S: \+ f0 ]& Z, }, z
if(buf.packet_cout != count_copy)
, b. j# K3 ^7 W
{
, S: {( q$ A- T% ?, `7 ]/ ]$ p( R
printf("a is %d\n", buf.a);
% q6 y) K: D3 q4 E" `# e2 C+ Q
printf("b is %d\n", buf.b);
5 V! |% u; v8 s; d% g
printf("count is %d\n", buf.packet_cout);
) M8 s' c, ~$ O j3 T, D q
count_copy = buf.packet_cout;
$ M$ @( P2 a3 k8 ?, m9 j6 K
}
0 T/ a' p2 T* e# {: R
else
8 J0 D' Z( J, ~/ ~* F$ U: F( u' d
{
' {) e# W$ U% @5 t
printf("No effective message!");
# E+ B& v9 N4 B
}
( t l6 w# w- D6 U
}
& h. }& X, D3 L- M
% x- l/ J( K/ I7 e0 j3 B
+ S5 v4 N: Z; }8 s/ y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" D; n1 l; T# j
使用下面代码,对内存使用了mmap函数后:
; ]; e. M( C3 y9 x% W
#include <stdio.h>
# U6 U: ?7 ~: U+ ]1 q5 ?9 h
#include <unistd.h>
1 j% q" ]2 P* d8 k. ~! x- g6 B/ U
#include <sys/mman.h>
/ q: O$ W9 u) w/ b# c3 I$ W
#include <sys/types.h>
* W* o8 @( }: j$ r
#include <fcntl.h>
* h; n3 \6 ~2 t) M' C# L4 I
o8 H( q8 U' @7 f# K8 T- e
#define SHAER_RAM_BASE_ADDR (0x80000000)
& @9 x4 k& B# u
#define SHAER_RAM_SIZE (0x20000)
?/ x% g, R& p7 Q- \$ Z
. s( o3 t; Q" O7 c \; z5 S
typedef struct
$ w# Z# ~7 ~5 d) @' t
{
! v$ k8 B: q7 f: W% k4 @
unsigned int a;
9 G0 L* X( _0 C! G! q
unsigned int b;
: A! }9 M4 ^& G H9 M6 q
unsigned int packet_cout;
/ W1 J: p* |( Z) Y; t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ e( D( t& r! s' R' H) S2 @
# V/ y4 D: i+ O4 c- r6 c) \
void read_MSG_buffer(int *baseaddr);
+ `. L' B9 }4 l& a
unsigned int count_copy = 0;
* @& @' K, s# Q# e8 u
3 O' ?7 p+ r" E9 @3 G
int main()
! \4 k/ [* m/ O% o, C; h) I; S
{
4 M @( m" Z- [9 } j
int fd;
' d9 n1 G1 }" m7 y* w4 H
int *mem = NULL;
5 a/ w2 j! s$ l9 Q
: y& M' p4 z6 R7 W
if((fd = open("/dev/mem", O_RDWR)) <0)
/ e+ M, R/ w9 b1 n+ W2 |$ H& f: S
{
( `, s" J3 C5 h+ k9 w8 I
perror("open error");
3 V7 @9 X" ~ i6 \; K z3 U
return -1;
& W) H- x8 N! V' c1 E* c+ Z* Z7 v
}
& S4 V1 S: q2 u) P5 q
% e$ s6 P3 |* t' R
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ P8 H/ n5 v: \, L; k
" G& {: O: p i$ O. d( J
while(1)
* \' _7 p- P9 R/ o$ J
{
I5 v" x4 T. l0 I: O; j# M9 n
read_MSG_buffer(mem);
; V' _8 |% m, H; c5 K5 B- ]) {8 U8 p
}
# m% z4 { ^% J" W X) ~
}
& y5 g. R9 Q( u2 q7 g
- s1 K; m; Z' |+ w! f8 k+ o7 c8 @
void read_MSG_buffer(int *baseaddr)
% v# o7 n0 F: h$ h8 h
{
7 M+ q( q; e3 w3 Z6 l9 f
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 y0 J( D* n" @( m
/ Q# P; q1 o5 Z) p& C+ F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 u' T2 t2 |* |. p! z9 |
" j# C: K! ]9 M' w( D0 W
if(pshreRAM->packet_cout != count_copy)
8 L' t) }9 N' ^$ [. a
{
* d y' \. ^$ D9 B E
printf("a is %d\n", pshreRAM->a);
' @% z6 I0 ]. ~$ R7 C& v7 B
printf("b is %d\n", pshreRAM->b);
4 f2 `$ x% ?( l& i- v
printf("count is %d\n", pshreRAM->packet_cout);
, O9 A% g1 p t
count_copy = pshreRAM->packet_cout;
, b0 _4 q# l% c5 }- j5 d
}
9 W- n( v$ m$ o5 u) g t" @
else
% d2 t6 U e# [3 D( f- M# E
{
# _3 `- |; U$ g# g% C P
printf("No effective message!\n");
& l+ A, }7 n# |1 e
}
) Z7 o7 O; S( @) `
}
* j( X7 {- N) Y
# c: l+ ^0 I8 G$ T9 J9 Y- s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 q! }1 ]: ~& H) r
- y. K0 {# I: m% N8 k; x- g1 I$ e
7 ~0 O F! g$ k
7 ?! K E/ s- v) M2 P: \0 K5 E
7 m8 U& @/ @# k$ o
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4