嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- @' o' K( Y3 L) J, m) K
# {! S0 a% A+ [; U! w$ A ~. j3 \' Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- H' g" Y1 s5 u/ P8 U) N: a
#include <unistd.h>
! ]( S. g2 K5 y( e7 M! h
#include <sys/mman.h>
. I7 _9 \4 L0 O! B) Z
#include <sys/types.h>
, X; }# E g6 q& ]' e7 E8 b
#include <fcntl.h>
. b3 s9 V0 t6 X; ]4 l
. ?5 \: p# D$ G3 S9 L
#define SHAER_RAM_BASE_ADDR (0x80000000)
, c0 G0 J: X$ t. Y8 l: d# }
1 {! g) k9 O: X( }8 |$ v( D
typedef struct
2 p: I7 w# w* B5 @$ }0 |+ X% O& m
{
, f. F& t+ ~; p$ M. \ E {9 d- Z
unsigned int a;
+ k" u0 E7 t/ p6 U
unsigned int b;
7 I) N: _/ P" j- K5 S5 A
unsigned int packet_cout;
, L7 |7 x3 X* J9 `1 X; z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 E+ X2 i @" _& y1 F
7 }" t' a( D: j8 t9 `7 `; r1 a( j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 }4 l; L% X5 ?
unsigned int count_copy = 0;
6 i7 N( }& N$ ?$ u/ ?& {; k6 F
7 x L; P' }7 j8 N+ f. K$ d/ ?
3 t% t) N+ L0 g- p! ~9 O
int main()
2 S r. m9 h2 E8 _
{
% ^3 t( s: k& F( ^( O
pRX_MSG_PROTOCOL pshreRAM = NULL;
z1 ?# a# l* ^: r1 U6 l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 ]- v# ~( U, {8 {; v3 i1 X2 B
$ `9 e' y0 Q {" m ?. ?
while(1)
7 G8 R1 J2 C4 x: H- m
{
6 L; P! n1 ~3 ^* D1 k* c6 N4 ]! Y. ~
read_MSG_buffer(pshreRAM);
9 S$ q) k: U) R! I _/ Y
}
" r7 P3 t7 M. A
}
" T% u7 m( u9 m) F4 Z1 |4 C
. y' L; `* M% y! ?% Z0 T9 k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" S g6 e$ f7 `; Z4 c' w
{
( d! j' L/ G/ e6 |
RX_MSG_PROTOCOL buf;
: k% v# c8 ]/ S
& \2 ?1 F* G+ s2 K5 X* f2 N. N
buf.a = pshreRAM->a;
6 L& u, j$ R) M4 f6 @- x7 [
buf.b = pshreRAM->b;
% i$ E6 r' {7 ^. a) g, Y
buf.packet_cout = pshreRAM->packet_cout;
. X" s5 h" Q, f3 V3 {( m# u
0 h7 J: \4 a' z# E& b2 o
if(buf.packet_cout != count_copy)
0 X* N) p. R& o+ k$ u/ k3 w
{
0 O2 B( w: k N( J7 _* N- |
printf("a is %d\n", buf.a);
0 N/ ?; g1 m# x6 d& \! R w
printf("b is %d\n", buf.b);
; V2 J2 q7 n8 J1 n' K
printf("count is %d\n", buf.packet_cout);
, |/ b! n; S% k7 A
count_copy = buf.packet_cout;
& r2 S7 ^2 G; g' p/ Y! ]
}
! N2 r/ E0 d1 q" w0 m
else
& U1 h4 g2 k) i
{
/ ~, _3 W C! b$ f4 l. _! e8 ?
printf("No effective message!");
/ B1 H. u) u- }) u
}
& ~; z3 d( n9 H, K1 b
}
/ z, N; V' Q; ^& E, ]! P3 V
2 z( R3 @7 A( S9 c) F+ e) [
% [" @) N* E6 [( y6 j- U: F* E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( o9 i4 ^7 l$ S! b
使用下面代码,对内存使用了mmap函数后:
) n; E/ Z- o+ r9 Y
#include <stdio.h>
2 Q* H0 v: E% s" Z! I7 P% A6 I2 k
#include <unistd.h>
- u# c) P& S) c* l3 g( D) X ]
#include <sys/mman.h>
" N. T; ~6 V& E$ k5 m
#include <sys/types.h>
# R( C3 u5 a' n ^1 F4 @$ j
#include <fcntl.h>
4 L$ w; O! N2 h/ _9 ^7 H
4 H. d4 C- d0 x$ f2 v# R! e: _
#define SHAER_RAM_BASE_ADDR (0x80000000)
) v0 j( ^( H+ h
#define SHAER_RAM_SIZE (0x20000)
7 g7 E, E7 w% B f& ~
( j: ~3 a) `+ J+ S" G# `
typedef struct
3 q- L: K3 V) a K+ l2 J3 a( R6 A
{
) }2 n3 j, n& n" C2 P" {
unsigned int a;
0 b3 \9 [* a/ K
unsigned int b;
+ c% w& G h( E1 H6 E2 |
unsigned int packet_cout;
, {: r0 |. Q) U% C" W( i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ K3 v9 s) n4 o
8 m/ @" G7 Y p/ Y( R
void read_MSG_buffer(int *baseaddr);
5 ^; { }3 y. X' F! N4 ~
unsigned int count_copy = 0;
- M, X2 S7 V. Y2 f7 k
$ ^- P7 A. ^9 V/ C( {+ X
int main()
, n% e4 o# R' E( g8 H) f0 p
{
& r* ]+ w7 I" r/ [
int fd;
# v* t( T, z1 t V" Y" x9 a0 _8 u
int *mem = NULL;
7 [/ S3 {2 g, o1 W) [, E0 k
. Y! a- g* L- G! a3 W# M% ?
if((fd = open("/dev/mem", O_RDWR)) <0)
8 E. Z* j$ O) k% a% g1 J
{
6 ?! L. R- w0 M$ V, _2 y( j$ | ]
perror("open error");
) J* c" p- P$ `
return -1;
0 V2 a: R. Y8 I+ j3 j
}
* M) D; E& t5 \7 q9 s! i* H6 [# M3 G
% B; _) c$ h+ h1 i. O9 Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) K3 i6 U* [2 S4 O
* w/ \7 `4 p. V9 X6 E
while(1)
. L* z7 {1 p2 E2 R! |0 A. Y% U
{
9 M- _5 ^9 N: G; e
read_MSG_buffer(mem);
Z% L. F/ Y" b+ G6 x
}
# P! P# Z$ ^7 J8 T3 I
}
: F9 j& O+ m) v. P7 ^5 b7 ]" B8 |/ n
0 u& j0 Z# i8 R( h! t' y- t
void read_MSG_buffer(int *baseaddr)
a1 @; R$ X: L7 e; p. M- ~
{
2 Z6 a4 R" p# _* h- \
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 p: J" f( N4 n* D0 a u
+ ?/ @' E* W9 B& _2 G" n: x& Z2 {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 \0 N1 p9 B- M: m, J8 \$ R
: |" [2 x3 x6 M7 o- H, L- Y) o* L2 @
if(pshreRAM->packet_cout != count_copy)
, x4 y% i% Y$ ~& t# d2 X
{
6 N3 u9 B; G5 H ]# F
printf("a is %d\n", pshreRAM->a);
) {: | }+ T9 h' p! |9 x: d
printf("b is %d\n", pshreRAM->b);
& d: |) I: p+ h! _# t/ E8 W# q
printf("count is %d\n", pshreRAM->packet_cout);
9 [" p# D3 v2 j% V3 a
count_copy = pshreRAM->packet_cout;
$ g" U2 d9 t c4 j
}
2 @5 L" t0 f Q# H
else
2 D1 d# M* ]$ P' p' h$ b- [
{
# x) L1 |1 s9 X4 g0 s% F! Q9 P
printf("No effective message!\n");
, [ z+ b9 w: E) S G! P
}
& E/ q( `# O/ p: M5 {; L5 F2 G
}
2 X5 Y7 e9 `1 Y$ u1 W" ]) v
+ g X, r, `4 I$ J8 S1 c w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( _2 q! |% `" n/ b1 w- w9 [
: P/ m" @* f$ L2 A7 W& o
# w8 `+ Q6 W$ {8 i0 R5 j u; l
' E8 B: ? b% |0 C' a1 L; |
( `7 W- S0 p- | `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4