嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ~- t+ w0 V# @9 ]' W \' ^2 O: g; f& @
" {- b8 B7 ] s) v) @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* J% ~. B; M; L1 b
#include <unistd.h>
: F2 `7 ], f) V! a7 b6 i
#include <sys/mman.h>
0 L: p4 s0 j" [( V! n1 J1 K
#include <sys/types.h>
8 c5 ?7 X8 E/ ?# G% T$ I$ m
#include <fcntl.h>
0 X( u; T) q9 I6 `& i
) q7 I8 m3 p4 ]# ^) P
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ m; f7 Z3 R8 D/ O, U1 i1 q
. [- j: ?6 N. E6 C
typedef struct
( ]( f5 p B6 X5 ~
{
5 y; s5 ?7 P. @6 R0 ?; Y& ^' C
unsigned int a;
- P) C- ]: E3 U Q7 y
unsigned int b;
0 q' c( v. B/ z$ O0 X
unsigned int packet_cout;
7 j8 b) g0 p- {6 w) [# ^0 Q! I8 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 q& `5 u1 P! W, [1 e2 Z) W
) {* V& J( R$ ^6 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) B- E$ @' X5 c9 w
unsigned int count_copy = 0;
7 J0 z$ u/ R& B3 n
+ z0 v* u6 D- P8 M3 w/ W' p
. R; s& t! ~' f
int main()
& J0 A6 G3 K @5 G- m1 a
{
' N: L( ~) H# l7 s5 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
* ?2 `9 v1 l/ E8 `8 L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) T* f( M F2 M2 p+ p
; r8 o8 i; d. m/ }5 w
while(1)
4 O- }/ ~0 U) {/ }- J
{
! x a4 v* N! A! J! [4 y
read_MSG_buffer(pshreRAM);
/ E: b3 B: u, a" ?- g& N& b
}
! ]; d, M' H' c
}
# f% S6 G2 [2 p
; a4 b: i& O0 R) O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
2 G9 T2 g1 ] e% [* H: T
{
' `1 U' y7 {4 c# B- d) B- c6 x
RX_MSG_PROTOCOL buf;
2 H5 |/ s8 E$ E8 _! I7 |: V3 @. U
6 L4 V" H% w4 Q) s9 S
buf.a = pshreRAM->a;
# e& F1 W q) }& e
buf.b = pshreRAM->b;
" h. M2 ^+ K$ _; c, U
buf.packet_cout = pshreRAM->packet_cout;
; o& B/ |% L% s# V) Y
- z5 P8 I& Y; l9 \
if(buf.packet_cout != count_copy)
M7 U6 }: I7 K( N' y' e
{
8 t* }$ A; Q J |' s
printf("a is %d\n", buf.a);
; d0 y) P, J" r( a; Q+ L0 |
printf("b is %d\n", buf.b);
, f: d4 K t+ Z0 a; [6 ?4 P0 \; W0 L. T
printf("count is %d\n", buf.packet_cout);
1 Z* \3 v5 [* {. r% B8 R9 |; y
count_copy = buf.packet_cout;
5 w' B$ f" L J) ]
}
. q* f% _" k6 X0 |! G* t( I! O9 a7 M
else
& V% _8 ]# M/ N# \7 ]+ X
{
2 l) i! U* S Y2 x; P$ F
printf("No effective message!");
7 O; J' x0 |& W5 r' _" z7 r s; p2 D/ N
}
% `& O' j- ^9 V! O. f
}
+ S) f: b2 t, h1 m
) S( [/ d8 t" h3 t8 w( G
. z4 |% L9 L1 d; F! ^+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% r4 v2 d+ @9 H O1 A# F
使用下面代码,对内存使用了mmap函数后:
. o1 i* P/ x: Q) W! Z3 D
#include <stdio.h>
, K: g* L7 O& @4 E3 U( B
#include <unistd.h>
% x7 x1 @% s1 @2 i1 h* j
#include <sys/mman.h>
' z4 |. p' H6 U5 s+ _
#include <sys/types.h>
( v, y- R+ Q, i/ \8 d( z
#include <fcntl.h>
( [/ a! ?* X3 O z# |
% P% e% @3 B2 f6 p2 Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
" a3 ]8 c+ ^+ m- z4 o
#define SHAER_RAM_SIZE (0x20000)
/ _8 |# l. y) w6 T
% b' F2 |4 r6 U5 e \2 R4 i
typedef struct
, \2 J" K* S; ?7 e( S* W7 J
{
9 \& ^8 ^5 [. T/ U% W; E
unsigned int a;
8 @( I) X( d0 e! H& R
unsigned int b;
; J5 Z8 u8 O% X
unsigned int packet_cout;
o. D( {0 ^* A8 b' v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" V# @( J9 e. r9 P
$ k' b5 W* ?- E+ m- E; [
void read_MSG_buffer(int *baseaddr);
! r& t6 p @: @1 r' F% M" J' E9 m* e# N6 t
unsigned int count_copy = 0;
' C3 E; Y# [4 V* O* \5 I# _
: x' i5 x1 M! [9 h
int main()
7 M! ^1 _9 U4 K" J( S2 n
{
2 u( c0 c" |+ S4 }' p, l7 G
int fd;
" w& d! K1 f5 {! j" H, d
int *mem = NULL;
- g8 N. M7 _4 B
+ V1 c: D1 C: i- y) E+ D8 \
if((fd = open("/dev/mem", O_RDWR)) <0)
$ J E7 P! l- U2 p7 x! e
{
) s/ ?1 W: d7 C8 P, O- C
perror("open error");
$ o# l* Q8 ~7 N- S
return -1;
0 J2 n4 a, \* X) Q1 J+ ?! \
}
. J3 A7 j; j5 l( G5 [
+ M, J' Z; |, W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) a2 i- {" c0 C( n- q9 G" L
" q" D/ S) {* w& M4 p, \( Q
while(1)
% |( O/ v5 B9 s; R2 r& h8 A
{
% i: X! i8 q- ^' w' j( ?1 I( ?
read_MSG_buffer(mem);
) M: c" I" w! g! M4 N4 H% ^
}
' P: V4 Y4 o* L" r
}
$ |7 k1 E3 D9 ?6 y! w, X
# ` [0 f% e) }( B* W
void read_MSG_buffer(int *baseaddr)
1 T8 W, w, _" `7 O
{
$ d7 s$ Z+ B" |0 {9 X, M. E- G
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 c% }9 C- y# E- E9 I5 I7 U
' W" B& `5 @, T1 |) C) z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' s, Q5 q2 \) J8 z: S% N
! i& l0 q0 t- I V( y
if(pshreRAM->packet_cout != count_copy)
6 m9 U7 ^8 t8 z/ d3 y9 N5 F7 \
{
+ M9 [0 F# g+ o; i0 F# }9 X+ v+ b# `
printf("a is %d\n", pshreRAM->a);
5 d, w/ N" U4 d5 Y2 O; X5 l
printf("b is %d\n", pshreRAM->b);
' [/ j1 f% z0 ~8 N: B" M/ _7 p- I
printf("count is %d\n", pshreRAM->packet_cout);
; V+ l |1 {* `
count_copy = pshreRAM->packet_cout;
$ f v, j# L I3 N) R- e
}
8 P4 ~. D/ T( M. p; w
else
9 b7 t$ H: e! @8 y2 R
{
6 O" G% o' F7 x* _+ d+ g- w
printf("No effective message!\n");
- v/ O2 l" m7 _1 i1 u- l1 U: H
}
. H7 a. A5 }' C0 g. T
}
2 H1 |6 v2 B6 k' l. n+ N
7 K3 d# y% Q2 V' I: p% }9 Z/ E* n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' Y7 k, ?' n( Q0 s* T5 P! \
5 l* T8 v w0 t4 ~) y
+ y, O0 ^3 v% ]8 K6 S# v
o; }: r Y7 `3 y; t4 _
6 z/ _; r& g ]$ B
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4