嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 O+ m0 J/ s& ?3 u
3 B* |5 ~3 @$ S) [) L. X& F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 U* F, E: @1 m: O6 [% H' w, V
#include <unistd.h>
! V+ x) \4 b: ~& V( N
#include <sys/mman.h>
/ ?& {% I" I j+ T# h: r
#include <sys/types.h>
7 f/ u1 z; ?. W- M
#include <fcntl.h>
6 ]9 ?7 j d/ v
8 f# c2 e+ [' b' M; ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
. q6 v% @+ k; B
) r6 M: R- r1 ^3 v& s0 ] v4 Y
typedef struct
! R6 x9 B; T. n; A8 n
{
/ k4 h6 R- o5 T; \" O" ^
unsigned int a;
% S4 y$ r5 A# F: E( @
unsigned int b;
o/ O3 N# n8 H T# J. U
unsigned int packet_cout;
P$ }9 @4 t8 o8 P& Y/ a9 p) }/ o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 f: ?5 w, D9 t- L( ^+ U( {! w
# K+ k" o1 W7 L; y1 w4 w! u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 }7 M; P: S& ?# F9 s
unsigned int count_copy = 0;
. m' g* j2 ~$ j! h" j. j0 C
, p- W$ I2 h& h* J! q0 t* Q9 H* ]' J
7 F; {! C1 ?3 Y; M M; c/ ^
int main()
) J$ s2 S- c5 O! F( |- B6 z" R. u8 k
{
8 n# l, ~1 o* ]+ S ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
' F# w6 A8 s i9 `" |7 i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 p6 \' `+ O. f$ ?2 b( u/ q$ z# N# k
* u8 ]$ x* H0 \2 \8 j2 j
while(1)
6 A* D) j" d; X$ f8 s" m
{
# R4 v$ p5 U4 @
read_MSG_buffer(pshreRAM);
# Z# u8 M5 a$ g
}
. M* C: Z s5 n- S$ R9 @7 F" F
}
& f7 n7 t/ T& W$ d
1 i% K% V; G6 e0 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ e4 @, @5 Y% o, |9 V
{
, H2 L3 Q3 S) U2 V! K
RX_MSG_PROTOCOL buf;
6 n! e. G; a( G) b1 B
( w% z' a+ q$ M6 b% C
buf.a = pshreRAM->a;
. o6 _* ?: K0 I, T1 A. S
buf.b = pshreRAM->b;
3 d% D! f& a! Y) y2 m
buf.packet_cout = pshreRAM->packet_cout;
& f# _+ T' W8 w$ c/ e: X$ B0 [+ H
6 l O r$ D$ u; A6 A
if(buf.packet_cout != count_copy)
& l7 v3 [7 e* S' ^, ~4 h7 u
{
: }% d. u* B# |
printf("a is %d\n", buf.a);
4 O' M: m2 T! e( J% e5 H% _) Q/ U
printf("b is %d\n", buf.b);
3 [ Q" `& X9 S4 {. h" o3 A
printf("count is %d\n", buf.packet_cout);
, E1 B9 P( A9 ?( c( D( |$ T6 ~
count_copy = buf.packet_cout;
4 v) s- e- z# ~
}
1 i9 _ O. Z) D8 N4 {' L. D( J9 i
else
: K) O; m; J/ k
{
# l3 x1 [+ x7 B
printf("No effective message!");
. q+ \; P/ S3 I9 V+ s; Y: X: Y8 z
}
. ~: J t9 V- F: p
}
! l1 f; Q/ @0 d6 {# b" ~
5 c4 P. a% m3 w3 h' S. H
) R3 M4 C+ C% Q' b( z7 G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
^- B& T% q5 G8 u- T# A8 L! u4 N
使用下面代码,对内存使用了mmap函数后:
5 L. G5 k" G' i$ |& H
#include <stdio.h>
) g! N# g8 j6 P% o# H5 }& j# R+ ^" G
#include <unistd.h>
$ M; z! A* d% W$ Z8 P% N8 U
#include <sys/mman.h>
4 H) L4 e c4 p
#include <sys/types.h>
3 u* j, C& ]; N8 K7 b: G
#include <fcntl.h>
( \& P8 o1 J! w% `
9 [& _$ S" t2 r# Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
( F3 u( ^. Z" |9 B
#define SHAER_RAM_SIZE (0x20000)
5 M$ `3 k2 ~2 D; h; k2 l
) U; F0 K* @: u
typedef struct
! H7 d; f+ u V9 j! b% ^% E
{
2 A; ?4 S7 O8 t# l+ ]) C$ ]
unsigned int a;
$ [* R+ }- b" P/ o) F
unsigned int b;
% c9 m/ `, e6 ~( P: }8 C
unsigned int packet_cout;
8 T; k" r/ X3 d1 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! B' {# I3 @" z" n3 M" z$ x1 ~! M# g* S
# y+ Y4 Y7 M. I) H/ q8 `
void read_MSG_buffer(int *baseaddr);
6 [" m# [8 g H1 V. f5 l# Q$ ~
unsigned int count_copy = 0;
6 U% L- u3 v5 S( ^% C3 {
2 r: A4 v. k+ Q9 e
int main()
1 I; u/ F4 A4 u% j2 H
{
7 ^, Z q* }7 J+ ~ m# N: O; |; {
int fd;
( C! F4 U+ D6 @2 U/ x2 i5 H. a$ F, m
int *mem = NULL;
" t r! K S9 \7 M( X7 d# l. [
4 r/ X4 b" t$ g5 ]" B* }
if((fd = open("/dev/mem", O_RDWR)) <0)
9 h) d9 `" R8 z* i c( m
{
9 r) x0 R( Q. b# [4 }
perror("open error");
# z) Y. R9 j. X3 e6 `
return -1;
/ { D: n$ L* d3 d* ]4 |. ~ o
}
2 D* z) ?2 a; I! b
, N0 A/ O- {* {4 g6 v
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! I% I) _" u* |. p
9 z2 o f4 w/ c" m6 C3 o' m. a
while(1)
' U0 \5 o& z- v
{
# S' |2 D% U3 P* L6 ]' c& ?; W
read_MSG_buffer(mem);
1 I, Y" u1 Q, a; U0 _/ x
}
/ N- o- F0 _' Z9 E8 O1 |
}
6 y6 w8 G& ?' S' \$ L% q
% [) _3 d" g5 r" \7 M
void read_MSG_buffer(int *baseaddr)
: ?" v0 d- l2 k; m" ]' I8 V. T9 q
{
1 \/ S2 l: k* o" x
pRX_MSG_PROTOCOL pshreRAM = NULL;
- f; S4 t) X" g% y& s/ M& [1 [
3 S8 o) p2 ~7 m4 h: O9 y' T
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" ^* {/ T* \9 y! V; v9 {% S
/ c6 n5 @' E+ }% q
if(pshreRAM->packet_cout != count_copy)
6 r4 m3 ?) |' K# j8 w8 i
{
9 b. M; w4 W7 e) V- L( H
printf("a is %d\n", pshreRAM->a);
2 H- H' p8 S0 t5 Y+ v' y8 D
printf("b is %d\n", pshreRAM->b);
; e) W b2 ~/ f R9 C# I4 V& I
printf("count is %d\n", pshreRAM->packet_cout);
: W ~" F' v7 S! j
count_copy = pshreRAM->packet_cout;
: _! N; r* i: h% d7 D3 |
}
; s; j }/ l* y: @: X
else
. h0 u ]# n' q9 N' }6 |
{
- U, h0 S k) X7 ~* W7 {1 m
printf("No effective message!\n");
+ H" a S( M0 ~/ R9 h8 H$ _1 E6 Z
}
2 a1 ^5 U5 |- ]1 Z# @' g
}
: |$ R f7 L6 e
8 J" q0 E' |( b- }% a; _% [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 h+ |5 e0 ?6 Z! i6 e% e9 U0 `3 m, [
1 ~! M; _# Q# }9 k6 G. ?# R$ {( m
0 n0 g2 h/ o3 A, u
* n9 f1 G' }% M6 O) k8 y- ^
2 \; M6 `: {. @8 R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4