嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% G& O. o4 V9 t$ {6 I5 H
. }8 N4 @2 `5 P* U; g7 W" x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% \: O" w1 v/ g( C6 U
#include <unistd.h>
9 M4 u8 t1 l# s+ y3 e2 i
#include <sys/mman.h>
/ Q1 P* X0 |, c: u
#include <sys/types.h>
; m m4 N' G( O0 {; n8 {1 k
#include <fcntl.h>
& P9 `) o4 q: ~( c0 X
' s) d) }1 ^3 F1 C7 H- x
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 V" h" _- V/ w5 @ ]* ?2 M) R
& ^; T' S# }* A' R" ]% ] B) ^
typedef struct
/ Z p7 H6 |/ ?: U8 a) X' u
{
' ~- R' R0 K6 P4 q2 e
unsigned int a;
: G8 {$ j8 x9 Z+ k4 ]! w$ |
unsigned int b;
/ z4 v/ M, T3 X: g% R
unsigned int packet_cout;
! U% D- K' m: H! r7 Z1 [$ T- r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ p, E1 |0 N+ ?; a5 F+ A
" L; g4 U$ N/ R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& v* t! C7 Y9 e G2 j
unsigned int count_copy = 0;
: B- I3 c7 n+ Y- R$ Q/ o
6 C8 C1 U F2 u' ^, k
) {- _: |9 V% a" C! y3 `
int main()
( n2 |1 A5 S/ x* A' x- b4 E) f
{
0 s& z3 J, }* w2 S, _+ S- z
pRX_MSG_PROTOCOL pshreRAM = NULL;
q% w& |8 ^) F
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% E5 q i$ K; n; c1 l1 R
* X+ N7 L$ M0 ]& ~
while(1)
: W% b% w; K3 l+ \) Q
{
0 V! V) {, C j0 Q
read_MSG_buffer(pshreRAM);
( d& P2 G+ s8 h1 [9 R
}
4 a. o3 c6 i# ]4 P4 j5 J/ {
}
2 M7 J$ ]( F' c% u Q
' W$ b* J' f g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 c v1 B- k8 j U# }
{
9 s3 B0 k7 K# o: B1 C
RX_MSG_PROTOCOL buf;
) V1 w, o$ B8 g& X
( {4 I* W4 o2 S$ [* j& z6 ]
buf.a = pshreRAM->a;
: W; `: ^# X# P6 u
buf.b = pshreRAM->b;
9 P2 E: I6 o, K- l0 ?
buf.packet_cout = pshreRAM->packet_cout;
9 a. ?8 \8 V- k! l# R
* `: M; I I4 {$ f! x: |* |' \
if(buf.packet_cout != count_copy)
% x& Z6 M8 W# H! u" R4 A! f( t
{
& r0 Z& v3 c9 B* U- F( m+ H
printf("a is %d\n", buf.a);
( V8 T1 w% |9 U- M3 a; Z! h3 Y, J: O
printf("b is %d\n", buf.b);
$ T4 A4 k- M! U2 Q0 U
printf("count is %d\n", buf.packet_cout);
# x0 v8 E- Q7 R- s
count_copy = buf.packet_cout;
& Y' V) A% u* C2 M% ^& m
}
$ J. w3 q" r& O |3 R1 n# [3 h: v
else
7 \; l, Z' G9 e5 o4 H/ b7 C
{
! N7 z# ~1 D7 ^7 M5 J
printf("No effective message!");
& N* x* w, U$ F r' c% H# `* {
}
1 t; O5 i5 H$ _: {2 h7 y! q
}
% N6 q3 a: n! V2 r
$ R9 [& ^' ]! i& _! ~" r
9 t' u) E- u# U. ]: i- {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 F& x3 ^, V, o i( V+ Q
使用下面代码,对内存使用了mmap函数后:
: C# s# z& k7 [5 n2 h- S8 }( m4 z
#include <stdio.h>
" |6 {: l1 T* s2 ~" d2 v0 E+ C
#include <unistd.h>
1 A% x/ e& H% U
#include <sys/mman.h>
) ^3 E) p9 K7 Z- `% e
#include <sys/types.h>
* @; S' Q, T8 N" R2 J8 d# t
#include <fcntl.h>
9 N& }, A: z N0 \
2 g. @$ N4 Y7 f3 b" w
#define SHAER_RAM_BASE_ADDR (0x80000000)
; T6 t9 \) Q& w; i8 _8 X
#define SHAER_RAM_SIZE (0x20000)
% c6 i; g8 l; z* X4 f% }+ K
& R, S) y6 |. T. i. b( N9 k
typedef struct
8 c. ?, t9 c7 {7 J. {! E! D' \- k
{
0 L: A6 b5 }; N6 T9 i' `
unsigned int a;
! z5 f# A M5 R$ v, q6 ~* o
unsigned int b;
# [$ e& q* @6 F( l3 k. W/ r( J
unsigned int packet_cout;
/ R( A* U0 @$ U8 J- n$ m! Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 S$ n! D4 {- Y0 B/ S+ X9 F' s. r
H1 u* X- p8 N8 ]
void read_MSG_buffer(int *baseaddr);
5 c. K% }9 z3 {( ]
unsigned int count_copy = 0;
8 n2 k2 m" x: }3 \3 T- z
( C2 l4 [) Q8 H$ x
int main()
" W: q: |, E) H+ M& K
{
2 O$ ?$ k3 ^5 n6 k& j
int fd;
+ D7 f7 j( w5 g+ _
int *mem = NULL;
- z, D$ G7 y( ^3 z: K; T5 F& C
- i8 \) G2 i) q, M6 B, s
if((fd = open("/dev/mem", O_RDWR)) <0)
6 F# a) Z9 l+ r" ?* F8 ^
{
) g! ]4 Y1 T1 ?8 K: V/ Z$ H
perror("open error");
2 W; x. C' `0 \+ a+ {% ^
return -1;
; e. D! s) G. D* o6 L# c: x
}
0 ^" I$ @% L; }* m% g
, _4 V) o# r. j9 y# c( R. Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 t8 E5 P9 X- o" A
( @5 @/ `0 m2 Y$ f: C$ u. R# [0 n, y
while(1)
. s4 P7 G: n7 Q; _5 i; @% E: f
{
5 C. x2 l1 n1 P' z* k$ ?
read_MSG_buffer(mem);
% z& V, L9 K! t
}
, K5 K: h3 ]3 G+ e6 F; Z# D0 T
}
+ I: {7 L0 E0 Q1 z, v
. [3 `7 P# B* F# U) Q
void read_MSG_buffer(int *baseaddr)
# M- M* l; q. p K" f" X) t
{
. C4 z% U5 W- T1 s& s3 n3 \9 w# [
pRX_MSG_PROTOCOL pshreRAM = NULL;
. i! ^0 G; ]5 n$ i; \6 S
* P) ]- B; d9 o4 k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; l) M+ d: T: d6 {! r" p
# t& A3 v/ F3 u
if(pshreRAM->packet_cout != count_copy)
6 B- Q1 k- k, l
{
( e7 j8 A# }* n" q0 ^
printf("a is %d\n", pshreRAM->a);
9 R9 P& Z- T( k1 C4 O4 o% p# ~
printf("b is %d\n", pshreRAM->b);
# h- `) {+ \8 \% F: l
printf("count is %d\n", pshreRAM->packet_cout);
4 n1 g; t& w% `1 V; G
count_copy = pshreRAM->packet_cout;
6 {, N1 b+ x0 B* u s8 O/ J) w( K
}
1 g+ [! u1 e+ i8 V
else
/ T4 F. d+ g. D9 Q
{
1 i' J7 e3 l+ Q
printf("No effective message!\n");
1 F9 J1 M$ f' @ c3 `) N
}
! y/ A* W. V" ?# o$ q
}
! ?* ^8 B6 u: V, Y8 _/ ^0 b
: d# d: T1 M* W6 i/ Z: Q% m$ J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; K1 C( ^; l- D, ~
- Z' F6 L/ P. o
. D2 q! |" z' A, F" V/ T+ @
" @ j: x G5 }+ e( h) L
+ ]5 t0 I4 T1 @4 q8 C9 a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4