嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! ], D3 E- v% i+ ]
+ z: y" o- u# ] S* m
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 _3 P J) e" M" _' P
#include <unistd.h>
+ J1 @9 d, b4 B+ u2 p4 `
#include <sys/mman.h>
" h3 t5 A: o# c7 M/ g+ N
#include <sys/types.h>
* y& _( A9 S7 Q
#include <fcntl.h>
, g, S3 ~: F# j0 n5 a( ?
2 r/ A+ ?# ^1 E
#define SHAER_RAM_BASE_ADDR (0x80000000)
) c/ x/ P7 y( v- H+ E7 l' X
- h0 }! J& u. |+ I
typedef struct
- o. A. j) s _9 y1 ]) j/ L5 u
{
( k; H) W! A/ _7 ~+ S" o2 a
unsigned int a;
0 _! E% y, ^' J0 ]+ X8 |, u8 U
unsigned int b;
* A# w" j$ G+ I( ~0 _
unsigned int packet_cout;
9 B- V: l/ P+ j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 D% P4 P$ I% s% Z! v
A! c1 q% }- z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 H, h7 y$ x- P- V. O2 m% q3 D0 H% U
unsigned int count_copy = 0;
- j: o3 U# N: p6 @+ U
4 i. M/ H. O& u! W6 S
: l5 H8 o5 n" A0 ^
int main()
- {0 P6 H/ _. E$ o/ ]& T; f
{
# i& E1 [4 q& z. B" J
pRX_MSG_PROTOCOL pshreRAM = NULL;
# E& F2 B- |8 c$ E* g/ z8 G
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ Z+ k" s" k9 b" w" D5 w5 z
6 E* I; v+ N L' y7 Z& C3 b' {- ~
while(1)
4 P0 V% c" Z- ]$ l5 H( w
{
$ i* |/ w! r4 l. f& u7 d+ W( _
read_MSG_buffer(pshreRAM);
) t8 x4 o( G: l
}
! J2 H; T3 @! i) x
}
$ e) I! e& W) b$ d; [6 \( ^8 I
" }4 K& N+ U. @- ^/ `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; T" g) o$ X6 v" {6 \) L( @1 s
{
. W, u, Z0 k# h A
RX_MSG_PROTOCOL buf;
8 e5 y( x5 n7 d, _# K
1 r7 c* ?9 Q. S8 Z3 ]* U- k
buf.a = pshreRAM->a;
3 r/ f$ ]1 c% @1 Y9 t7 V
buf.b = pshreRAM->b;
# d3 ?0 k1 x* w- Z K4 H6 T8 U
buf.packet_cout = pshreRAM->packet_cout;
8 U# J% d/ B8 d3 E. T4 J
) c. r4 C/ E7 K0 Y9 ]
if(buf.packet_cout != count_copy)
$ d9 X0 r* B# u& b+ u
{
" p0 y( G; z( j# G; ?0 [* g- I
printf("a is %d\n", buf.a);
$ g \/ m4 A' W$ m, n. X2 k7 O. I! N
printf("b is %d\n", buf.b);
- t: c1 n+ D+ F0 V8 t. t* A
printf("count is %d\n", buf.packet_cout);
& v+ s2 L2 B4 j. S6 z, N7 x5 D
count_copy = buf.packet_cout;
( u8 Q& k0 r. C j
}
* @/ W0 l: }$ T" Y/ ^) [
else
* `) F9 }0 ?2 F/ I+ ^% _" g7 {
{
" h! i: p/ j# @3 H+ |4 p
printf("No effective message!");
( J; y% A. s$ m$ { @2 d# l5 U
}
) [4 J" H3 G J% S& ]; Z
}
4 X" P, |5 [/ r" N
5 R% V: ?" l9 V, W, s. @5 [
0 P) k" y" ^4 `1 `7 E, s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( ^7 d) w( l. Q0 ?6 z; e' q: ^
使用下面代码,对内存使用了mmap函数后:
* w' P% m; `3 n& x- K
#include <stdio.h>
4 n' U6 N6 C, T5 s5 D6 H7 M7 t
#include <unistd.h>
: z0 k) q1 N$ U7 \4 b' _
#include <sys/mman.h>
; n1 u, T$ C3 [3 g8 R
#include <sys/types.h>
( Y: C# }7 V1 o$ [9 C. H* t
#include <fcntl.h>
$ B8 M/ e/ v% |
! ?/ m0 s% o) K$ T0 k
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ J6 [. ~( u5 c1 {* S, k
#define SHAER_RAM_SIZE (0x20000)
$ Q/ p2 r" L" `( y" |
& C" C6 w: B7 M
typedef struct
4 ?1 ]. l0 Q! l, H4 A; R: x; e
{
/ n; f) G" \2 g+ I5 p* R
unsigned int a;
) j# H4 S8 v# u5 {
unsigned int b;
) O* u% |3 p. _7 D' k5 d
unsigned int packet_cout;
% C* T$ A# t% A7 i- y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 y7 f X. o# E7 q3 G; s
. |$ V. [. I' Y: s2 e2 [5 ~
void read_MSG_buffer(int *baseaddr);
# H* T4 E% a: t4 N' d! v1 a
unsigned int count_copy = 0;
5 Q+ p. w5 g% J* h7 F4 ?
1 h; J. K. y! ]$ A j6 t* w# T( Y# ]
int main()
+ y9 ?! I; R# m5 x- ~3 k
{
0 x) I, I7 E, [2 A
int fd;
# L' u: z3 }/ u t- P
int *mem = NULL;
5 R) r, E. l7 K7 a
: m# u U( m3 D/ ^4 I: I1 z
if((fd = open("/dev/mem", O_RDWR)) <0)
, b; u ]; `5 m/ T/ @ s5 W
{
- [+ D& R2 s5 r3 M0 Q; ]
perror("open error");
, s: |9 ~$ k! `# L: R. T
return -1;
! l' z$ u# k$ _4 X- x
}
$ f5 P0 A& y8 L4 {
. {# ?6 x1 B. u2 i3 ^+ t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! K3 N; X2 h* ^% u
# O0 a0 o, D5 V
while(1)
$ z- M2 L* c& p
{
! q. u6 W& B+ r. S$ j' k" _. @
read_MSG_buffer(mem);
' ?6 z( ? T2 d. J& O2 r' T. R
}
, `, p# v+ w3 k" p7 ^, I
}
% B, D! ~* S- l. m. K# g
0 d3 q' s2 O5 S7 v6 t" b
void read_MSG_buffer(int *baseaddr)
' F9 p# d5 c( S1 d/ {, Y; I* W& A* I) Z
{
0 V" z) m1 }- z" Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ S; a2 f8 j3 c6 j9 k
' O3 K; ?! f: S1 G J2 N
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 m U/ p5 D" c* Z& {8 L
+ I; ]: s: P8 H/ J5 H
if(pshreRAM->packet_cout != count_copy)
& }& \* A- H' m+ a0 r# j: B
{
; e8 c* Z" c* W$ D o$ w
printf("a is %d\n", pshreRAM->a);
4 ~: G9 _3 {% @) C) Q3 Y. g
printf("b is %d\n", pshreRAM->b);
3 z' x) m, d5 A* p) r& t
printf("count is %d\n", pshreRAM->packet_cout);
) V, p5 A" `6 _* z
count_copy = pshreRAM->packet_cout;
! r6 M: y7 r- I3 e- C5 B
}
1 N" y8 ?# V* n# U
else
! V& S. A* T/ e7 L
{
2 `; e/ R1 ]" s; t g
printf("No effective message!\n");
/ ^) H/ L& X! n/ c* j5 ]9 E! Y
}
' S; D4 V- N2 G" g9 T. o
}
3 K0 y4 e$ T0 D- Z2 U" K' f) M
0 y" H6 n0 {8 d* b' Q# R- H" o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 s* [" x _8 A
+ `5 a. R1 S3 C3 ~$ O* L9 ?
! S4 Z2 F* T2 C: s1 @- B; E
' f/ u2 z$ A) [! f5 A; Q# N+ V0 d
/ k0 [7 m4 ~: L, W8 a# I5 h+ ~
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4