嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' q+ g3 N: f3 Y- @0 H$ J
) ~6 _ a* s, A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ f/ H0 V0 u' C, `4 Q
#include <unistd.h>
6 ]0 d W+ _: S# @
#include <sys/mman.h>
/ ^8 s; V( U7 \( X
#include <sys/types.h>
. o3 n6 ]. ^8 Y# J
#include <fcntl.h>
7 H m$ X& K0 {" s
, K M1 C1 Q- X) V0 B4 m
#define SHAER_RAM_BASE_ADDR (0x80000000)
! ?; E1 Q" a# N; K9 I0 G& ^
2 c2 ?5 M8 D& }
typedef struct
# u2 O1 W/ C5 L. N: h3 {) C3 o
{
) B& @5 _# J) I8 _/ U
unsigned int a;
/ q# R6 J& F8 ]8 z
unsigned int b;
$ W. |- ]3 b7 B! b/ Y8 v! w
unsigned int packet_cout;
* u9 [; R8 @% j3 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 `0 I- a; R' s- \
2 `9 ?% O/ q( q* z4 L0 _. p! e! U( a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 @' p0 j0 [& C- K0 J8 c
unsigned int count_copy = 0;
3 w4 }4 M, c6 U, i% E0 @, Q: T' n
6 X3 I( d# M" \& H4 N2 o! h9 V
' T& p4 e# l, h2 K, o
int main()
6 r' h5 f; O! B1 I/ Q7 v
{
+ o4 k" A5 [1 c$ n
pRX_MSG_PROTOCOL pshreRAM = NULL;
! A. r5 U, p: Q! d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 r+ Q. @5 V3 z9 [0 K" Q2 J& A% q
- S, l: b' |: F7 \/ Z
while(1)
$ p, o/ O$ s A; S, R3 ^
{
/ c: e; \; h. A( H1 f
read_MSG_buffer(pshreRAM);
$ B' i9 w; j$ T9 |1 v' h2 [
}
/ p- s @8 M9 I _0 X! m
}
, ?* P/ ^9 j6 v% R/ T& c9 z/ `
8 K+ B9 Q, V- ?) M7 ^3 ~4 C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 H/ M( A2 e t& `9 s! D, i
{
8 D2 A0 H& H( S
RX_MSG_PROTOCOL buf;
# \! i3 {4 U7 ^3 D( ~
: G4 z9 [& _" V' o
buf.a = pshreRAM->a;
5 O- g- N; _" K) p
buf.b = pshreRAM->b;
' Z4 G+ b$ ?# ~8 W
buf.packet_cout = pshreRAM->packet_cout;
7 _( C3 {" W1 u( m9 m6 ~
& X+ |+ t; V8 [% j& V
if(buf.packet_cout != count_copy)
0 T; j, n4 }% |! c
{
3 U5 @" \3 J" \7 _! ?
printf("a is %d\n", buf.a);
* z( c4 @) g" J0 Q2 f9 [* t: e
printf("b is %d\n", buf.b);
% S8 a, {+ o4 U' P! v7 E# u( Y
printf("count is %d\n", buf.packet_cout);
+ m+ V P6 S' P# `4 C( }8 q3 y
count_copy = buf.packet_cout;
% f' @1 o0 ?- i7 X
}
7 Z* y" J2 _1 s+ G4 n# }
else
. k, W* N* }8 o( g# I i* q
{
! l. B0 e2 r3 i: J( `' k' O9 o
printf("No effective message!");
; H5 H+ M' Q J/ y3 q" Y2 j& f7 d
}
9 Y" A, j8 P L D+ E8 j
}
7 d4 j/ C) y% G
% s2 E: _0 A) Y
2 x8 T# w' q) v8 N: N2 `% s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 P# G- l& i/ T7 Q- P
使用下面代码,对内存使用了mmap函数后:
4 c* V8 l. R& A6 A
#include <stdio.h>
6 b5 d. f- }' I
#include <unistd.h>
/ i6 p6 z2 E3 G$ K
#include <sys/mman.h>
* a: \) G9 F1 f$ y& T: Q1 d: K
#include <sys/types.h>
) c1 }4 ^- M9 C& |! e
#include <fcntl.h>
8 W1 I4 c1 N& L) w: g( l3 C
- X" ?9 ? q: u' D$ E8 n4 F3 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
# f& q$ l5 c( `, V
#define SHAER_RAM_SIZE (0x20000)
' w& n! `( ~* P, D3 ^. z) i+ @6 W
- |7 N$ _ j4 C6 j, n* Y
typedef struct
, `0 N( i1 d" w" @+ o
{
3 n) G. c2 K5 I. Q/ M' P( e
unsigned int a;
! X3 b7 ?; V, i$ { Y
unsigned int b;
% n& b' {* q0 C! ~' n' |7 X( T& E
unsigned int packet_cout;
1 Z. e8 K: F7 k, L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" |! A2 c, i) b* o7 c
% F* i _% y2 H: x$ B5 w% k
void read_MSG_buffer(int *baseaddr);
4 U2 l H; t% L; u! c
unsigned int count_copy = 0;
) Y0 O4 k/ g/ C7 u7 Z) q9 c6 R- D
1 `0 g4 B. t) G, d! P$ S* h% r( F8 K
int main()
5 b& ^ S. d8 N2 N8 I1 S
{
* p/ r( d c9 Q+ C
int fd;
( |- H0 l% p- p' v) i5 s: Q( U- K! a
int *mem = NULL;
+ Q2 q, t H; S5 O/ C
5 q9 R4 T P! J# }: G
if((fd = open("/dev/mem", O_RDWR)) <0)
# n- v1 f" O+ }8 \, y% k% e
{
2 _7 p7 H9 c( m6 u/ k2 J1 v
perror("open error");
7 q3 c8 j1 y4 I6 G$ j3 {
return -1;
& B% m2 i* p5 D
}
* F$ ^ [" m0 t1 d2 o
/ ?; b; D4 P2 O2 i& F
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
u( X6 Q/ y: N3 | Q6 U
+ g) O6 @: ~; r2 }
while(1)
0 a1 D2 d& [( s. d2 C$ i
{
1 u* y0 _. y/ I: [. E" n5 h
read_MSG_buffer(mem);
9 O( E2 U6 w# e" _
}
$ j/ |7 }3 e& X! j% g# W
}
( O+ k, F' u& j* M: W
+ H1 p: ~" H& \* n4 w! e; R! k. c
void read_MSG_buffer(int *baseaddr)
9 i7 q. }9 ^' L; ^
{
: Q' ?9 t P1 ` E7 d! G
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Q8 [9 `1 R* e: U% B* ]
, b* Z, q3 p, @) o+ ~5 W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 X6 A7 x2 g1 q' {
1 k6 ^8 T: L* x( S( c" l, r
if(pshreRAM->packet_cout != count_copy)
" ]+ }3 n$ O$ i5 B! @2 n! n
{
( w$ l8 }# X/ M& m( M$ q ]* b
printf("a is %d\n", pshreRAM->a);
! d- L; f% G9 `# r5 q4 r! O
printf("b is %d\n", pshreRAM->b);
: `) U8 h- O' d( H
printf("count is %d\n", pshreRAM->packet_cout);
9 L; L5 @4 d ?3 \7 ]- A" u
count_copy = pshreRAM->packet_cout;
- I7 @# e" y+ T) n: h" Q
}
) `) p( {8 v3 p S r# @5 i7 B
else
! f O$ M0 F% H1 {- E% M
{
: ~: R; q/ ]3 S; u( m2 W
printf("No effective message!\n");
, K i1 ]* Z6 a) }: K/ O/ H
}
8 E4 G6 o5 H. o0 H/ Z" Q
}
' ~' M0 w) }7 w" U
, [! Y( {" B1 @, c" N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! M+ A' K9 z0 ~& r) I4 M
: n2 Q q0 D5 [* A% N
$ M0 `* `- N0 p% {/ A. K; r5 q
' m* U0 w5 \4 F- V. S$ G
+ ]! C. Q. v" G( G' D6 Z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4