嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) h+ ]6 t4 l+ o8 r* {. m: @
3 Y; e7 B% T' T# M3 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 b$ U8 Q; Y* ?0 J3 P( G
#include <unistd.h>
% a: e6 C! L8 _, x) o8 @6 v
#include <sys/mman.h>
" C, C5 S8 |3 T: r5 [0 o' E4 N( c
#include <sys/types.h>
$ c8 `+ ^6 X0 k9 M9 {! a- _" c
#include <fcntl.h>
! A- r5 p+ S, ]1 s4 y- M& a
% m7 `* w$ Z5 a Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
C# O. h8 a. Q& U
: P1 I/ r B3 v: ]4 [0 x/ |
typedef struct
# t" [5 }7 J* W$ Q
{
- Q0 k6 ?( k( m! @6 n
unsigned int a;
& |% C/ C: u8 Y- Q1 d# |) R9 ^8 T5 n
unsigned int b;
6 C: {( c: D- r$ z$ @
unsigned int packet_cout;
4 L$ |0 o# o0 Z+ {3 D/ ?. D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ?3 N8 q: U: M& G
& o/ p+ u# p' G5 @, r* z3 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# y1 l7 Z5 }! V( V+ h- A
unsigned int count_copy = 0;
u- E9 N4 e: U: @$ A
0 @: L: `% b. m l% u9 e. l
2 D" D; E) m$ Y, q0 d
int main()
2 P) \4 t& ?9 w% k
{
2 I0 D4 V, i" ^4 T8 j% I3 `/ u
pRX_MSG_PROTOCOL pshreRAM = NULL;
% x( {4 a6 [6 z" D( C" |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# i* Q5 L+ r1 c7 \5 F
) O! P9 ] V! f% E. n
while(1)
6 W( `" E4 h0 k* O
{
$ G% b/ O p6 z. I) N7 v2 m
read_MSG_buffer(pshreRAM);
& L l t ?+ Q1 T0 E, A# c
}
( \2 s* c q: o. f G2 x6 O
}
$ S* W; k& @* N) x5 o* R0 `' m
2 ?8 ?# h+ A$ W6 r+ i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ O" t2 H" p: F8 k2 B' z/ X
{
4 | r8 _6 u5 ^ B) c
RX_MSG_PROTOCOL buf;
6 E. o* x' ^* W" Y
& U: D- ]0 Y0 A$ W; x |/ N, i9 f
buf.a = pshreRAM->a;
4 H# C1 R" _0 e1 v% Y& S1 U* p
buf.b = pshreRAM->b;
; y% t" j, k, K0 s3 W0 W5 ]
buf.packet_cout = pshreRAM->packet_cout;
1 p. c+ j& H& A# O. }1 r# Y
1 Y8 i; T( m/ ]$ `3 u2 d
if(buf.packet_cout != count_copy)
9 c. h8 ?( d7 w7 c J
{
( P, l8 h2 P8 d% h% C+ ~. l6 W
printf("a is %d\n", buf.a);
\- M' }% D2 A x& i2 E
printf("b is %d\n", buf.b);
% D6 E* m1 x' V$ r1 _# A
printf("count is %d\n", buf.packet_cout);
4 ]$ S" Y& d7 D# z
count_copy = buf.packet_cout;
/ o' n B A/ u+ Q. \: a7 b% s: K
}
" t* i; P5 d% Y \, V5 y: v) G
else
* U& t+ [' R6 O3 X) J" J
{
b5 v& \6 ^5 {" F! I: [
printf("No effective message!");
+ N' E/ O* S) Q5 w
}
6 C+ e2 B% T. V6 O' L9 ^: v
}
" G7 O, h4 u* }3 E7 Z$ i7 |4 b
`9 U: q! E- _6 {/ R! y. X0 {
/ h" m+ G, I# y7 U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% C7 a( G* s% @3 n$ _) u; n
使用下面代码,对内存使用了mmap函数后:
6 n8 e( X- A- ~: T* ?
#include <stdio.h>
8 b4 }) R+ M5 N
#include <unistd.h>
# A- _) u% q6 u5 ?1 K4 r2 s
#include <sys/mman.h>
8 F$ I1 r3 h2 ]! v7 f
#include <sys/types.h>
h' [ {! |, l
#include <fcntl.h>
3 J$ j# }" f" ] ~; Z. s
& h6 J9 _6 [* E8 d) M( y
#define SHAER_RAM_BASE_ADDR (0x80000000)
, m; Q' i9 }) V% v
#define SHAER_RAM_SIZE (0x20000)
" L6 M' ?+ O) q% L2 D. \7 @
6 V% g2 p4 V3 v+ c' ?
typedef struct
2 [, S V% h n5 ]0 m P) F
{
% y8 X: `/ l' S v9 _! n$ v8 B
unsigned int a;
0 M0 z5 _; m& o* [) ~
unsigned int b;
' e. T' M8 {0 r! I+ R( M
unsigned int packet_cout;
3 t) G' M8 l, l, ~! H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! p/ M& i, O" Q' L
% [ n, e" D% s% w" ?$ L. O
void read_MSG_buffer(int *baseaddr);
! d& S0 o- w% v) [. ?2 e. Q
unsigned int count_copy = 0;
& ~$ s$ x9 d8 U5 l# v9 u5 A
7 I% X) {& J! P7 \8 [7 D% X
int main()
% a. `7 @$ Y& m! i* b
{
; R6 n0 m; n; I% v9 C2 }. b1 |
int fd;
7 I6 L0 L: c* l
int *mem = NULL;
A1 F6 R6 x$ j
1 f9 C9 S6 r" t1 d
if((fd = open("/dev/mem", O_RDWR)) <0)
1 u U7 D4 K* b* b& S `6 ~
{
. o, ^: o2 X$ l5 H& k/ a
perror("open error");
& W% w3 E1 E+ ^+ D; z v
return -1;
& o+ r8 {$ Y9 n6 C$ C! {8 D
}
7 L/ k( p! A1 T. C( C: V
$ x7 Y2 e: n2 X4 r- }( c0 Q9 X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 n2 ^- s/ [- j6 I
# n B, e. F9 v
while(1)
& n" M \) s, ^, o" \7 P
{
( {' `: U0 k% a5 A0 w& P6 G# X
read_MSG_buffer(mem);
# [ y8 r( x( A+ h, s, C
}
5 I: ~$ ~+ O/ F. [* G
}
) @% g8 C9 s8 `- O
+ C0 X. [0 b$ I2 X# R6 x
void read_MSG_buffer(int *baseaddr)
8 z+ o5 Q1 x4 M( x: j+ Q
{
/ Y, O6 {" O6 I& P/ h9 A t5 ?
pRX_MSG_PROTOCOL pshreRAM = NULL;
( W. D; t, ~& V0 `' D
0 v4 `0 [$ Z& d' P8 N( Y# |3 b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 [$ l, G- e# Q; O& Z
! i* E8 p+ k2 Q+ m5 V
if(pshreRAM->packet_cout != count_copy)
) m1 Q1 U& X( D5 q% H
{
" z' @& W: H! O k4 B( c0 q9 ~5 t
printf("a is %d\n", pshreRAM->a);
# P6 ^2 v. `9 ] j$ _; F
printf("b is %d\n", pshreRAM->b);
) c8 u' _" A: {; Q7 \
printf("count is %d\n", pshreRAM->packet_cout);
7 u, f3 W# j& n2 N) v- h- e
count_copy = pshreRAM->packet_cout;
/ Z& ?, {( Y0 N2 A6 E; e* \6 L" [
}
- d5 m3 R: F7 c& n" B: N }
else
+ T) t$ j4 Y7 h# o! n; b0 z
{
" ^6 i; P F7 N& K2 z9 V/ ]; n0 ^
printf("No effective message!\n");
" T% O( v# J% K+ O$ i
}
. p: w. X) c$ C5 ^1 x
}
5 g/ @$ L" G; ^# j' E
# W. Q5 |% e. T: V4 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) i4 ~2 q& l( p/ C! m- F% W- ?& F
6 |/ Y% H, n; M- `% U1 N; b: }
+ f% f2 |/ w; {6 I
M# C( o. o( R: k v- O
1 Q7 ~$ x9 I. f* H7 k& P; ?0 h: }7 i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4