嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 c6 T) u! G s
v, U9 B% o5 n0 G7 i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! j& i3 [+ }7 e2 y
#include <unistd.h>
: K, K3 u+ u0 f: T: o' t: k. t" n
#include <sys/mman.h>
4 Z/ L8 S# }: l4 a% z3 J
#include <sys/types.h>
( ]/ x x! q e; h* _* g1 D* e) c
#include <fcntl.h>
( ]9 E l2 E% d# l: p( k: t
$ f0 `; g+ Z5 K1 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
; `( ^ H1 V2 ~) o7 O
: \# a: H1 M1 n+ s
typedef struct
8 k% A8 \( Z: n, u7 g
{
/ N2 i6 K3 \6 m( s8 G) V
unsigned int a;
& y1 ~. e7 ^- n# O9 g
unsigned int b;
$ }' B. L- M- v; S
unsigned int packet_cout;
9 i/ y0 A* M& ^1 j0 D% R! B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 V+ ~' N% k8 V0 d% N
4 F$ x$ D6 Y! y% i+ ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# k0 j% @2 Y. O
unsigned int count_copy = 0;
, z- k+ }0 z+ S- N/ {! H0 Y/ G
4 a1 Z' k X K5 z& G. G
9 ?! L; s# a- Y$ ?& i
int main()
- r: V2 P* w7 Y4 a
{
0 L( N$ F' J3 a1 Q! A6 o+ _7 D
pRX_MSG_PROTOCOL pshreRAM = NULL;
# d3 E0 v9 J/ W: b: K, B! ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ Z7 R/ d' w, z8 v- X/ l8 A+ Y' _& X
% ~, _8 K- \2 i
while(1)
+ I& V* o% ~8 ]
{
6 }* ]- [! _4 G4 N0 o- Z+ Z, d Y
read_MSG_buffer(pshreRAM);
8 M" B4 u0 m$ a6 N& B5 [, O' e/ t) X# Z
}
{: n* b) w8 D( k
}
* k. r6 c7 {" ~* @+ V% Y
9 d w% \) O8 r2 {2 _6 ^( ^ m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 P) r- B! G0 Z: e
{
1 f7 z" C$ m& a8 o# P4 L( T
RX_MSG_PROTOCOL buf;
7 b% k( ?& x* o
! g* N' b/ u8 ~6 U+ q/ v( _& L; \) l
buf.a = pshreRAM->a;
9 j7 _/ t; ^% H9 `
buf.b = pshreRAM->b;
; c C7 h' K" G- I
buf.packet_cout = pshreRAM->packet_cout;
/ J. E0 X r/ w0 _
3 ~) ]: Y% L- G0 x# c% v
if(buf.packet_cout != count_copy)
+ G! I+ b( }4 }
{
* [, y* b% T6 s0 c
printf("a is %d\n", buf.a);
; E7 r m( N7 |( ?
printf("b is %d\n", buf.b);
4 }7 p6 @' X$ J) v
printf("count is %d\n", buf.packet_cout);
. a9 j8 d |# _- q F
count_copy = buf.packet_cout;
0 |+ [. T4 s& |, [% G# y
}
9 ?& y2 j7 k+ W, P
else
" i" m" K& G8 \9 w
{
4 N- _( X- F- P! W
printf("No effective message!");
3 T1 _' G: O! G, }& H
}
+ p; `1 F5 `- c3 h& b" R
}
s5 O% {0 m6 S) ~5 f3 S
2 x3 ^0 B5 S a
) H6 H% v. A- ~- d$ L& p n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 @- B* z* i+ V9 G( W5 K/ E, w; ]
使用下面代码,对内存使用了mmap函数后:
9 Q( N: I# s9 d U9 B8 b: Y
#include <stdio.h>
8 t* [; n* a$ d1 Q* [$ C
#include <unistd.h>
% D1 N1 v* v5 T% h0 O
#include <sys/mman.h>
3 U3 X6 r/ ` m1 K& D4 d9 H) p
#include <sys/types.h>
$ O% Q& t P- M9 ^ }0 i
#include <fcntl.h>
: T: J5 q* P9 Y9 y6 ~5 E1 W# Y
+ |4 P- A. x+ S% ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
d! ~/ @2 @/ J9 o" `) g- R! U$ c; p
#define SHAER_RAM_SIZE (0x20000)
' g& \5 `2 _. H6 o" H
D6 I3 a5 N. W3 B, Y' t- y9 z9 z7 p. C
typedef struct
" ~3 `. m+ H7 g
{
2 O7 o. F( L$ Q; P8 @
unsigned int a;
: U( c$ L. [/ `+ S2 L5 ^; L
unsigned int b;
! o, ~8 }* S# e: A0 @% ~
unsigned int packet_cout;
( k y! C) `2 @5 t3 E1 s" _6 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. ]0 U9 w) |, Y# }! v# `
) W1 P7 [0 J7 c& A5 [: y: a% d2 B. R
void read_MSG_buffer(int *baseaddr);
8 n4 J; F0 t& n+ D
unsigned int count_copy = 0;
: c0 n! \" Y. P/ O3 s8 }
) k% G0 ~$ L+ Q' M+ E- S
int main()
9 l- P) v5 V1 B+ G/ w
{
- g$ A$ [" U3 x0 N0 t4 U. [
int fd;
' h6 }' M' y# f9 ^1 |) q' x
int *mem = NULL;
% R" k3 ]: a; X) K. ~) s1 F
* R6 x* Y/ z# l' k8 [! c0 B
if((fd = open("/dev/mem", O_RDWR)) <0)
0 {9 O8 c( Y$ s+ w
{
b/ X( n5 h# m% R* K
perror("open error");
9 Z$ b; i1 H, |4 p8 m) V5 T
return -1;
6 s5 H9 y1 {" N2 y/ {5 \2 Z
}
+ s: w7 J1 y) I, `
/ u5 n+ Z, N; h, [0 Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 a/ }& J) x% v7 H7 ~
. G5 F% J+ F$ M3 Q7 F
while(1)
8 @* x6 c1 r) e1 [" |- L- ~) H' j) z
{
1 b! U5 w$ a6 m) H! q D7 J6 C
read_MSG_buffer(mem);
8 [6 h8 g, _4 T' E
}
; j- t1 M; h$ t/ ~* t- y
}
) ]+ r5 ]! {) g7 U0 B( t' |
1 G0 m; T4 C3 e) k
void read_MSG_buffer(int *baseaddr)
3 P/ o8 `7 u# L/ o4 G5 Z% r
{
0 k7 Y: m) C9 t2 h5 b4 p
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 x8 ~+ J) C) {. G5 X& n( P8 u
' r# n% x d7 \0 p0 S/ h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 a, A |9 F0 u1 J$ \- z
! t! L$ W6 Q5 s
if(pshreRAM->packet_cout != count_copy)
+ c: o. _! q! s5 a! Y' T
{
; ?' W% b3 v( x* [ _; I9 K# \
printf("a is %d\n", pshreRAM->a);
% Z- Y! q# s( B5 b0 f9 }8 Y9 X
printf("b is %d\n", pshreRAM->b);
5 \! B' r: q \; |
printf("count is %d\n", pshreRAM->packet_cout);
4 C2 i) r% `8 ^& I/ C& d7 H
count_copy = pshreRAM->packet_cout;
3 p2 a5 F0 R# } R; P
}
# p" Q0 u$ b+ j6 Y% x
else
% L. K3 i7 V$ ?7 e: p# H- d/ Q
{
! \; C4 l2 d2 B" I3 f
printf("No effective message!\n");
. L, I+ t( h+ M: d
}
2 T' F; T) }( S9 |$ P# R
}
) G. g$ ^( y: p
9 G6 u9 x h X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 f' m% H8 \9 Z! k1 z" {. T
4 A, [7 q+ h9 q8 _
1 O. ~/ a5 n* N" X; j
8 m. Y: U) q+ d+ Y! C1 _# P
: |4 r' S3 ~1 `0 J5 o# ?3 x# J" d
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4