嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& V7 c- d$ a+ Z/ m8 W, z: S
B; {& {9 w$ ]- w+ t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& i! [$ G5 Q* ~1 q& p- a
#include <unistd.h>
$ A+ i2 X3 S3 o; C* D9 b, V
#include <sys/mman.h>
5 Z1 @! W1 N* ]$ x7 L
#include <sys/types.h>
. K% u2 ]: s( D" |2 W
#include <fcntl.h>
8 C3 O- |" v4 n Z U
3 `% T/ a4 j* N% P& U2 o! g
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ V- y3 ?1 z2 I: E, g, ~5 D2 K
- z& H4 v2 U4 |/ F' w0 y/ O
typedef struct
3 N* n+ i% i( G4 Z: Z
{
2 |$ p0 c* C/ E- \+ }" Y
unsigned int a;
% \7 G# T; E. e2 d y5 _2 ]
unsigned int b;
6 H! I2 Y3 r5 D% J
unsigned int packet_cout;
* l9 C, f, ]' k4 B$ ^1 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) a+ l# J* q: z0 x. R
- g/ o$ Q$ t0 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# [3 w1 L. O/ ]. L/ R
unsigned int count_copy = 0;
, W6 r, S/ U2 N8 p+ w7 ~; z0 ~
3 D$ Q4 A8 ^2 |( N% T' B) }
1 w5 ?5 |: `" @4 a* j" L* ^; V
int main()
$ j& [. \! A0 J
{
; E6 A! y+ O1 ?. V/ {# m5 k
pRX_MSG_PROTOCOL pshreRAM = NULL;
- C9 C P9 A1 X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 v5 P2 K: V) h9 n, q& M( I
" g! K5 l5 v- }) H0 C
while(1)
" |6 z4 K$ _$ K6 W* J. p
{
! O L9 p, \$ B9 v
read_MSG_buffer(pshreRAM);
$ W) b- ^( B' \& R; |2 p' q4 k. V7 A
}
: N/ G, h# S# C7 ?1 @' S
}
! W6 g% T- h( n$ k. S) h$ P8 E
; w4 r$ N; w2 s+ [" B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 \& R8 a) A' C/ {# A
{
4 |% y4 Q( O+ D. h p% t/ |0 k
RX_MSG_PROTOCOL buf;
/ W$ @ \4 ?' U3 ]0 k2 G& F4 F) ?: J9 N
+ F$ F. {$ B, a0 d* Y, l" Z
buf.a = pshreRAM->a;
0 X' L$ q4 A& s
buf.b = pshreRAM->b;
4 d' N, o, r) p' l( Q
buf.packet_cout = pshreRAM->packet_cout;
9 y+ {* b! V& c7 t, e
* L* [% e, @1 g
if(buf.packet_cout != count_copy)
% w5 n, C/ F6 i' f; y
{
' H1 P( U4 g& P+ e- I# W
printf("a is %d\n", buf.a);
+ J' n# P& D0 O2 ~3 x! }* ~
printf("b is %d\n", buf.b);
2 r4 ~. j" a) s) M7 _
printf("count is %d\n", buf.packet_cout);
, r& \, u) y% O2 D9 Z6 j' V6 E
count_copy = buf.packet_cout;
s* |1 O+ ^. I& x4 z# d$ A
}
. D _& F3 Q% c/ s- W2 e1 r
else
9 s+ H5 P9 {& Y5 K' N
{
5 C( s$ y4 v5 T5 x& U' N
printf("No effective message!");
. K. _0 t1 M5 Q- t7 y; _9 [
}
2 O7 k: }1 x) G# V
}
2 m/ {! v6 y; }7 c
0 p. y: L# Y9 A% \* ^$ D8 c
. X: o2 t2 B+ C4 c' C/ I0 W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 Q) k) p+ @3 c: Y
使用下面代码,对内存使用了mmap函数后:
3 a+ |( a1 d: x" |
#include <stdio.h>
( X! V8 B7 g4 {+ H# ?' j/ i
#include <unistd.h>
2 ^ {+ K( H' P- b0 Q: Z! W; n
#include <sys/mman.h>
2 ]8 N$ W- ~& g/ T
#include <sys/types.h>
1 D1 c6 J$ v1 S" K/ S) O3 j
#include <fcntl.h>
/ _3 M9 k" @& ^+ p3 s9 l6 F$ j
/ T7 ?3 a* H$ C* i
#define SHAER_RAM_BASE_ADDR (0x80000000)
" }" w! M: z6 ^# ~& ~% X8 L
#define SHAER_RAM_SIZE (0x20000)
. o) h; d V5 D3 k7 g; ~. @ T
' K* W6 Z- J* z+ M* X
typedef struct
/ B% A. @, q) ]
{
3 A' |9 L0 Z/ W0 G
unsigned int a;
$ c' {8 L* S5 [* f% `
unsigned int b;
! O4 f$ u. t9 i) e. C+ N( Q
unsigned int packet_cout;
4 G9 L$ K8 u& Z) a6 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 b3 {7 ~. C/ b' B, ?5 |% n
, T1 _/ Z8 s" b3 q& y! B9 } y8 u
void read_MSG_buffer(int *baseaddr);
, \; k6 b) Q6 \% L3 Y
unsigned int count_copy = 0;
m5 ^) P% K1 _4 |
$ `& A- I% N+ Y4 \ c! e
int main()
; U2 Q) H0 W. `' J% z. O
{
- a. I% Z7 r8 r/ e: M" w3 s; I; p
int fd;
4 Z" z" i7 b- ^. N
int *mem = NULL;
- I7 _( C }6 P' |( p
+ c# M$ k7 N0 @
if((fd = open("/dev/mem", O_RDWR)) <0)
: K7 ?+ B$ X8 f
{
! U" \: L4 N- r( Q
perror("open error");
, v8 p" W1 a; p8 C0 [: ^
return -1;
p# Q& Z& P, q1 ^' A( ?; y- Q
}
6 i5 _; h, V/ ]* u/ S
+ s3 I% ]) F/ _' q: ]+ V8 J! T4 x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 B \# p% x3 t$ G* p# b4 ]
! g/ f. S! _3 t* a& K+ ~% l$ g
while(1)
8 L" R7 j% \+ D G0 m
{
4 W& J, ]) D2 ^9 L
read_MSG_buffer(mem);
& g# I, D1 R" L" w w
}
3 N5 k- c/ e3 w: y: y
}
6 _4 C y6 z# M. d' |
2 y0 I* O s( ?! E# A
void read_MSG_buffer(int *baseaddr)
: @- S7 E0 R2 H+ p/ w
{
' x# _1 C4 V( @9 C& J- b. |( B
pRX_MSG_PROTOCOL pshreRAM = NULL;
* N% F7 o" K2 a* O
9 i; R( ^0 q7 W0 ]/ w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# V1 k0 U$ w) }; O1 l+ i F* s5 k
I8 ] B9 d$ T- f" y' J
if(pshreRAM->packet_cout != count_copy)
. b) b1 U; h1 R! b
{
/ e' N7 _0 _9 Z/ L
printf("a is %d\n", pshreRAM->a);
& c1 |* `" j& w! k3 _$ B7 c! ~
printf("b is %d\n", pshreRAM->b);
/ O- n Y% o' p
printf("count is %d\n", pshreRAM->packet_cout);
4 q% _! ~4 y5 H0 P
count_copy = pshreRAM->packet_cout;
, `9 F) Q, g$ d
}
, `$ Q" \/ U0 L j0 f1 a! S9 Z2 O8 c
else
5 S( }( R2 e/ ~1 M* l% Q( L
{
; S! _: N2 u; |# E% [) ]0 A
printf("No effective message!\n");
u8 T: h, C8 ?
}
0 g* u# T: H: R0 S$ }- `1 I2 j! k
}
9 U2 `* }' p9 n- ]1 Q# ?% _4 t, v
6 X, {' M) h$ J: }3 v; U6 H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: ~9 i+ T5 U* D7 \3 z3 k" e% k) e
- a) r8 S( {1 @! B4 S+ X4 l
+ z7 x9 S3 P1 [
' }3 \$ W- p( d- {5 p2 A' _
, D& J& j0 F1 X) r1 o9 P- y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4