嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 M+ w0 ^) Z0 ]- `) h3 O4 G
4 e! o' Y ^& V; J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! P( h, ~( w- A: y; o
#include <unistd.h>
# d I6 \: N5 m5 E& D% E9 b* c
#include <sys/mman.h>
" y! d! c* O7 c2 i7 S( c
#include <sys/types.h>
- |& b% x: H0 ^5 S
#include <fcntl.h>
3 T+ Q6 ^' S3 z! n
+ j( o$ @4 v' H
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 r; k2 l4 }' X7 K' `
9 d. v# u) Q0 {
typedef struct
* t3 ~6 c! t. Y; S* g6 W
{
: ]3 v* s; w5 h- k" H1 |/ T) v* u
unsigned int a;
, s& I. @) \2 y9 x
unsigned int b;
" \8 w R& V1 f+ K
unsigned int packet_cout;
8 j* T, _, K! V" |0 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# J+ ~7 O" F# W, y/ g8 x1 m' H
/ v3 k/ o# }% c, i- g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' H) w1 i5 d2 x' h1 E6 P) ^5 C
unsigned int count_copy = 0;
( B1 f8 |. {( G+ K# V. d3 ~8 \( X
/ C5 c" o0 u' @$ C' r( m& R
/ P) t' V1 |: P7 i" }
int main()
* o7 a5 a C. s. A% r: I" Y
{
: U. B- C, E6 i. E9 F7 i* p: O
pRX_MSG_PROTOCOL pshreRAM = NULL;
. D; C( @) q5 H! |& E6 i2 p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 F1 H5 g& M1 a" g/ i
+ f- D- I/ d$ v( X
while(1)
- ^. o% J( H' f8 {5 Y7 F5 u( s, v
{
& {8 D& R4 `& Z9 o# z) W
read_MSG_buffer(pshreRAM);
5 q- H/ \1 P; S/ ?' I4 ^" N# ?; O
}
( @. Q4 M! f# p+ U
}
0 S. }# N9 I1 _" }4 [, v2 G
7 S/ ?8 }: G) e. j D; u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# W/ I5 Z0 d2 _: z c6 {% d2 \9 q
{
1 G0 u* _5 u+ m" L, a5 n
RX_MSG_PROTOCOL buf;
* F. z4 [. U9 n% Y8 w
! B# v. {" Y9 w, |; e+ q: l
buf.a = pshreRAM->a;
, j4 g* a6 I4 B; Q. F4 w% R) F
buf.b = pshreRAM->b;
1 q: g# y: Q( ?( k' ^
buf.packet_cout = pshreRAM->packet_cout;
2 _) @! o: s( |" ?1 T# v" u% r
, c* N' q$ j7 K$ C: L5 `! Y4 G
if(buf.packet_cout != count_copy)
1 J! H$ F% o) N q
{
! v$ l, x2 C7 B6 `, C) J( q9 j
printf("a is %d\n", buf.a);
) y/ l! Z5 D4 p+ i
printf("b is %d\n", buf.b);
& C; h. q1 [$ z+ b2 {, s8 `
printf("count is %d\n", buf.packet_cout);
/ r* j% Z; |9 @, l, K5 R6 D
count_copy = buf.packet_cout;
* t1 ~4 h8 i( A6 a" D* W) N; E
}
, z8 K/ ~: D- f6 n, Y4 I
else
. w+ f8 V5 @) G2 y8 z* V r- T
{
/ J9 U+ y5 C1 Q% t; y; I) t% u3 q
printf("No effective message!");
8 |* j4 }( s5 q; j- S* h
}
$ k& I5 C/ b v j/ G
}
7 B/ F5 n+ i/ s, @, w V8 Z& e
- Y! g2 P7 @ H5 E
5 P" z+ y: U1 ]% s% A; y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% j8 _. M, C2 ~( b8 `1 @7 o
使用下面代码,对内存使用了mmap函数后:
8 M1 ~4 _* ^7 |/ n+ A/ {4 M1 V
#include <stdio.h>
' }* ?) `1 {+ ]3 g* ^ u
#include <unistd.h>
! ^* w# w. S4 C/ J5 S
#include <sys/mman.h>
2 g6 [0 B& R: y
#include <sys/types.h>
+ H# Z( }% ^+ c4 s- M
#include <fcntl.h>
* @2 ?+ A+ V: b+ @/ ]! p1 S: s0 f
. N+ Q9 R, k; j8 M8 k
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 T. @1 p R( f9 i0 H$ m7 B
#define SHAER_RAM_SIZE (0x20000)
0 u( t3 t7 ?/ m1 J) o
& A) r9 p& P* E+ e* R e
typedef struct
a. b$ o, A; t/ `* ~& T9 Q) [! D5 H
{
; p' q8 t1 a- Y2 R
unsigned int a;
/ T& q) d: j$ f) a( W+ x3 M' X/ G6 F
unsigned int b;
) c) O0 d% j2 y1 y: P7 F! O( ]
unsigned int packet_cout;
' l3 r- T [7 b/ n; c4 q2 j8 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 S: c# E0 _- ~1 x' |/ x& ]
& [4 g# i8 |5 f9 l
void read_MSG_buffer(int *baseaddr);
, R2 o/ c- H, C9 \8 S7 ]) C
unsigned int count_copy = 0;
. C" }1 n4 Q7 }3 }5 q( o- r
; Z; [$ P3 }5 ^8 O$ @
int main()
( U& M8 r6 P/ ]* `4 A3 }& U
{
# {8 U+ z: d) `- K; N* J! ~8 K
int fd;
; k# o6 u' J: G+ S/ B/ y2 `
int *mem = NULL;
! R9 r, P/ t/ a ?* X5 r5 ]/ |
3 G4 I( D; P( L
if((fd = open("/dev/mem", O_RDWR)) <0)
0 ]& L# x' C. y0 L: R
{
6 z% K2 `/ Q5 G$ Q1 U- M# D$ q
perror("open error");
( R* R- T0 g# S/ [& l4 \+ K {
return -1;
+ X5 m0 [% a3 _$ v a
}
' o; b- R) u% I$ R/ v- I: G/ l
/ V _! o6 o/ d- Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
A7 l2 n! V& R* Q9 |) u
( I* t0 ]# U& A5 L+ a' {
while(1)
% _8 M N. n$ C; F# n, I: B/ b
{
$ G$ X5 W# h; G9 ~# S5 \; ?" y
read_MSG_buffer(mem);
4 ]; o; r7 z1 V+ r& D% t7 Z' |
}
: _- s( c) x5 u" U8 _& ]2 b7 G: k
}
5 E& D+ L3 ?5 Y7 o: d& }# t# g( _5 u
- \1 |# O% h; ^$ P/ f
void read_MSG_buffer(int *baseaddr)
5 t% ?2 s; g6 o
{
5 Z5 Z7 Z1 i, v
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 o. a* Y. S& n: Q G! I
/ H$ v! r$ R9 Q& d- A6 v) m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
J, ~" O1 `6 \
# [8 \% i, M2 B6 t
if(pshreRAM->packet_cout != count_copy)
/ l4 ~' b6 V F9 g) d1 G' N
{
6 F8 q2 u4 A8 Y1 Q
printf("a is %d\n", pshreRAM->a);
8 W5 n+ C$ T1 N8 z" E
printf("b is %d\n", pshreRAM->b);
2 P1 K0 E* V* K5 H
printf("count is %d\n", pshreRAM->packet_cout);
! Z. r- z1 S/ x/ z) Y& [9 V
count_copy = pshreRAM->packet_cout;
; R* h& W8 p" g
}
2 @0 {0 f _3 t5 E, _
else
- }; Q" j! j/ M
{
. }0 [8 Q* V" k2 j/ [; o% |0 }
printf("No effective message!\n");
" Y# F4 R9 H) t6 m' K& G0 X. I
}
" n9 K- K8 N* h: P
}
2 r% w$ m( p9 L: G/ a- ?2 \
$ I( b! S( P( [5 V) u9 `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
q2 f0 R! n9 ?. Z1 `7 m; h- S
/ a" I9 y. }: k0 R7 Q
' X' D b5 d; {6 S; M
% K( y n) r3 U0 |/ p
0 m6 z. c2 ~+ {7 r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4