嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 f% y2 ^2 U' K; p4 c7 V
* L }6 _# V. p, G: P' d# R* v4 z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' p! ]' Y, q! | L- I2 p$ P' N
#include <unistd.h>
& G& w; ?5 q% K5 y! g
#include <sys/mman.h>
S" r( W8 V0 A. a) W( ^3 V5 w+ k
#include <sys/types.h>
( ?% o# b; {" h$ V! p* p7 y
#include <fcntl.h>
3 C' r1 k4 ?/ {( s1 o
; A$ w6 b9 u6 W _; h% ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
* ]% S" v- p+ U$ j/ O1 x
2 `% R" o; |% y2 w8 y* t5 }7 F5 T
typedef struct
F6 M7 B8 H& L$ H$ f' V2 e" H& F
{
$ |8 L0 m _$ `
unsigned int a;
" V, l8 ~, ~2 h
unsigned int b;
+ [5 n6 R2 A! K/ {6 w
unsigned int packet_cout;
& D: c }- ^8 E0 @; Y2 \. e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 b/ m& N8 @# i. [6 D) {
/ a& _9 Y5 F0 D& ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 V$ R% b v/ y6 ?
unsigned int count_copy = 0;
6 w5 M" f7 f3 K' F ~) b) b2 N
1 u% J) v' e0 v- Z$ K" I
" N6 G% ]2 N: h% z+ P7 f0 t5 d; F
int main()
! V6 [' G8 r, a" b5 `# g0 @
{
6 Z4 A {( x( e4 K6 I
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 l: g" X+ F4 E3 B+ Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% J9 ^" _" Q2 k( p I" ~. D
% E+ G1 D6 \2 i( @6 S5 _
while(1)
0 h7 O8 s$ z" u, a
{
3 Y2 k- Y0 k$ [) ^2 N
read_MSG_buffer(pshreRAM);
0 [1 J/ E1 H; a
}
( ]6 R" v$ \1 b& |& K
}
+ l$ T& v8 ~# \
|# x" w' f% x. o W# c) X& s7 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ~ a1 }8 t. |+ X8 C
{
. D- p2 p7 a/ v# ~
RX_MSG_PROTOCOL buf;
2 T1 y0 Z- D$ Z1 `
* J. A% b9 g* o, w0 x8 Q" s: L- G
buf.a = pshreRAM->a;
: o" i3 T6 T# j) K
buf.b = pshreRAM->b;
1 ?! `3 j4 D* R" U6 d! q
buf.packet_cout = pshreRAM->packet_cout;
1 S+ Y5 l) I: L
5 g- V3 A* K0 g1 h" _5 {, ?- x
if(buf.packet_cout != count_copy)
7 U. z$ s' _' V- D% { i z
{
* J3 j5 z9 I a! z! H; V1 f
printf("a is %d\n", buf.a);
: T! k( s% k5 L7 E# d
printf("b is %d\n", buf.b);
, U' {5 y# l6 O6 R: R' d7 S- I, c
printf("count is %d\n", buf.packet_cout);
: P, u6 L7 L, b A
count_copy = buf.packet_cout;
* j3 J8 i" T! R( p6 x1 p
}
5 k* ]0 X/ Y# D" v G9 D; m
else
1 P: X' z2 U: ~/ h3 b e0 {
{
& T+ a- H- b; u7 O6 B
printf("No effective message!");
: L5 Y5 }. a% p" w3 B
}
9 R% y* D; ?% M
}
# A. g5 L7 i! {1 w
( j5 n0 d4 R4 \' u4 n" ]8 Q
! |# @) T* e( e8 }; w1 k2 @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 e# u+ Y" j3 r( z6 ]
使用下面代码,对内存使用了mmap函数后:
: L6 T& O2 G4 Q
#include <stdio.h>
1 ~' w$ e( l. g- v$ ?
#include <unistd.h>
1 L7 a1 s( U6 t% ^! h' T) O
#include <sys/mman.h>
: I9 e6 H" Y! G- U
#include <sys/types.h>
5 `* ?, ^+ r, [! J3 N
#include <fcntl.h>
# d8 j: z9 G7 k$ G, y
2 Z, w. l: e# e
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 l w2 Q/ h3 i9 M8 `7 I: q
#define SHAER_RAM_SIZE (0x20000)
- i: o ~+ I r# [) x2 b8 G
0 A! u6 n8 F! j \
typedef struct
I8 R6 f$ m' t4 A' E) c" D
{
$ ^+ f" p/ p" ?5 e) ^" j
unsigned int a;
% |, }) K% @4 H+ Y' a) g3 ~/ ]
unsigned int b;
) p2 S8 f1 l, a" i
unsigned int packet_cout;
# J7 L0 _" P3 U7 X D. j% \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; ]! n) K: u# L9 q! T8 M: O$ c; I
% a3 K7 x9 x4 Y. O
void read_MSG_buffer(int *baseaddr);
3 R/ v2 C) g2 j, E
unsigned int count_copy = 0;
" ?6 G( n& `# P/ h4 T
: ]) s2 l4 ^: g5 S
int main()
" t( @% I7 f' ?
{
) q W: Y7 M" w- H9 \
int fd;
8 h5 w9 ~0 |. ?: A
int *mem = NULL;
. Z( J+ a# b" F
+ f+ u# [! a3 T
if((fd = open("/dev/mem", O_RDWR)) <0)
: E8 i- ]4 `, |# d( @$ \# _- t
{
: l* W! O7 ^: q
perror("open error");
! }% d9 N6 x8 r h' f W, @4 p
return -1;
$ c/ F5 z1 }( n# M$ n" E! Z
}
) T' r: I+ u" } f( C
0 z! y v. x# e- v( S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 g. f9 G2 ?( _/ `) Y
+ s/ k3 i; x6 J9 u8 Q. ^
while(1)
5 O) {1 Z- E+ ^/ R. A O
{
. Z7 _) n) `2 T( Z( k9 h, F$ t- a
read_MSG_buffer(mem);
3 W: i$ Q: G) X* T1 n7 a: A
}
) k4 s" `1 V' J; I! h
}
$ n, h( O( j! r P# i. Z" h
}0 _+ @/ P/ R: m- e! q/ d8 P
void read_MSG_buffer(int *baseaddr)
" P8 Y9 w2 P. C
{
: F! z; t$ K- r- e6 T/ u
pRX_MSG_PROTOCOL pshreRAM = NULL;
# x& m5 x5 o+ Y6 ?9 I
3 i) M$ `8 u4 G6 ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 \3 B$ k# v0 M$ l
0 S4 K7 ^( q4 O6 o' V2 ^# {
if(pshreRAM->packet_cout != count_copy)
2 }! c+ \$ a s1 @5 V
{
( \3 z0 }: m( F9 s9 Z
printf("a is %d\n", pshreRAM->a);
1 }, h6 Z( L8 S2 D
printf("b is %d\n", pshreRAM->b);
; G+ `8 i! g1 J9 G3 R' b
printf("count is %d\n", pshreRAM->packet_cout);
; W$ P |" ~+ D. S( I4 S" T
count_copy = pshreRAM->packet_cout;
+ i4 Y1 P1 U% Q
}
/ H* I& i% p5 W9 f9 w0 i- l/ n
else
1 k8 I- G$ R* F! K8 r, Y
{
/ V/ T X' ~2 N8 w, l9 ?* A
printf("No effective message!\n");
; Z7 s9 L. ?. s. h9 n
}
" F: U; ?* L+ h/ F
}
3 e- E: [) r+ d3 D' N& C8 g
$ p9 |" i8 r5 _: F+ }8 x) j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& z+ N5 ]- c( W* @! \4 s0 k6 r' ?
, Y0 n7 [1 g$ ?
4 u h0 c9 m' K+ v" F' j' o5 p
9 } M: u1 B% v7 D% y; X4 k* p
+ m& k1 d, V% W# X/ M
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4