嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 E; p+ _5 N( a& ]3 p3 y8 W
4 w9 \5 {) @+ y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" N. i* D# I0 L7 L6 E4 |8 {: ^
#include <unistd.h>
1 @3 Y1 w' s- r' D' ^: N
#include <sys/mman.h>
1 p$ c0 U# f$ W5 {- U
#include <sys/types.h>
& ~8 y0 _4 B4 g- G2 L
#include <fcntl.h>
5 _. [4 O6 P( D6 r9 Q$ ^0 i
s; ^8 v4 X- q- D8 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
; P$ Z% T( c2 A9 H5 m( X5 d
$ o) x7 r# i ?* V X2 ]/ X( i
typedef struct
2 C3 b; _& E0 C* ?3 P6 S9 l
{
/ g7 [8 R0 K9 [( g, K
unsigned int a;
* q/ c5 Q* }! G
unsigned int b;
! h) U' {5 M2 n2 n2 J
unsigned int packet_cout;
/ t" X( Q) j" L) V9 h- ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" ~3 s- D1 I) L! I
: D* [3 w; {- l- m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ m3 O1 d3 g. f3 |; c: Z
unsigned int count_copy = 0;
; A3 |; Q7 I: d: w/ r$ e0 z
) u R( M/ X1 ?! D8 Y+ L6 S
; @* j$ {$ s4 M4 z1 Z, ?
int main()
6 C& @8 {+ f- _ i: T) ~( F9 c
{
0 M( U$ [$ `# w/ }$ S+ r
pRX_MSG_PROTOCOL pshreRAM = NULL;
( V+ U* u+ b# y$ D$ U. y$ @
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 C7 z9 ^8 e. d6 J R2 M
' R# b6 m! B0 u# v& \4 h
while(1)
1 T- T/ z# Q" }% A
{
J' ?" _4 F U" l' {8 A0 M8 G4 s" ]
read_MSG_buffer(pshreRAM);
3 l* Y& W1 \5 h$ X2 J# ]' I
}
7 p3 U6 K/ A: X
}
: q# Z9 q" M. ?8 @' s5 V% F
$ e* p' ^1 f5 N' g) o' q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, `: a( G" a7 R# D* [7 n
{
* l* p. n. W0 T' N2 j
RX_MSG_PROTOCOL buf;
5 J# N6 n' i7 ?
# F& x) l. u" i7 t9 d: Y
buf.a = pshreRAM->a;
( R7 Z, G% C$ L
buf.b = pshreRAM->b;
7 L+ p' Q8 x1 ` E. u
buf.packet_cout = pshreRAM->packet_cout;
" h( g/ B# b5 \* g7 J6 ^
# ~6 s/ k+ C- ]/ `! @0 c3 N
if(buf.packet_cout != count_copy)
7 w n4 q3 E/ S' f; l9 O( ]
{
6 D5 ^% [" l9 Y" J
printf("a is %d\n", buf.a);
- [; H/ `' k% ^) v
printf("b is %d\n", buf.b);
: r! I, e+ v. O& H' q1 u2 ?' Y
printf("count is %d\n", buf.packet_cout);
" K( e' Z( D9 x1 J" h4 u# V
count_copy = buf.packet_cout;
) H& D3 U6 }/ B1 c& d5 o
}
) m' \ h& T! W, T; ?
else
, o! ]$ }) M5 W1 s+ k
{
5 T, w/ V3 r( s. b
printf("No effective message!");
4 ?& d: s+ @0 j" P1 I
}
. r: ~6 a& w# n* r
}
) P' V: [3 K* W ~- @! R
0 x3 y k% l2 ]- e- ]$ V' M: A7 f
; i% L9 L; A& d4 C2 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! e$ R, J+ O8 u7 X% f/ G
使用下面代码,对内存使用了mmap函数后:
7 t+ q! k. m: \$ E& Z4 R
#include <stdio.h>
u+ T: _) t# Y- z9 y" m- ~
#include <unistd.h>
1 i2 [" K3 w# ]) [7 T1 N2 y
#include <sys/mman.h>
9 w; ?( O' A) K4 P' ~+ ~, Z
#include <sys/types.h>
6 U" Z8 j. }/ _0 B" H
#include <fcntl.h>
9 E, z& S" m2 K( }9 H0 ]) d: o% q9 t
4 @4 N: Z- \7 ^ c0 f! X8 G) i& T
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 r4 H4 c$ X. U- L
#define SHAER_RAM_SIZE (0x20000)
4 O/ g0 y) ?" M% D1 E5 T
5 {# _) M- @3 M1 P6 F- Z2 `2 H0 ~7 S' n
typedef struct
- H; x/ I: i e
{
7 R: V9 ~; `) G% |9 a' V9 t
unsigned int a;
- G% H# D! y* a7 o7 J
unsigned int b;
% b3 r B' E4 u% r @
unsigned int packet_cout;
7 O7 j' S2 t& n5 G! I! D+ T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; h5 y+ K) A7 t; \1 B
; x! A) F8 }- s1 N: E* j6 O
void read_MSG_buffer(int *baseaddr);
9 ?! I' ?( `# c5 Q% S' u6 ?/ U
unsigned int count_copy = 0;
% a' X- x8 m0 X) U( W3 L
& u$ J2 G9 `8 I" E+ v' h& r
int main()
4 g$ X) \& X/ z9 q- K# ?; K6 I
{
: ^* C3 ?( h$ _7 c
int fd;
9 p+ i( ], |; O' {+ Q t8 x
int *mem = NULL;
, F+ ^/ u2 R* P K1 i: e
6 I h) ?% @& J# q
if((fd = open("/dev/mem", O_RDWR)) <0)
/ `+ ?: Z* U. C$ N
{
6 p, P6 m- j- d1 l8 l
perror("open error");
) B8 N# ?1 x: J& \5 [+ p
return -1;
" I" o8 T& S4 h: v' [( S
}
4 W* f+ o& m9 `4 L1 b0 P0 }; ?
( n4 T1 R' x. J. i* m9 G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 K& e8 d3 W3 M# z
. s, Q- @5 z' f
while(1)
" x1 ?$ W8 b8 V0 h6 |8 w4 X
{
0 B9 @, r8 j! E) Y: ]" ~7 y9 p* ?% \
read_MSG_buffer(mem);
+ b. `# x# ?* M
}
; m% Q! ]' [0 s) N; M# u& S# D" B
}
! a3 W, V" L/ }" K, U$ p1 }
% s+ ]8 m1 R6 N" R+ W
void read_MSG_buffer(int *baseaddr)
. ]2 y# o+ p# ?# Q- z3 g" J
{
: J; Z& C4 W$ E# v
pRX_MSG_PROTOCOL pshreRAM = NULL;
, m. Q1 n7 t1 g! R
' w5 p, {) E" C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 r1 y- C2 p6 |! \: ^, [. b5 _. J
; B, ?# E! I3 _; q
if(pshreRAM->packet_cout != count_copy)
$ H; i; Q: u+ o( J9 |
{
) b8 d. [& D0 [% \
printf("a is %d\n", pshreRAM->a);
0 V; G9 O6 ^; q9 h
printf("b is %d\n", pshreRAM->b);
# ?0 L" \! G( p# R
printf("count is %d\n", pshreRAM->packet_cout);
. `/ M8 P# Y( [5 |0 }* W
count_copy = pshreRAM->packet_cout;
' a- z4 u0 l- d$ Z0 E
}
& b% r1 F, D" Q! m
else
- R8 n* _5 y- b# q+ L
{
2 U/ h3 M1 ^ ~1 H1 F- t: C: w: N Z' ?8 s
printf("No effective message!\n");
; u' l) E4 t7 B* @2 b& {& v: |2 y
}
& \: O, G3 Q& @* ]
}
+ R; a w) w* U; _4 D9 k
; {+ M% ^8 H: Q" N) ?5 O+ ~0 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 |4 D( U3 C* g. L6 N7 A2 |& r
) ]! M/ b: _5 Z+ t8 l3 K
+ D3 t/ o3 \4 H2 K2 d
& o% |& e* r) _, t1 e9 B+ I
# C+ P: J7 f0 a1 z7 w
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4