嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 a6 a: j j0 a% y; @& Y
9 V: i, q [0 O* d6 x6 A- C: h1 s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 @0 e; n; P9 F
#include <unistd.h>
( ?4 G, L3 t: q2 S
#include <sys/mman.h>
2 ~. T( o) E ]* @7 t- F1 R( k1 u2 p
#include <sys/types.h>
, `4 W; o$ Z# \6 b
#include <fcntl.h>
1 ?9 }0 a$ R% l4 e2 Z; V0 [; G
! W A9 t; H; u2 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
* W7 I7 {% G! X7 j+ Z4 w7 O
% X1 K% R/ a# q, R4 P3 p
typedef struct
+ i. k6 n& H5 M% Q# Q8 B
{
X$ a! I; d# i/ }+ [! Z
unsigned int a;
( ]* D% q2 q; V# ?. }. y
unsigned int b;
- ~; P+ y$ C( x. _9 v
unsigned int packet_cout;
/ w. d; l* I7 S% W7 _4 e& Y! l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ N% j5 s! M" o4 C; x6 V% D$ K
9 x5 W# e! m. M2 m4 P3 Y0 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( p. v9 G2 O9 a6 u
unsigned int count_copy = 0;
- ^: F. `; {5 x/ v$ U
9 V7 C3 u$ I( n; e
5 | w, `5 Q9 Z$ ~
int main()
4 {3 ~1 i3 v9 b. G( L
{
2 {1 d( D4 h$ h$ w$ I. {
pRX_MSG_PROTOCOL pshreRAM = NULL;
: `+ i5 R: M2 i' c# O, p( T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ g6 n# p- [, e m! ?) s
' l% J4 D' {' I7 H$ S7 p/ E t
while(1)
7 R/ p& S2 U& @5 u8 x
{
6 _. F" K! f/ w/ ]
read_MSG_buffer(pshreRAM);
4 O# i8 G& E0 s/ y8 Y4 `
}
- U0 Y5 F |% m, J V
}
9 R6 H! S8 r$ m2 D6 m# n
/ I. {9 _' n4 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 |% {) ~ M( Y/ z; _
{
; k4 d5 y. s- C" f( u
RX_MSG_PROTOCOL buf;
" f9 {+ q5 c W0 V
; y& n8 d6 U+ L7 _& [
buf.a = pshreRAM->a;
$ ]0 _0 _% C9 R7 S+ K( r9 Z
buf.b = pshreRAM->b;
2 S" v% n; ~4 k' q6 a
buf.packet_cout = pshreRAM->packet_cout;
! o, V# a( J9 D# f6 d
2 v8 [- Y1 M' n, x1 f
if(buf.packet_cout != count_copy)
$ f, }. o- A$ M8 o1 Z0 P
{
8 \. y( r2 j9 ~/ v/ v9 X
printf("a is %d\n", buf.a);
% ?) r4 d7 E9 u# i/ {1 d
printf("b is %d\n", buf.b);
3 x& p9 Q0 G. g9 }7 ~' ~
printf("count is %d\n", buf.packet_cout);
! z; j T& D% _' b0 h9 O3 M
count_copy = buf.packet_cout;
! p J, N$ _+ @. a+ D$ O
}
2 `) e+ H. S! V! L# B7 _
else
2 K; [0 `# {: J& g
{
" X5 a T1 O" Q3 `1 S% P! M% Q, p
printf("No effective message!");
/ o4 g7 I' n$ I+ o
}
, k- r4 N3 C9 T0 R$ p# _
}
' }& X+ P# V$ h/ L& d2 _
! ?8 S* t8 N. y. V% r G6 V
3 E; \$ k+ @9 X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 O. ~, a" E$ z' w5 ]% B
使用下面代码,对内存使用了mmap函数后:
$ _* D1 b$ ] @. q- r# G
#include <stdio.h>
# V$ o1 @3 Q" v- P, s
#include <unistd.h>
- w6 c" a+ B& O& G |: w8 l4 k2 s
#include <sys/mman.h>
/ g) P/ p/ a' p5 F* x; E1 T7 }
#include <sys/types.h>
$ A8 J, U8 l# k/ U9 r8 w4 C2 R! q
#include <fcntl.h>
2 y- Q N. `* f) n
! @' g4 N6 z/ A3 f' d
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 K* ]9 o; d P' a
#define SHAER_RAM_SIZE (0x20000)
# ^0 U: q* e. r' e
4 v( g n, ~$ g8 \
typedef struct
3 E- J4 o: ~9 d1 }6 d
{
$ M4 z: H9 P+ L8 J+ L
unsigned int a;
+ s6 i; b8 ]8 z4 r. w0 i5 G
unsigned int b;
2 O7 b3 f1 U. d3 O1 }
unsigned int packet_cout;
, i9 F: H+ s# e( @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' M0 H) @5 j& k3 ]
* a7 _: {, |( ?& ^
void read_MSG_buffer(int *baseaddr);
) Y u' r+ G7 E1 Y" v
unsigned int count_copy = 0;
& c! `' |4 d) K" ~( Z9 @+ @/ H
) Z2 u+ F3 |6 n( d- R( w$ H3 g
int main()
5 s% b `* u% c% s6 v7 v
{
- k$ q: I( } J: I& h) ?- m0 {! Y% `
int fd;
, E/ `1 m) Z. p5 `. i
int *mem = NULL;
4 g: u) Y, q+ ]+ d3 e8 _
' C$ n6 M3 H L; _
if((fd = open("/dev/mem", O_RDWR)) <0)
& C! Y1 x& g" f: g
{
* r. O- A. n4 J. @& e+ C
perror("open error");
$ D& A- t% r5 b) q
return -1;
% f4 @5 g4 }- j* f' l
}
/ S# ^' ?6 _& b* o, j Q2 U9 |
, ^8 K; t* G$ c; s+ m1 U4 c9 L% ~
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: E- T0 X" \0 h: \
8 I- S( @5 T7 r% G) w
while(1)
: D6 U) v+ [& d: w0 ^; c9 h
{
- k& T# T# A7 j+ ] M/ N
read_MSG_buffer(mem);
7 K/ t. M* H, Q
}
9 ^. ~# M$ M+ g9 W2 l
}
& y5 c, @7 c" j, \
# f5 S5 q' N: v! a! H# i0 L
void read_MSG_buffer(int *baseaddr)
/ w. O8 I( j( m. k
{
# S+ } W( r! O. Y, z! K6 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 [# k, s7 z; R# b3 \
8 P0 B2 v. G3 I6 z2 J! G5 i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 F! S. A; b) l. z
5 r" u9 T3 T8 P4 [
if(pshreRAM->packet_cout != count_copy)
0 ?) S+ e% |+ T- {4 q9 l) ?
{
9 Q' s U' D5 ?: ^7 Q: d
printf("a is %d\n", pshreRAM->a);
! \. b% r. B, N8 i1 d0 C( f
printf("b is %d\n", pshreRAM->b);
! A$ R M* ?' w H" W+ D& r
printf("count is %d\n", pshreRAM->packet_cout);
! X8 p8 S: r7 \% n. p
count_copy = pshreRAM->packet_cout;
7 K& u* |$ e: X$ P: c0 |
}
- P; c6 g( ^% g/ A; ~
else
1 s/ O5 S4 j; U" g( t7 Y
{
. J5 ~/ |" R6 |
printf("No effective message!\n");
5 K6 l! ~; l/ S/ _- [) G' ^% @
}
; |- C; }8 f' l+ {' a: ?& Q. M
}
/ m: u' I% U& f
' D. I0 j4 p# T A' w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& n Q- H# B0 ?4 t& p: A4 Y) V
$ ^0 @8 L1 O. M6 C/ H. ]
7 J- I8 B/ e v6 B1 B) H
7 ? k* h% M4 v6 M; I
7 t% i- y& E; o+ @
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4