嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* p) u+ Y; Z, X8 A
( V1 `# e! H; v1 B H* L' o- E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* D! v. `( E. g2 z3 I
#include <unistd.h>
1 ^5 f8 [% U% X3 t! }+ P7 j6 D( E
#include <sys/mman.h>
* A$ ~ m% L# B) T: L m9 n+ x1 T
#include <sys/types.h>
# S- b3 }# u0 \( |* n& y
#include <fcntl.h>
# O$ l! {7 T0 _; S2 V# E: a
* v" @/ I( f) J9 T1 v
#define SHAER_RAM_BASE_ADDR (0x80000000)
" a+ _6 \1 x5 {! z3 J# _
9 @9 w& z; D5 g/ N1 t: V
typedef struct
! P- x6 d- b) B
{
0 E' `5 e2 E+ T, L9 R9 g: D
unsigned int a;
( W7 ~4 k' z7 o4 s+ G* x X
unsigned int b;
7 G. @2 ?& i* D/ ~
unsigned int packet_cout;
8 @, W+ A! v9 ?5 c! V9 p- P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, W( D6 B3 y* ~5 ]' o) J
1 h7 W. x$ w, Q9 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, W" a a1 f. J
unsigned int count_copy = 0;
# S5 Y6 c1 I. N" A7 ?2 w
1 w: r8 T( L/ E
3 r2 U0 d3 D& |% V7 Z
int main()
1 l* g1 \% o; K
{
6 e: N3 V8 M3 w6 T
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 X4 A9 V& H$ q: _
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: l2 }: E- `1 W2 {: [5 D
3 y" ?3 Q4 G. h( |" @6 Q+ J3 f
while(1)
( U9 f$ `. @* u+ o
{
' A. T4 Y; p0 H W. \2 {) B
read_MSG_buffer(pshreRAM);
1 C0 l$ k+ r# g. D
}
' n3 b8 V6 R4 Y5 J, O
}
( a/ w7 y2 S% E5 `1 C" w6 e5 g/ M
( j7 N1 {+ W. A# J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 R9 Y2 t9 H/ l3 k1 T. a7 s
{
, r1 L7 |/ h( c+ d+ R* M
RX_MSG_PROTOCOL buf;
- s1 f* y$ j4 d8 R' s6 Z
* @2 {5 Z* ?3 r$ O$ G% |
buf.a = pshreRAM->a;
" V$ {1 }( s8 c& }+ I1 Z8 y. G
buf.b = pshreRAM->b;
$ }" }0 V3 q" F6 Y& B
buf.packet_cout = pshreRAM->packet_cout;
% B' C# |& p1 K: R2 n
# u9 m( B+ t8 S' x1 T
if(buf.packet_cout != count_copy)
$ S5 v0 J! y3 d% r* {2 y
{
% o0 w0 v1 T3 } O: F$ k( k# C' q8 g" N
printf("a is %d\n", buf.a);
7 f) _9 M' ?1 Q' d: S4 c0 v% @9 V$ f
printf("b is %d\n", buf.b);
$ L% H; y# P$ q1 Q( m
printf("count is %d\n", buf.packet_cout);
4 I6 ]- n- p: M
count_copy = buf.packet_cout;
! u2 N( ]0 b/ \3 r& f8 ?
}
2 p0 x* W* E7 m+ n/ y4 q% C0 {! O
else
5 h0 ^: D* H- M- Z3 R& Y( b& Q, X* d
{
- e H6 L; L6 V8 e7 L: E" y3 Z
printf("No effective message!");
: R: U4 q( h& J
}
6 w5 A, x% F0 f0 g3 O2 J
}
) ~5 P9 M: c$ A+ k9 }; @
) v% |# ~2 ]' S* T* n
7 w; O& O: P5 V5 L+ Q3 c- ~1 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ?7 K" _! |+ m
使用下面代码,对内存使用了mmap函数后:
# u. K' Q+ R+ v. f/ U
#include <stdio.h>
6 V D U1 H6 i% s8 `' p# e+ T
#include <unistd.h>
# s' { d. i/ k. h- u
#include <sys/mman.h>
2 J* S( b8 @! t, z/ X
#include <sys/types.h>
3 Q" J5 J# }6 d9 o% S; d
#include <fcntl.h>
( B- a1 l0 p% z2 K
9 F1 U6 K! V/ l, u( x6 z
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 D1 X3 I2 D8 |" I
#define SHAER_RAM_SIZE (0x20000)
# B4 m9 x7 b1 J" r3 r
& V+ N. G4 C" `! A8 f
typedef struct
1 \: s/ b& z" I! h+ o8 s/ d: V( v8 d
{
9 s3 n: k" m O% [& s/ L# d" V
unsigned int a;
$ X- X. Y- n& }# E) v$ H4 D1 x# V
unsigned int b;
4 w9 J1 Y# H( H, X& R
unsigned int packet_cout;
7 z% E7 @. ^5 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 U5 @' W6 q: o
& `: ?& I0 i2 u7 G- e: ~
void read_MSG_buffer(int *baseaddr);
0 d+ _/ T z$ d/ F
unsigned int count_copy = 0;
/ |+ X/ {% W) n2 N# S( ^
6 l5 H% G O( b1 e/ l2 h3 b
int main()
5 z; G/ ]' C7 t6 T* |6 z$ {
{
6 Q$ H$ ?) K* J/ s: Z5 h
int fd;
& L- a: ~ @ r# v1 D, k
int *mem = NULL;
5 C9 r: L+ l4 w3 F7 O& x4 x9 u
0 U% w* L/ M( }7 x6 r
if((fd = open("/dev/mem", O_RDWR)) <0)
/ E2 O8 |9 A1 J
{
7 \& S4 W6 L0 Z6 o! u
perror("open error");
0 X2 h) O8 q% u$ B0 M9 h2 |
return -1;
9 m8 K x* K9 B8 A" X3 M# K
}
( A2 |3 j& f& g9 c6 r
9 v, R. `: ~# F5 P8 d1 Z7 g0 n& B" T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 O7 \- S+ I. ^
8 P B' z% c6 L' G
while(1)
) m% f; D( T/ U: r; x( `. B t
{
$ F D: ~3 |* o1 Y
read_MSG_buffer(mem);
+ G, Y" y) V' p* d# G
}
& S) N; ^7 c' T% L% Z
}
2 H, m" f! y' c4 N& q' J
7 s& v9 ?% _9 E5 w% f. k
void read_MSG_buffer(int *baseaddr)
! Q9 k2 {$ @9 i. c" M5 _; y( a
{
5 o1 i m4 [ l) U6 O E
pRX_MSG_PROTOCOL pshreRAM = NULL;
' {. ^: ?5 ]8 e. e
* l1 k% \' u& C0 [3 G! l. H
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 n! F: z* D% L
/ X& B% @$ q" d, |7 U4 a: T$ I* X
if(pshreRAM->packet_cout != count_copy)
; r |7 Z1 q4 z. R) {/ H: J
{
0 ]9 ]7 e- `! Z
printf("a is %d\n", pshreRAM->a);
& K& d$ X3 C/ p5 \' {0 ]( D2 `
printf("b is %d\n", pshreRAM->b);
& y9 _. a& R) j/ ?7 h; A# e5 k
printf("count is %d\n", pshreRAM->packet_cout);
; l3 ^5 t. U0 h, k; ?6 e' I
count_copy = pshreRAM->packet_cout;
8 |3 T Z9 f5 x/ A% r8 t! T
}
) r9 m8 }0 w, G, E% t% z
else
7 m& R: A5 @( q9 X* Z
{
, \( K6 N4 c" b+ _
printf("No effective message!\n");
6 q( E3 R6 U6 Y) U Y9 T: B
}
5 g1 v; c4 P% y, P
}
% I* @# c2 x3 q* s: M* L0 ?
- E" [$ L% R% O$ G$ A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 `7 e$ t8 B# C- X7 d& C
$ q) b5 l* E9 r$ a
9 F) ?4 ^6 W* h
1 q6 J/ `$ p6 J: z; z
9 c1 L/ P. K: V
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4