嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 a% L# Z U4 y% s8 e( h( W
( ~1 u9 ?) @' s0 b0 X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& Q; t/ v, }" u( P4 b |. H
#include <unistd.h>
9 A1 C! [# @ I$ |
#include <sys/mman.h>
& v3 B# G7 ]0 o0 Q' r8 }4 h
#include <sys/types.h>
0 t& p( X/ D, e; n
#include <fcntl.h>
3 I, z- X3 J9 ~
3 w. s3 J. d& j. Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 ~% _' j) O0 v5 x" D
2 h& }& F& e5 e, a2 b" _& E- q3 P
typedef struct
) s7 w1 k% k; m3 P+ d9 I
{
+ E+ f; O1 y$ Q8 U
unsigned int a;
0 ?) ?0 e B: }: s+ D
unsigned int b;
' d2 w0 H/ ~8 i
unsigned int packet_cout;
3 @3 t; X$ z( n; K, f( y! n) J0 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# m- Q6 X8 a' B; T8 O
/ f+ N3 J; O o$ G9 ~! ]8 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, Z: _1 n& Q" k7 Y. [
unsigned int count_copy = 0;
: t! \) N k' t% |3 \" r2 c" h
, \7 S$ R" L4 L
4 L8 k/ i: W: ?% `9 a8 ?. S5 H' s7 J$ E
int main()
! b# p* m/ M- b R& e
{
& u! {. u3 Z! `+ {0 q
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 t% p& h1 b$ r" n* x' s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ x& _- w t& E% p" E% V- [% o
+ F8 T" }- V/ n+ I' l1 h
while(1)
: S- l" [8 R. f' |8 J3 a
{
! U6 Y; N4 I# c; p5 n) w0 y
read_MSG_buffer(pshreRAM);
3 T! [! }0 m( h ?8 P: R" g5 r
}
- @* H7 O) ~6 S
}
+ ~1 u1 ^% c+ B# t, _$ W2 t
6 z; v. q2 X0 z. _& h+ J2 y& Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' N8 f- l) ~7 ^/ P$ I. p4 b. h: P$ `9 B
{
/ q5 S- p( r. P
RX_MSG_PROTOCOL buf;
4 K6 D6 U# D& v+ U j8 F& O/ u6 p
e7 t) l3 M. J8 s: t+ S$ N$ G9 X
buf.a = pshreRAM->a;
@3 D8 }7 w% c; {
buf.b = pshreRAM->b;
! \" M6 x4 l. P! _% k, d
buf.packet_cout = pshreRAM->packet_cout;
* T0 [8 }+ J% ]
6 h2 L2 m/ }3 ^1 u% z
if(buf.packet_cout != count_copy)
& G" P5 m5 c* Q* q; a# v. D
{
- p, J. f& b: U/ a8 h. u- d: C
printf("a is %d\n", buf.a);
3 I( b( u' \0 x, f9 i4 s
printf("b is %d\n", buf.b);
& [: E; k& Q7 [. I: l
printf("count is %d\n", buf.packet_cout);
0 r! \ ~3 U) m) {! |1 i1 _
count_copy = buf.packet_cout;
: K% j; \5 e4 f2 J
}
, O! ~8 i0 @$ H: R$ t5 }
else
, ^) ]9 @) u3 \" g
{
! j9 c b4 t$ P! F3 t
printf("No effective message!");
5 v0 C4 F9 @9 V& g* [& h
}
- M$ x/ L- @: a( W% D( V
}
8 X$ G, `5 g. z/ {1 B5 _4 H( E
' w6 J! j; Y, C, Z7 X0 j5 E2 r
# ]0 @; _) A* f1 ]9 `! O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 {% K+ z4 V* u6 Y; m9 M2 o
使用下面代码,对内存使用了mmap函数后:
3 O8 L7 q3 Y. Q+ }, P
#include <stdio.h>
) W* g9 Q2 r' {8 {( i# Y
#include <unistd.h>
- m1 S2 }1 E6 G' t
#include <sys/mman.h>
! S. [- Z- v" z) c
#include <sys/types.h>
+ S7 |( y# X& U
#include <fcntl.h>
$ l2 A! y' _+ V, I0 J# S; h
4 j3 O: H+ I+ g6 h3 x+ @
#define SHAER_RAM_BASE_ADDR (0x80000000)
" x( p7 g: F Z, N" G- R) E
#define SHAER_RAM_SIZE (0x20000)
. h9 Z( m, S8 d. S. P4 L4 [
1 O9 H- r# d, ], z9 |& w
typedef struct
! b j& _* w1 n/ F
{
9 t+ U. n( a q
unsigned int a;
% `7 c. L/ ~; J
unsigned int b;
% M" k( D8 m K" O: s1 m
unsigned int packet_cout;
g% i* E2 z1 h9 O: Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ Z; U" O( X6 v
' W; j8 A8 B6 d- V7 q; |+ z
void read_MSG_buffer(int *baseaddr);
% I; k* R2 |6 B' n
unsigned int count_copy = 0;
, E* _; {- Y2 l
9 o( W9 E5 a# x
int main()
7 {' @+ ^& j7 L) T9 I
{
. R' ]1 @' V" r; x7 K+ n7 N
int fd;
9 E5 `; W8 A) p, I
int *mem = NULL;
1 |9 L$ A" |5 G2 t" e1 U
; |/ ^ h6 d1 D
if((fd = open("/dev/mem", O_RDWR)) <0)
9 s5 P* v8 g$ U8 u/ r
{
! q. q y. O3 t, L. D# ]" Z w
perror("open error");
- d$ y2 f9 m2 d$ t ? q3 O
return -1;
. r2 }" c. L6 Y+ i- v
}
7 |! T, }% i7 b3 a( k
, s3 x" t& q4 [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. U' I4 a; O+ F: y
, K; t( i3 P/ k9 }; [* q8 D' t$ J- c
while(1)
$ d3 U" z! ^3 Q) Y- n! `
{
1 B" x4 S+ J! Z# L0 T
read_MSG_buffer(mem);
) X3 n' X! w3 b N, W v$ V W
}
6 L* J: }( _, \4 n' b* W; U8 k4 A5 M
}
G, o7 B& ^6 C" Z0 Q; S& J
) ?: U" r" D, F6 V! f4 ? |3 ?
void read_MSG_buffer(int *baseaddr)
7 s9 E! `$ h/ S# X+ Y
{
6 _6 J' v8 h/ G1 S7 z! I) T' P
pRX_MSG_PROTOCOL pshreRAM = NULL;
" B7 c! {% `" q+ e6 r/ c
$ \+ W( A+ {+ C& n2 {6 A, L0 J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, q) e- [1 Z8 M) @; P; `
$ {9 }$ S4 A; j" F/ n
if(pshreRAM->packet_cout != count_copy)
( N6 N1 B5 A; Q7 h
{
- A* }& s) a( w$ N3 U) C6 v
printf("a is %d\n", pshreRAM->a);
1 {6 D: ] D0 ^: i
printf("b is %d\n", pshreRAM->b);
/ Q9 H* S7 e r6 `
printf("count is %d\n", pshreRAM->packet_cout);
1 e7 { b4 w2 D: V5 d
count_copy = pshreRAM->packet_cout;
1 r- U4 ^2 ]# s3 a7 M6 F
}
7 V% S0 q8 _ r1 W+ d9 S
else
9 v3 B( L) P+ [9 F& Z
{
; ?1 T2 m+ m; k: i# f
printf("No effective message!\n");
. U. l! o0 r+ C! {; e
}
0 M5 Y8 C. q" |2 y/ l y3 U' U$ s: o+ T
}
9 x) d/ I( h6 P* o3 p( M3 D
s1 `* d2 X, H* B4 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
x/ }0 ?1 v6 a1 E
/ P: T; w% |) W: e
% {& T7 O, d& Q
$ v& T+ g4 E. i
( [( B1 r, ^7 w$ e! H' [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4