嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; R% M6 h {/ Y7 r
5 W2 E) Z' @) F0 x5 p( b: _9 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( l: n3 L `! H7 t% r
#include <unistd.h>
' ]4 H3 l3 t' u3 x; f, C
#include <sys/mman.h>
M( i% \8 E7 b! \( ~
#include <sys/types.h>
/ a- M: R9 p+ \3 t2 Q3 i
#include <fcntl.h>
. W5 U- j6 F- ?4 g0 g" p9 K$ a7 [2 B
, N* e3 e" ~# z; b. M
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 ~. Z/ W0 Y" g& t& x
( ^4 J$ M6 ~: m# [* o2 [
typedef struct
1 B! `% F: a* k4 N" h1 F
{
- |4 v. ^( i8 F: X% a
unsigned int a;
x: h0 n/ P" z4 q9 o
unsigned int b;
. d* M1 L* }% j j; J
unsigned int packet_cout;
?: Z. b( f5 z7 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! p& H( a( S9 `& _$ u
2 t8 R1 w/ x" u+ @) x# C4 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. X' f% J4 U/ P/ L' \
unsigned int count_copy = 0;
9 I' _6 r; R/ Z x
- z/ Y% F/ k6 `& f7 U
- f' J3 N% H3 S0 J5 M9 Z3 U
int main()
2 d1 Q z( a+ P, |# M3 q1 {
{
. ]+ d! }3 S1 C# ]. H% z) ]8 W
pRX_MSG_PROTOCOL pshreRAM = NULL;
" N# D. h$ ]9 {$ V; I3 | D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ J8 O# d: C; u* o, Q, R
9 }% [7 e% v0 G
while(1)
& L; f$ t9 ?! X/ s+ D
{
4 z& Z# Z2 U0 U2 u
read_MSG_buffer(pshreRAM);
! R+ T: v7 _8 X! S( @
}
+ ?0 H5 A8 [7 H* f0 H
}
6 V" K, I+ b5 w. v+ n
" _( m |/ t+ a- Z5 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) p: p4 P7 R% j- V5 Z
{
. l0 x4 Q1 r a/ o; e
RX_MSG_PROTOCOL buf;
( o! M8 p7 p2 R0 s& `5 Q; o
1 L- x& z, _* t
buf.a = pshreRAM->a;
: t! ?% a% _4 b: n0 Z. B5 _) @' u
buf.b = pshreRAM->b;
. w+ R( ~: G4 m" l) y. s G
buf.packet_cout = pshreRAM->packet_cout;
# p4 _* I; d- `' i: w
0 z; I3 K; r1 I! k
if(buf.packet_cout != count_copy)
" l t* E# y- X7 w, y
{
! a# t- W* A5 g
printf("a is %d\n", buf.a);
+ P' V) S9 W) |- N; B1 J2 |( ~
printf("b is %d\n", buf.b);
3 |4 X N, J) d/ [3 E
printf("count is %d\n", buf.packet_cout);
8 J' i6 x) I( r. O' s
count_copy = buf.packet_cout;
# c3 }7 i5 r- A' z+ ^# M6 d
}
2 d# B& ?! u- ~5 C
else
9 ^: W: x% h( d! r3 J. M
{
) q1 N$ ^( n! }# _
printf("No effective message!");
# k) N- b7 C# }9 N# w9 \! a1 z/ D
}
) w! t7 q% g" s% D* W K9 a6 A" ^
}
* K' @0 b! K6 \2 @' _8 B8 q7 p
9 q+ |* s) a# X/ w( s4 @; Q
' P8 z) x4 ^( a. k4 K5 M( l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 _1 y6 C- ` a4 F) _1 M
使用下面代码,对内存使用了mmap函数后:
% A3 K" M. @2 P1 i
#include <stdio.h>
& S$ Q' z3 S$ K7 o
#include <unistd.h>
$ k/ R+ C. q5 m% d: H3 D
#include <sys/mman.h>
U4 ]9 o' M9 S [ H. N+ G
#include <sys/types.h>
+ E! B/ G1 T9 B
#include <fcntl.h>
2 B# h: q& G. b9 D7 E Q
. t- j/ u; q* I; J$ x0 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
- A X& I0 r- y1 Y [" ^/ ~+ p
#define SHAER_RAM_SIZE (0x20000)
. f( h @7 l c/ K( M/ Q
% f# z5 p. c( i2 I, r0 _
typedef struct
q( z5 b. k8 N; Q) h
{
* L5 v+ n9 y0 Q( z& q3 }0 g. e
unsigned int a;
! ^/ e: I- `& K* o" H# E+ T
unsigned int b;
* F/ x2 e* n) S! h. r/ @) ^
unsigned int packet_cout;
2 A7 u7 P# n, B! Y: p5 ]9 l0 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 N) n- r0 K9 P0 V* e
$ `* A7 {7 T: r$ g7 ]
void read_MSG_buffer(int *baseaddr);
/ [7 N G* e# X
unsigned int count_copy = 0;
( y V0 s: Z. I# L$ C# {. m
9 b) Z! m) x. V4 G9 ~, L1 E R
int main()
$ J- U, f+ h' m! Y0 [# g$ y) M1 Q
{
( Y8 l( @7 T6 z$ D' n! |
int fd;
/ @, K& @8 `- Y/ h+ ]* e6 z
int *mem = NULL;
o% [; v: [" G+ M" m) E& l
/ O+ k% a h: J4 ]
if((fd = open("/dev/mem", O_RDWR)) <0)
8 l* y6 t) u% g m. X
{
: q7 j6 _9 o Q* x; F. d p" r
perror("open error");
# a: w% L5 \6 [% E2 T' z4 V
return -1;
8 L3 E$ ]1 p1 e4 E0 o% h5 H! c
}
, a3 ~3 o' {& [+ M) m$ [' c
0 n7 @) h7 S0 P
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 ^3 v" |. M" L/ n
! f2 R, Q/ N% t8 V6 z- z" W( J
while(1)
s, s9 |0 y0 R: T7 c- v7 u% K1 t9 w
{
" _3 u' L) h0 \" Y) i3 i
read_MSG_buffer(mem);
\; w, j$ d- d
}
; ? @( U4 p0 R+ s
}
) I3 x0 N5 {# {* |1 C" _: t/ @
$ `# v4 _ K! p. P
void read_MSG_buffer(int *baseaddr)
O& I" A5 F6 O2 E2 |5 g
{
/ A" U; ?) w* G0 o, i0 e! D$ t2 [
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ^, [" h! }- c4 s
2 {& q+ o+ M# ~ T
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( Q8 i% n! @/ q! q) N
7 C8 S8 V5 k6 q0 u0 n7 w
if(pshreRAM->packet_cout != count_copy)
; Z+ a5 W4 y5 o
{
/ k2 V! B' S8 k1 \
printf("a is %d\n", pshreRAM->a);
3 P8 B, C: j$ a
printf("b is %d\n", pshreRAM->b);
) E1 q w" `! }. j
printf("count is %d\n", pshreRAM->packet_cout);
/ ]* _8 v/ |3 [6 F
count_copy = pshreRAM->packet_cout;
0 Y: k# ]9 ^6 ] C& f) G
}
- \7 G/ a2 J: ~# e- C3 r, S6 c
else
9 _5 T* j# H3 g3 O: q" G
{
6 T( |$ a+ v' t. [
printf("No effective message!\n");
0 Y, n# ]9 O7 f
}
# f% `3 l6 y! R6 c, ?" |/ R
}
2 ]4 b: ]* Z& e7 H) R
0 n$ K0 ?* S# X4 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: T8 ^. B Y( B+ L- n% ]& v6 ~$ [
1 `; v. v% ] E' V! }
* }% c& u) Z! t/ y9 z
# H5 e& j5 z8 X
; ^% c0 o- i# f+ u4 |. ^
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4