嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* J0 i) o x1 O, t) [
: H+ {1 n) R: h. c2 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# k# }7 v: l/ n! j
#include <unistd.h>
4 U, ~+ k+ d H1 S( L4 |. d
#include <sys/mman.h>
7 r; ]/ `( p$ r l) G
#include <sys/types.h>
F* w$ |# Z E0 z
#include <fcntl.h>
' M& U0 B2 Q3 F' B1 i/ {
( _$ S+ N+ N# r/ t* d2 D; w
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 d! E, X; }9 l' l. [, [% ]* h
* d1 f/ I6 ? T( |, I4 `% y6 a
typedef struct
$ {5 C5 A; m1 t; C# J
{
2 \; {! K9 `* D0 o7 I' ?
unsigned int a;
$ P5 N9 V! T( S3 N9 u
unsigned int b;
" x8 r9 L5 k$ q) y: t3 P( m
unsigned int packet_cout;
6 ]! o, c9 |; f2 Z. }! k' u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* |' _2 _8 s9 j+ D7 Y+ W) }
& I/ o% F4 g2 H3 _5 E$ C( B/ u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' U, A7 Y4 P2 l0 ^
unsigned int count_copy = 0;
$ u9 i A& K; G$ J" I. C
/ G3 Q3 P1 D% {' J, h2 n
+ v( R8 K7 l( H! y; i8 B; w
int main()
# |4 ^! E ^8 B6 N" O2 f" _
{
( b5 ?: }5 X+ K8 o8 x O; _# L! Z3 r
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ @+ w, C0 I6 n: W2 z8 P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# _: Q% F. f$ F2 o9 b9 }7 W
3 ^& a5 @8 V3 C( E2 h
while(1)
1 X3 K. V6 m. {$ X. Z
{
2 K' B: w8 I' \. G# E' M
read_MSG_buffer(pshreRAM);
8 C' I0 L' z# m/ G
}
# [" n' m! F& S( ?
}
v* z0 q7 Z7 ?
3 [3 i3 V4 s5 q5 R. u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- |5 L/ z4 ~3 ]: ]. p
{
( j3 E4 G Z! w, q5 v* i! A6 t
RX_MSG_PROTOCOL buf;
# @: `, P* W4 h, _% }: G
2 v5 A; v5 d9 j2 ]
buf.a = pshreRAM->a;
' m: x7 n7 G$ P/ G' t* v
buf.b = pshreRAM->b;
! O N0 a' N6 K, X9 G; n
buf.packet_cout = pshreRAM->packet_cout;
4 m3 C0 e4 H, |# {+ f9 j6 U
% U) g+ b0 g& n
if(buf.packet_cout != count_copy)
: i) n8 J. U! K) H
{
8 Y: s" y) v/ w$ Y& A" p" p5 a
printf("a is %d\n", buf.a);
2 T% s. n- K& j, H! V
printf("b is %d\n", buf.b);
5 _5 y( Z5 A7 s- d1 D
printf("count is %d\n", buf.packet_cout);
' ]8 G2 s. ?0 i# ]+ y
count_copy = buf.packet_cout;
: F3 U( u+ U" E5 }7 r( u( `. U- _
}
- d( O- A. n2 P& B1 S
else
! @* ?5 c8 p$ N' M
{
! {) J# @! x' n% ^1 {/ J0 j4 d
printf("No effective message!");
; I- c0 q2 k3 v- A6 w
}
) A7 \" [% |% J; a4 j* T
}
0 E/ B$ p) X* {9 d9 F) W
5 i. P% Q( r3 G2 w
: n' I/ l6 \& `# \9 a$ o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 ]. a1 ~) r/ h
使用下面代码,对内存使用了mmap函数后:
+ f7 O$ {+ ?- M2 j6 z9 Z
#include <stdio.h>
2 Y, ]3 E# m( H2 Q% U$ |
#include <unistd.h>
% v; Q% q+ X4 E _. {
#include <sys/mman.h>
4 z8 Z$ q( [2 }' `8 x+ Q5 r
#include <sys/types.h>
$ a' u) W) }$ D) A7 `2 r0 {0 C5 R
#include <fcntl.h>
+ I: C# A; b1 T3 N
) c* h& ?. [0 l& U
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 s$ y) D5 [* u1 Y* w% k T
#define SHAER_RAM_SIZE (0x20000)
3 v" |+ N, u, s. l& C, ?: E* f
: i0 d: i: X" V
typedef struct
; l4 x1 W- f5 k! B/ t; Y
{
: e( H9 C4 a3 y4 U" G
unsigned int a;
. @% Q' X% d: {! |
unsigned int b;
; \4 y5 E Y6 H5 n; G- Z( Z1 w8 R
unsigned int packet_cout;
4 ~2 G! ~" J; `8 S' h8 b+ A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 q; t9 V* L6 Y% i$ S4 C! i% v0 j
0 v$ D) I+ C* l3 V
void read_MSG_buffer(int *baseaddr);
( `6 b7 x( h0 N; J3 m$ ~
unsigned int count_copy = 0;
8 ^: q! J( j' I: j/ b [& W
+ _6 K% s! Z. y/ }8 V2 \0 s: G3 F* |
int main()
0 a4 F" g4 P: J# O1 a$ Z0 @: ]
{
% ^- O7 h! j: P; _1 g! O
int fd;
+ n# Y$ _1 q; ^$ K5 {. f
int *mem = NULL;
; G" C! n& |/ M+ f( ?
) T; s/ q6 ^2 B) c9 h
if((fd = open("/dev/mem", O_RDWR)) <0)
`6 T* m! n( `4 Z( p# R& E
{
8 I7 T8 @% j7 ~9 u7 ^* q( p7 {
perror("open error");
8 z1 p) d4 W, @4 p h
return -1;
) o8 _' v/ _* ]/ A/ I
}
3 T. x! S9 ]2 f9 l& R
" ]1 F& ]% t! @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 H) b2 p1 U% r9 z
& u! [! M: u( p) U4 {0 ^
while(1)
3 Z3 h" X h$ y$ R( Y
{
# D* A1 ]$ i9 u$ q5 Q# r
read_MSG_buffer(mem);
9 E0 u; _* f+ n& f ?" R
}
8 O S; W5 ^" G8 A1 B& x
}
, Y+ k! C" r1 E2 K3 l
5 H6 O( r$ @1 }4 i
void read_MSG_buffer(int *baseaddr)
4 C7 q5 z" j9 C" Y" M
{
; x# \4 P p/ W4 j, m
pRX_MSG_PROTOCOL pshreRAM = NULL;
- D1 \6 z3 V. C/ |; w/ [' L% b- f% w
; J8 `! i, z1 @% V. j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: X8 Q% S2 T" d" t* ^# \7 G& h
% e2 s6 d7 x& ^; c6 W1 ~; s( z8 K5 W
if(pshreRAM->packet_cout != count_copy)
B `' R; r' v2 T3 q8 `/ P
{
# H8 h& u1 R1 z9 D- K% ~7 l
printf("a is %d\n", pshreRAM->a);
* v5 s" b3 ^! v3 f8 J. I
printf("b is %d\n", pshreRAM->b);
0 a2 {. t' U u+ q; f. V1 g t
printf("count is %d\n", pshreRAM->packet_cout);
7 W6 Q8 v- g# T3 U
count_copy = pshreRAM->packet_cout;
. f, {" R9 o; o7 c" \7 j: J
}
1 M/ C4 h. T. C5 R3 ~; P
else
9 p2 L( C" Y/ o9 ?2 c9 z
{
9 c I% y6 ?% x: f- T6 Y
printf("No effective message!\n");
/ p" I" e6 r2 P8 |
}
% _: L: U$ Q1 [
}
; o# g. H. S t n
0 ]4 m6 c/ g z) M' _+ Y) D' ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% p% F- P4 o/ }
: s: c# h( M- i0 \- z
6 [2 e+ i8 ~2 Q S8 |
- \8 H$ L/ j1 }6 Z3 B
6 W5 H) Q# N8 n) q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4