嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) ?1 z' A$ b% M. n7 j
]) { j+ |: p7 }+ g% R" {) G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
Q, I0 A' T5 C9 J9 f5 d, i- j
#include <unistd.h>
2 ]. f# z. t/ R0 @8 b
#include <sys/mman.h>
* R2 q2 ?9 q+ L. n
#include <sys/types.h>
+ @; Z, L/ L: e+ d7 r% b, o
#include <fcntl.h>
$ a$ P) l% I, B
! T) ^+ C; r0 t8 H3 X5 }
#define SHAER_RAM_BASE_ADDR (0x80000000)
" I- }! U" u* x, l$ V
0 y% H) |0 w4 \5 t8 D
typedef struct
2 w# R( ~* @+ F
{
$ Z: p0 a+ v, X9 J
unsigned int a;
# B* Y$ O: g# M% S1 u* R
unsigned int b;
4 C( e) w' o+ ]: }, R9 e
unsigned int packet_cout;
; A( {& V' \; c, r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& g: H0 _$ T4 `2 h
: _) R. d0 @. Q" |1 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 L. r9 n4 }$ C
unsigned int count_copy = 0;
- K4 k$ U3 l. U7 Q# C$ T0 F
3 b* v$ c( J# h- n. B9 d/ [8 [
( y' n) f* `; u
int main()
9 M) Q9 q u) ~/ J9 U( l
{
! s* G9 e; p, c, ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
. f) R$ T% m' h; {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
]) O7 C2 i, @6 S. @/ r" m+ E
: S8 F/ |1 [ J+ R/ Y( r
while(1)
8 k" z& S9 }0 M& I$ T" `
{
- N, E8 u/ A) J7 d. b
read_MSG_buffer(pshreRAM);
! }7 D- K8 R. ~2 N
}
+ @! r; U7 M' U
}
. t2 H7 i" }) G
9 A1 \+ V( D/ n7 F* @5 S+ Q4 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ j4 z3 A9 Y3 B$ @+ n2 L* h
{
+ u" x% {7 e0 n0 J8 {- \" `
RX_MSG_PROTOCOL buf;
9 g# k& y3 k+ I$ y% G
8 }5 D+ O6 j6 I5 n% |! j
buf.a = pshreRAM->a;
! G8 f0 j* P1 ^5 n7 B. p0 D& s! E
buf.b = pshreRAM->b;
) \' k3 a; |. m8 |; u
buf.packet_cout = pshreRAM->packet_cout;
5 D0 _+ P, Y* l& v1 `& h4 X
! | p3 V- |7 s; v( |! G5 D. ?+ W
if(buf.packet_cout != count_copy)
" _6 V0 N% t( n
{
: I) }8 ?. S1 Q: ^
printf("a is %d\n", buf.a);
" A: a3 U4 |' S- h( o, g. |
printf("b is %d\n", buf.b);
) G8 H& i% E! E
printf("count is %d\n", buf.packet_cout);
1 `; r* [( H' a% {$ }/ ]+ j) g
count_copy = buf.packet_cout;
: z0 ?; `" O; V# X
}
5 o) V( X- r: }( w( w
else
8 x5 P$ b2 u+ Y! ] u. u9 y$ `
{
/ t# j" _3 j' B
printf("No effective message!");
6 {( ^5 V2 U' j. x
}
/ D$ R9 P: z* {# L) t
}
+ W' k6 F( @+ p2 H; }/ \
3 p Z5 R4 U; x1 @" ^% t9 V2 i) z
* v' T5 k7 x: P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' r- m) S. x. }7 k
使用下面代码,对内存使用了mmap函数后:
4 q' C) C4 |; k3 c p6 n5 r5 |- c
#include <stdio.h>
' Z+ Z4 N# _ l5 [5 x
#include <unistd.h>
* j+ P% A, L* A$ q+ a% X
#include <sys/mman.h>
& H1 c9 S. W6 W r/ y$ [* y, d6 R
#include <sys/types.h>
6 q1 T* G2 V& \ S8 U
#include <fcntl.h>
8 [, @6 b6 W+ e2 p
! y" e+ S5 R9 P5 n* i: d+ }6 t) Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 W0 h2 r# l) ~8 W9 o( u2 E
#define SHAER_RAM_SIZE (0x20000)
9 {7 F% i( l- U( _: i& D
0 B$ o' Q3 F2 n( L" d
typedef struct
; p. {$ g9 B$ S1 |( R) m$ i2 l+ j
{
& K' N! G( C3 [: F3 Z9 R
unsigned int a;
( F$ j- ]1 R* ^8 ]
unsigned int b;
: l$ l# z! A" V& w
unsigned int packet_cout;
# f* G# t% Y, r' i- e" E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' D' m B7 x4 f; U& u: |# C5 a
1 B# |- \) R1 {
void read_MSG_buffer(int *baseaddr);
5 w1 ~% H$ y1 |; ]
unsigned int count_copy = 0;
6 F( N! l: f2 C5 V) M+ K
4 V- q0 A( J& c
int main()
& F. G- O% ?. \% L
{
) V7 w3 ^+ c3 h; N9 W) q
int fd;
7 ^: T g, u" i( O7 p
int *mem = NULL;
5 }1 F, k! m5 p) x
- v- V5 P5 s$ w8 ~! N; D( v' _
if((fd = open("/dev/mem", O_RDWR)) <0)
& `( H9 U) O% D8 K
{
& X8 q; V# q1 I2 e1 M5 C
perror("open error");
+ }8 S; q* G: X1 i
return -1;
" g! q/ e& k9 A( D4 w! v8 |
}
1 k+ q( U) V8 `1 C0 @
2 t Z4 x t# x6 ]3 H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# {- O6 n* t9 R9 {$ _& b, A) ?! Z
, R5 Z: ]5 @1 M- G! u
while(1)
' r9 W( Y% `! a( b. q
{
4 ]" {! [; K/ n5 v) r) m
read_MSG_buffer(mem);
( }/ m* W8 i5 _
}
) @* V T* h3 }+ J. j& R5 m W
}
7 m6 ?- h& y3 L$ V
( q6 o1 E: r8 a6 m
void read_MSG_buffer(int *baseaddr)
/ z( s* |! b' D1 B' {
{
5 E1 S5 H+ J+ U! D" v
pRX_MSG_PROTOCOL pshreRAM = NULL;
# p$ G8 i4 n$ I2 l" c* B$ V1 [; Y
) S+ E9 H5 C' {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 Z* I$ w/ A3 Z) D8 A
/ b5 U: X" O f. _% r& \# t2 S
if(pshreRAM->packet_cout != count_copy)
+ Y9 [# i1 @3 S m7 O! o
{
9 y- O& k' Y+ r6 _9 R9 j
printf("a is %d\n", pshreRAM->a);
3 }& _5 D! z- C. T& d" V
printf("b is %d\n", pshreRAM->b);
3 I) A) ?; D& [
printf("count is %d\n", pshreRAM->packet_cout);
* F& D; b# S5 v$ ~
count_copy = pshreRAM->packet_cout;
$ q6 W1 l: b; Z
}
$ f2 U7 `: ]6 k3 z/ z
else
) [. p) r% h. F: S
{
6 S- F" S6 P& Q
printf("No effective message!\n");
- N# U3 p( c/ Y0 R2 P: T9 G
}
4 w. `# F$ @- B9 b
}
1 ^/ m- T! E% \8 E8 w
0 I- U) W6 ~8 }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 \6 r, f" q# e7 z: u
- E2 H! o( u! m$ y, u
" q& Y+ A% Q# u, ^
2 [* n0 d, X* `- K# _5 R
( a# G+ G8 j6 M$ F# t) e6 }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4