嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 i9 K. X: g6 [4 Z
: W5 f6 Y w2 j, b% I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 j- f/ y5 l: Y& D. J) l
#include <unistd.h>
# b: A4 t, w1 q# V7 W3 `
#include <sys/mman.h>
9 ^ {: k, g$ i5 v5 X( R* R
#include <sys/types.h>
A/ e0 p: w1 \4 s6 r+ X) l/ C
#include <fcntl.h>
$ o3 @6 o" v* a+ ]
6 V8 i; ^3 ^' }* m/ y
#define SHAER_RAM_BASE_ADDR (0x80000000)
, {# y7 H- l' g/ g6 i6 u: ^% t/ P0 {
6 ?3 R$ [7 p) \
typedef struct
& _6 E% |: j$ @* Z
{
& g1 A& @6 C) P) H0 S$ K; Y
unsigned int a;
! A+ G- o5 J V7 _
unsigned int b;
1 D3 q4 ]" R# U( R- b
unsigned int packet_cout;
& C! }6 g* e) M. u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 j, e7 p$ W$ s' f/ B
& `+ V, \& n- ~( c! f& X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: ?% X: }. D1 @+ s; Q
unsigned int count_copy = 0;
/ c: Q; \/ h$ t
! a% T+ u& z; [
' l. p. v* Q7 l* {% F
int main()
V0 i" m |# _2 Y7 I
{
+ {% d" y2 R. }) k: `+ ^# ~! B
pRX_MSG_PROTOCOL pshreRAM = NULL;
* y4 S% D3 {* y- w4 X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ c, `1 L; P& i2 G
1 j0 X) q, P: C' B
while(1)
% ?9 w, b) u5 |7 D0 {
{
7 t k% Q! u& L; A
read_MSG_buffer(pshreRAM);
- X! \ c' @+ a! R7 i; q0 @
}
4 s* W5 g( @) X8 P) ^: Q# A
}
0 P6 w$ o2 c& v- V; H
9 K5 W* s1 h( L- p* D. c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) N _0 [- F5 [" i
{
* {# d% R7 K" h, }& ^/ E x
RX_MSG_PROTOCOL buf;
- }) p6 f5 G- k/ M) a( j
2 s+ Z& | H! p/ N: P2 N7 S
buf.a = pshreRAM->a;
. z% W6 Y" E. [( j, A7 G. |
buf.b = pshreRAM->b;
0 i& `" t% I1 U0 v9 l0 a I7 m
buf.packet_cout = pshreRAM->packet_cout;
4 X& Z: \: J! q. @. y
1 [; `: c: l. U8 Q; [7 g
if(buf.packet_cout != count_copy)
, ]" f) m9 \2 W
{
* F* c. @0 {/ v2 l
printf("a is %d\n", buf.a);
. l0 v$ q# Z& V* j7 r
printf("b is %d\n", buf.b);
) g3 P- I, m6 @5 Q' f( g/ L( G
printf("count is %d\n", buf.packet_cout);
* `3 Y" ^' L) P; u% u
count_copy = buf.packet_cout;
6 I; H. J! f# y% U- b* H( ?8 W3 r1 }4 J
}
, V3 b( S- h6 B1 C e% O
else
8 x% a" y1 o0 O+ c! v4 c
{
1 X& x+ v# j* _* w+ r0 f
printf("No effective message!");
' L, M& y+ O9 U. }
}
( F ]' o' h- ?( f& b4 K* B
}
, a/ Y! Q& {4 y( [- T( ~1 z! }
, v* D; w: ^+ Z# h
7 F7 x `" m3 E% O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 h6 t" K! G8 y) m
使用下面代码,对内存使用了mmap函数后:
6 d% z- s- p/ \ t. c* v5 @; K
#include <stdio.h>
" M1 f b5 g/ _
#include <unistd.h>
! X) y) n" R# ]7 K- B) \2 S2 b' |, K
#include <sys/mman.h>
, y% a U2 i& g
#include <sys/types.h>
5 @ y% m4 @' a3 H- J5 u3 W
#include <fcntl.h>
/ e8 T+ z6 o; |3 k! D' n6 ?- |
' s& K0 P H o
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 I3 ]% Y# v- O) o' }1 z3 v' e
#define SHAER_RAM_SIZE (0x20000)
" | c' d* W" \/ ?+ J, E: u
' y) I8 J6 f, u5 S5 k0 ^* ` y
typedef struct
9 [! n% k9 e0 D* [8 S% I7 t
{
: L$ t! Q8 ]" d v
unsigned int a;
R9 i& Y' m$ x8 l
unsigned int b;
) S# [% F2 D& o4 Q, {# G6 L
unsigned int packet_cout;
' Y1 s! P0 r9 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. O- c* n7 f$ W% X/ \; L/ w! s3 ?# \
, U; Y" z! {/ B) g! f# F
void read_MSG_buffer(int *baseaddr);
3 n$ K. U2 ^. O7 c' B
unsigned int count_copy = 0;
1 _2 ]. a) s- \5 w. G
' M4 t3 F4 O* [: r) q7 T" ^. T, a
int main()
) d3 a; D( w, t- }
{
& B% O( h4 }/ w, E) Q: B* g* L) @- |/ f
int fd;
- S2 c) J5 r3 u M
int *mem = NULL;
: P; z$ o$ b( Q& D1 x/ Y
' x8 X# Y: \1 u, j9 Y; l
if((fd = open("/dev/mem", O_RDWR)) <0)
6 Z) V7 x: R ]1 R( Y" ~4 w
{
; i# a' K1 h' i0 l3 d
perror("open error");
" F+ k; p+ v$ H
return -1;
0 ]5 [) `. C5 k; E9 b4 c& B
}
7 ^8 R' S9 E/ H# d7 d: a
# k8 k/ {+ y1 n* d8 A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
d4 S7 J) W4 _; }( Y6 ~9 H
* [) Z# {% g p. F% y! }. ^
while(1)
& _9 y5 W$ w( v( t
{
; |+ d% ?- t& V* e% R: W& M2 V
read_MSG_buffer(mem);
+ A: _3 d% _6 r# r$ C
}
7 y2 n- O* ]: O* @/ `' D+ q
}
Q O; o. C3 j9 a8 Q- y6 F
; k$ E5 v1 f) r6 K8 a9 I" O
void read_MSG_buffer(int *baseaddr)
% |+ h; r) ^) F: x0 F( B9 ]
{
: e# U. y* B' @* L" m
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ Q( f/ Y9 \# m, L$ B( u# X7 C
# ?! W' b' N% u7 F0 w" C, B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! r1 W3 ?' i, t* W
4 h$ Q! X8 K$ t# P
if(pshreRAM->packet_cout != count_copy)
1 Q' l9 _1 q* H0 {: N, x# |) |
{
& e+ z8 l4 p* C% n( R* \9 D9 n P$ ]
printf("a is %d\n", pshreRAM->a);
. z+ G* j/ j" `! e' `
printf("b is %d\n", pshreRAM->b);
$ Z& n' X$ Z; I
printf("count is %d\n", pshreRAM->packet_cout);
$ K* i9 U, l6 `# J1 F, j
count_copy = pshreRAM->packet_cout;
( X* i W; _6 c& E
}
+ S: e. m5 b3 p$ O8 i% I
else
4 }3 a) N1 S: y: V* I* |: e5 i( X
{
! a' K: O" A% f l! N) J9 W1 E
printf("No effective message!\n");
& E6 f3 i. Z& }7 u4 S& ~! l+ G0 e
}
0 a2 H* b1 Y; x
}
2 U$ |& ?8 G& V/ E+ F9 h6 i
. M6 O5 Y4 L, c# g7 D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" p- Y- q. W% M. G
, C' ?/ P' m! @3 }/ S
; ?. `, @- `0 U: D& A6 ^
! o9 k1 T9 B, v. M
' Y# W6 X/ f( a' ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4