嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; @4 g- L0 x9 v$ O; d7 ~ E
$ \; i1 r( i5 N( L/ h3 D# P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ^( m. J7 t; g1 O$ \+ _, A
#include <unistd.h>
" \# `* N& J: M; k* z' y' r
#include <sys/mman.h>
" J, Y, V2 C) T' x+ f
#include <sys/types.h>
, k, z5 J3 \ L+ \, Y" t i
#include <fcntl.h>
' S7 q2 r2 q! q* z* e, `7 a
/ z- N" i7 n9 `9 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 [$ B2 p" O3 I: g, M
; Z9 k' U2 U( A$ Y2 A# {
typedef struct
; x% t P0 O6 ~
{
$ n3 v# T( N6 I. y& l6 w+ y
unsigned int a;
. }! g# F6 Z$ M5 U3 H* r7 i
unsigned int b;
- l% _* ~, i. P# l. W
unsigned int packet_cout;
5 D. V( ]. x) n2 |* \- H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( f5 H$ O! O" K4 Y% Y
* N0 P+ `8 c: G: ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: T, o$ ]& O( q9 l" [5 R7 n
unsigned int count_copy = 0;
- p7 `1 J! x d' O. U
- S2 l( C% D2 v* j, O: I o
8 ^8 _* Q% d- R- G$ d
int main()
) _5 ~" T# O3 \5 \! G$ F& e# C
{
; W1 O, R$ L1 R. s
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ d4 u) v( y4 V; }/ O
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 r* ?3 ^9 Y# Q* \
& { Y# C9 i/ b7 D7 d6 C
while(1)
. j9 I) ?1 U# j" d5 `0 Q% ? ]
{
2 o$ s- [% w: z0 v( o
read_MSG_buffer(pshreRAM);
& k) Q* i3 u. \# I
}
: o7 x! t' C1 g1 ~4 q( x* E
}
3 I8 k) \" x. V! B4 p% J
% D# Z9 W2 E% H4 R5 H1 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" r3 e2 g9 ^- e! c3 d. H" x
{
' w# x6 I7 a+ k9 `1 V* K
RX_MSG_PROTOCOL buf;
% j$ L; S2 q2 d
$ U8 V, s3 U' x# \' M+ A" |: h
buf.a = pshreRAM->a;
7 U4 i- W5 u+ |8 ~ x: S2 ]
buf.b = pshreRAM->b;
7 p2 l5 t* j" P8 H2 E7 F0 B
buf.packet_cout = pshreRAM->packet_cout;
1 y- h0 [. _2 f. I k/ M( x6 g
! F, d$ L% }- O7 l" d( j
if(buf.packet_cout != count_copy)
( r2 \& z) z' C: I1 H3 J: R
{
+ ?& A: @3 X& `1 l% s; P: h
printf("a is %d\n", buf.a);
# o, K1 @( |1 j) a
printf("b is %d\n", buf.b);
9 R0 Z7 E [ R- V; H
printf("count is %d\n", buf.packet_cout);
4 m1 {) c! L$ G) _' X
count_copy = buf.packet_cout;
' w' u ]! l% a' P7 e7 }8 B n
}
+ h# q, [1 |( K8 B$ z3 g# {, u
else
# n0 q7 n+ N2 z# z" A$ e. n
{
- ~/ s* z# H7 ? S9 ?
printf("No effective message!");
+ [) J, l/ M ?! n
}
- C" g) A. |$ J: [& z+ Z
}
4 V) }; j9 d" N' u/ T
9 b& o' Y5 V6 G1 n! o
& j5 R- I- U/ x) J0 o& y" S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# P$ w- g8 E Y
使用下面代码,对内存使用了mmap函数后:
7 t2 |0 Q4 P0 D# F4 p
#include <stdio.h>
5 D* t. Q' W8 V* h" M
#include <unistd.h>
$ }* v" [# t5 @6 P' R. B! l0 V& V
#include <sys/mman.h>
- m* e5 h5 @* u# l
#include <sys/types.h>
2 m+ [3 p$ \7 y8 n/ _1 `+ A/ ?
#include <fcntl.h>
I; y/ o: Q, |3 o6 m
k7 N1 N6 j( H
#define SHAER_RAM_BASE_ADDR (0x80000000)
" n* ~' R% X: I2 F
#define SHAER_RAM_SIZE (0x20000)
) }6 B& R* ?7 v* d6 B2 w0 g. x- l
& j- y$ G/ l3 y3 V9 Q
typedef struct
2 p0 m0 G9 G2 P5 i0 G& c( d
{
# K. k/ L, k2 u' l0 b! y) ^; I
unsigned int a;
: Q: r" H M* n7 k
unsigned int b;
2 U8 T: V7 r& ]( W6 _
unsigned int packet_cout;
' r9 y2 ^; C+ Q7 ~! T1 W; s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' c) g5 p. o4 N* {3 C) l
9 H" c1 z$ ~; z
void read_MSG_buffer(int *baseaddr);
) M4 Y* R: ^8 H8 B
unsigned int count_copy = 0;
9 `6 D4 F# [! p! t' R# n
; j+ u& l( t$ C. n' V& u' H5 V
int main()
/ p* H. F* M$ V
{
, W" X- j: }0 }
int fd;
( K0 Q* H# R# p' E' Y3 _
int *mem = NULL;
: E9 Z# n# Z/ K% A3 K4 `
" W+ I9 O$ R' W1 H0 F+ w# n+ L! U! x
if((fd = open("/dev/mem", O_RDWR)) <0)
4 X; T( J/ {0 O) s+ N: b
{
+ J- _: l/ l2 z9 \8 ]
perror("open error");
" d' p) G5 X9 ]# J
return -1;
' ?# T) k2 c' Z/ f! T8 O! q
}
: j+ x! E* J) ~& [
G* L9 e* D$ Y! q% o+ W1 [ x z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 m, P; ?) ]9 \ I# t" O
( j d0 N5 ~2 E& k2 z
while(1)
; f$ H% z8 ?$ }9 ^
{
5 h/ S: N8 G# Y4 i! g
read_MSG_buffer(mem);
( l5 k) j- W. W1 \& T
}
2 \. }) ^& H9 o# {
}
2 @ b9 h# i1 F9 S& h& j
7 ~: P/ m7 i. i
void read_MSG_buffer(int *baseaddr)
" N M3 g6 {* h) A
{
; D& A; t- _( b& Z( c
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 ]; v. K* v6 K8 v( ~# W
/ O$ \& j, r: [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" S' W, k1 |7 }9 F% C0 y: p
( S0 o) U0 ~$ N# h4 b% R! ?( F
if(pshreRAM->packet_cout != count_copy)
; g9 |* D( h: P3 @) r
{
: B" i) i- E3 a( k
printf("a is %d\n", pshreRAM->a);
: j5 H; i- c6 p3 L
printf("b is %d\n", pshreRAM->b);
! d: J# M+ q9 x% g& m
printf("count is %d\n", pshreRAM->packet_cout);
: E9 e4 L" k1 }6 q" e7 K9 p
count_copy = pshreRAM->packet_cout;
5 x* o2 ~: L; x# o$ j. @) ^
}
9 t6 I* ]5 D* V. d
else
/ J* x# ~5 i( M6 p/ w( g6 t
{
* ^/ X. `5 J* D8 K' V0 `
printf("No effective message!\n");
9 k1 ?" j% C* M$ c, B! C8 D
}
& X% p! H4 V) L. L
}
2 o# [4 e- i6 z1 s0 b; X
; j+ g! D. B; O6 V5 K9 B R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 b; Y2 H! ]# R0 a5 p$ u& S9 z& G$ R
1 F2 H( x( B1 x& G' O, }% [( l
9 f- p+ j" z2 P) j8 W2 @
# F# W4 n* D7 @0 \/ K8 n4 j9 l
M% G# r& h/ v1 V# ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4