嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 x# I& d" _/ F: x( T, z
$ f* F4 {( D. ~" v; B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; u) [4 Q, E8 X# g
#include <unistd.h>
( G6 D7 r1 i' s4 Q7 Z* B1 p
#include <sys/mman.h>
& t; r/ T! ?% L% y' Y* t
#include <sys/types.h>
- o, ]7 z; h ?) F
#include <fcntl.h>
% Y" O8 [% A9 U! m% y1 g
% U) a3 Z$ I0 k) F
#define SHAER_RAM_BASE_ADDR (0x80000000)
- f- M6 \) d8 P2 ~& t& ]' c, R
) Y( X! q( x1 O0 C1 r
typedef struct
% J3 z G) G3 [; t, X+ e! X
{
% f& a+ b4 w S6 ]
unsigned int a;
% I" x ^. f4 b }, O" k: X+ ]
unsigned int b;
! A' c$ j3 [- j: ?
unsigned int packet_cout;
* d( d& V; q6 W# ^, S8 m1 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; S. q6 M4 W) {. G4 P q$ ?4 Q0 G
$ {9 r" o& R) x. o2 R4 ^' r1 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ W; C% A1 R7 D- ?$ @% k
unsigned int count_copy = 0;
( ?7 @% L0 b# A/ U% F0 b5 R' p
; }5 p5 e6 }/ ~* |2 `! M
- ~- Y% y3 z* v( T! n* h
int main()
; m4 t: a5 C& O2 c! V3 c6 P( F0 }
{
5 ^( J6 i& x6 j6 k x7 q
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 {1 H4 u6 f# I( r0 k7 C' g- Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ n6 t& X" G- y' |' C9 q5 C
* K: c7 |3 b+ ?% k3 }* q
while(1)
$ P# R; |5 Q( d( S9 W( J
{
& ]% [/ A7 F. e7 K2 ^
read_MSG_buffer(pshreRAM);
/ w: T! ?1 M% B9 n' L& ~( A1 r
}
* b& o+ j, ^0 s8 t' x2 _
}
, v, D* k/ p+ y) @9 o5 J
# x3 ?4 X5 H' C/ m7 \$ }& t/ |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ c5 Q* n3 M# d- \
{
/ F3 l+ S0 F# h9 U! y8 w+ U
RX_MSG_PROTOCOL buf;
" ]; A9 \9 G1 r
/ E8 I! t7 v8 j+ @; }
buf.a = pshreRAM->a;
. w& p6 ~& o9 O, H% z5 @+ `1 C0 W; f
buf.b = pshreRAM->b;
- T$ Q0 d. E8 g3 w3 ^1 L
buf.packet_cout = pshreRAM->packet_cout;
+ y# A2 N2 z9 Q) U
) ~* E3 h) @3 Y* ? e
if(buf.packet_cout != count_copy)
3 y3 F+ x4 Y7 |
{
, u2 T8 l4 ?! E' h# E# U& t: U
printf("a is %d\n", buf.a);
$ S0 ~, ?2 U; j0 `/ l! m9 |
printf("b is %d\n", buf.b);
2 K. c" E% j& B2 R, A. ^: P
printf("count is %d\n", buf.packet_cout);
5 o" X# Q/ B$ V2 o3 q
count_copy = buf.packet_cout;
# ^) |% D) s3 A
}
B0 ]0 y3 _6 A+ D5 u9 S
else
9 I N' L! m! @+ x6 X2 a1 t5 M
{
9 A# e* \# [( M& W/ [
printf("No effective message!");
! U* {2 m" U0 |7 j/ g7 e
}
" ^/ F B$ M) J% g3 V9 _
}
0 K5 r5 B. k% _3 B$ O* l
3 Z m& h% f3 N% V* M
( Z) Y2 }8 M/ t; h7 M- Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& h# E+ ?/ l% R" Z) ~
使用下面代码,对内存使用了mmap函数后:
0 [0 W6 C' U: C I8 d; q |" y
#include <stdio.h>
! Y& y d% g" C$ K+ P) s7 ?- V
#include <unistd.h>
, V* M8 t1 T0 z. s; q: @
#include <sys/mman.h>
4 I5 A7 {, c) u' ^+ V
#include <sys/types.h>
& C! l5 a) \) ?* N, i3 |
#include <fcntl.h>
) Y4 @& l$ F! Z6 D
$ M% b" W6 Q" r% R U6 h' B( s
#define SHAER_RAM_BASE_ADDR (0x80000000)
( m* e/ t; s# d* k7 d
#define SHAER_RAM_SIZE (0x20000)
2 D5 {2 e' p! ?$ Y2 k$ R% n9 {
. b4 K$ Z0 s& R* r3 x# l
typedef struct
# ^* r+ D* |3 b3 R
{
1 m/ s3 N X, l. f/ B) s# _1 l
unsigned int a;
' N: y5 d v2 ]- v. n8 Y
unsigned int b;
# n2 ^7 T8 [' `9 z+ G- J, P
unsigned int packet_cout;
9 k' S7 [. {" T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! }" Y- l1 k+ } X! B
( Y+ r" F/ f# ^& [) F n1 v
void read_MSG_buffer(int *baseaddr);
; B# `2 @% }7 b5 p" S
unsigned int count_copy = 0;
: ~# L) c" W5 J, d+ q
- {* n7 ~( ]" W7 Y6 W. q0 @( z/ U
int main()
9 s2 `# }" W( ]. T8 d( [$ A/ t
{
$ e+ i, l D2 N
int fd;
4 ?5 J) S- w9 o$ @0 I( O
int *mem = NULL;
3 J4 M3 K5 }2 ~2 t
: h$ B' b+ P; J: u" S8 M6 E D
if((fd = open("/dev/mem", O_RDWR)) <0)
. E) r, O( ~1 x1 W* \9 h
{
0 G. t4 |+ v* H
perror("open error");
5 H C& O2 R5 ^/ I% w
return -1;
9 a% D5 U' I/ T0 r1 o. `9 Q( h
}
4 j) d8 i- s& U I1 ]0 I" N% U
* \4 l% t2 c ~% D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 e# q- n" x; M
# G1 g% b* c! b
while(1)
: s2 m$ U+ r* C
{
1 C3 _* e. Z: I* H0 t, `
read_MSG_buffer(mem);
7 O$ `- R: d9 W; L `! H
}
) M; }6 Z9 C- ?4 @8 _% C' }( j$ Y# N
}
5 z3 x, L7 x7 j0 l
! u/ C3 Z9 [: m/ S) O' N, c
void read_MSG_buffer(int *baseaddr)
1 K: W" V. R( O' F
{
' ~. ?; f. F" c
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ p$ G& l* I/ h1 B& E6 w' n
' C/ h. F/ _* {) s3 _' k) _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& U" H8 t" s/ v% B/ I! [
8 u( H0 M6 l5 M; }
if(pshreRAM->packet_cout != count_copy)
# i% u+ a9 A4 ~# b2 Q
{
( l- w: P% e* V9 G) W1 e
printf("a is %d\n", pshreRAM->a);
- [: L2 Q1 s# u& F3 m7 M
printf("b is %d\n", pshreRAM->b);
" @9 f5 A/ i, ]2 |- L; q$ H
printf("count is %d\n", pshreRAM->packet_cout);
3 l7 F/ Q# z3 J2 m3 k9 a
count_copy = pshreRAM->packet_cout;
+ g4 g# Y7 J/ i* {6 E+ w: Z4 O
}
! d: a5 M) w* `9 t1 m
else
; u3 o }' }7 D4 }
{
u: [) @( Z& F
printf("No effective message!\n");
* U. U/ v- |# M+ i
}
/ |2 C( E m: H! N3 Q& z
}
6 V% T* s+ f& l, @
/ z. h( d2 n" @( e4 R4 A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& e* F" S+ Z: u( W
$ Q, I( M% M( ]6 t( e$ x! P
l5 f/ b" x4 R) a! m% [, d0 Y
0 b: |" S/ M! c5 u% V, ]& t0 Z
: w1 T6 X' P" S
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4