嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' b. _8 U* I2 ^3 G; |
1 ?4 d0 B$ Z* ^9 ~9 I' q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' t% J( i9 [ n. R
#include <unistd.h>
( l# |' Q* a# @: s2 l
#include <sys/mman.h>
/ W$ I3 a, e, e+ [0 [4 W1 g* N
#include <sys/types.h>
; D6 Q% D4 F) M
#include <fcntl.h>
" n. a; O1 r+ F
5 \$ P3 T! v/ U z( N1 O' V
#define SHAER_RAM_BASE_ADDR (0x80000000)
! f" a/ |. t. j9 m
7 q7 g) b R$ r; g# R) x. u. H" c3 ~) T
typedef struct
5 K* R5 X& y3 D* v$ i
{
! L( r" j3 X5 ?( m
unsigned int a;
7 {0 `6 P7 O2 [* e/ G' a( ?& }6 j. s
unsigned int b;
: e' U- _4 l q& `/ D" }; S+ _$ z
unsigned int packet_cout;
6 F1 d6 b2 O7 L. Q* G- Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* Q2 S Q0 {9 s7 |
# ]" O. q6 K/ D# n4 W7 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" D$ ]1 J) w: m$ g1 j7 d
unsigned int count_copy = 0;
$ d- R+ K( W5 o0 [( Q
& Y x8 R7 r$ s6 o6 s8 E; B
, @6 Z2 q% }7 D. l3 Z( g' G# d5 O
int main()
6 ]; n# X1 u( a- s
{
* w. p+ N: @$ r/ R- M0 M4 e
pRX_MSG_PROTOCOL pshreRAM = NULL;
" `; h: _! i/ k
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 G- r% D9 c0 p; ?+ C! J
4 A2 I/ j) j5 C8 F
while(1)
, e0 {* E! b3 F' E+ V( W% y# ]+ D
{
, ~2 Z8 k" q0 t/ | I
read_MSG_buffer(pshreRAM);
, m j4 {7 D! D7 e) C
}
6 M7 B' k: {. a% @/ A
}
7 v3 V, r" c/ P, n; {
& O$ Z; t. m' _! E T4 q; y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 r0 J1 }* w; N3 J* ^# V7 B# G
{
. w, ^2 g5 I$ f' ~
RX_MSG_PROTOCOL buf;
: }1 a1 I, i8 H% k
6 I' P U4 C- d( g; x/ P
buf.a = pshreRAM->a;
. \ t, C: ?; O$ Q% w9 z2 A" v8 H4 ^
buf.b = pshreRAM->b;
3 M+ E. j4 I) Y0 {" S; p" v
buf.packet_cout = pshreRAM->packet_cout;
/ ?- `6 q, U& y3 g3 f) B! g( M; S
. m' M: P5 r8 c0 D
if(buf.packet_cout != count_copy)
3 x. s+ e' h! _
{
% t( @0 `7 F6 G# j1 [3 |' T
printf("a is %d\n", buf.a);
8 P$ S, ^" S& B9 @( a& E
printf("b is %d\n", buf.b);
: t* W+ K1 C9 ]7 a5 e. B6 `5 c
printf("count is %d\n", buf.packet_cout);
2 X3 J) c5 x" Y U! j+ J
count_copy = buf.packet_cout;
9 M% L2 Z6 d% [0 j& |
}
, u, ]1 \1 T- k8 t* b* i: Y
else
6 ^) n6 a. e" w1 k0 {4 Y3 T
{
5 _4 N5 j/ W( [+ B
printf("No effective message!");
' Q+ P) Z/ g$ g) K
}
) K- S# U# L% c H5 T. _1 @
}
2 X& `! ~$ e4 D; J) s" [2 k
6 F2 _ R, ^1 O; l3 g
# N- E. l; t; W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 o4 p2 l, g8 s5 S6 j( D' }4 |7 d
使用下面代码,对内存使用了mmap函数后:
9 R m9 k" u0 v4 f' Q; z
#include <stdio.h>
8 y% }) u8 v! r# z
#include <unistd.h>
/ W# R8 x/ _6 Z- F# s, s
#include <sys/mman.h>
# [5 l# V3 Q; N5 ?! w6 P- t+ c5 h) ]
#include <sys/types.h>
D& l+ {+ V0 J) x7 i+ j+ n
#include <fcntl.h>
4 y6 I: ?& I2 O8 k% m% B6 a" U p
; m! g( y9 \6 L8 C" l$ O) D
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ y6 l- \' m% ^! ^! K2 U
#define SHAER_RAM_SIZE (0x20000)
- P8 r% i2 K3 O- @
% r1 a3 Q6 }" i; t
typedef struct
# M4 {+ X9 G3 ~- ^9 V# w, t7 }1 ]+ v
{
. Z$ P5 @7 {/ V5 W" c" S
unsigned int a;
, W6 J# Y6 t$ j8 U5 K
unsigned int b;
, w ~' M5 a4 W2 G5 G0 x
unsigned int packet_cout;
, j: O \) O1 s! X6 L0 n$ O+ F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) D" L0 P4 ]. [ m6 o
+ N& d3 B2 X6 A1 N6 J! h
void read_MSG_buffer(int *baseaddr);
/ ~! l1 o7 t' n
unsigned int count_copy = 0;
5 G5 N3 Q2 z, ]
* P0 G8 X# t! K' ]
int main()
4 h2 D+ w: r, y5 P& L2 K
{
3 \# E l8 h! C0 L
int fd;
- p! P: L& S4 E' P
int *mem = NULL;
4 r( E6 O D+ I @/ e
& P4 L4 x- [8 e) B# x
if((fd = open("/dev/mem", O_RDWR)) <0)
$ N4 y9 b! U6 g
{
& e8 O' c, I/ I9 F1 n
perror("open error");
+ E; {7 _7 J. ^ V! q
return -1;
& ^2 z* T* y/ n) y3 ?! M' g
}
* n& q$ O \8 _, g& z
0 G' c4 L6 _$ n' Y6 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ e4 n5 h+ I# q5 Q
/ j( T, B4 ]" v) M% S) F9 ?5 R
while(1)
; `) G- y0 X+ S9 x4 ~* j
{
3 r9 K/ ?4 i* ?7 ?- S& L
read_MSG_buffer(mem);
4 h$ ?( f" k4 B' R5 ~: I
}
$ X1 D5 h' E* L, V$ x0 T$ I+ k4 g
}
! S* |/ D: H, d5 u. g. h
$ `7 ` G$ S2 ^2 [$ }0 W
void read_MSG_buffer(int *baseaddr)
" W% T3 r8 U- v5 V
{
/ e. z+ V) ~9 b0 I$ e; b. {" N
pRX_MSG_PROTOCOL pshreRAM = NULL;
- V, g3 b' \- z
2 Z$ |8 O2 u- M. d# Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# J# V# r0 O- f4 H1 W
! @# k+ P/ [! |- a+ O. e
if(pshreRAM->packet_cout != count_copy)
2 I- `& \/ W: U" Y
{
2 H) [) q& J. E0 o& T* {
printf("a is %d\n", pshreRAM->a);
3 T% _: l& A( D' }
printf("b is %d\n", pshreRAM->b);
% }9 {/ W1 W. o/ D7 v# r
printf("count is %d\n", pshreRAM->packet_cout);
9 U3 g! Y" w2 }+ N
count_copy = pshreRAM->packet_cout;
) B- f) Z |/ `; z8 ]
}
2 X% S+ r$ Y% X) C2 ^- p0 X5 G
else
& }! Y9 E1 f* ]& C4 V- r3 a: l' h
{
1 z6 l0 x. q2 d* h
printf("No effective message!\n");
) y g- j) e" d( e6 ]3 G0 z' q4 d8 P7 z* o5 S
}
, u9 D$ `6 v. t0 h4 q7 J8 J6 Z
}
; F! H+ g1 C2 F# A" N3 J( V4 p! f
9 f" x" W, |" _# m& ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 r; T7 v; O" P7 E% U" f0 \7 ^
]! A* W$ v- Y; [7 g1 n1 R
0 \, L3 Y1 V5 f. a' X* T F, X
+ z6 W! t6 e8 \8 H
0 g* i6 ?5 c& g; [, J1 B0 t7 Q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4