嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 R5 U" ^8 p: g% a/ |
0 F9 F! _- ?, z/ d; j1 T" M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 S t- W |' I% n( u
#include <unistd.h>
* e& @- s$ d9 m H+ S4 p
#include <sys/mman.h>
0 E4 `' C* d+ S5 P, q9 \5 F1 W
#include <sys/types.h>
: V" u& a7 P% X& D* i1 R0 S
#include <fcntl.h>
4 `- q" G! m( M& `
- j2 _# G/ \- o
#define SHAER_RAM_BASE_ADDR (0x80000000)
% D, _; v; Z/ F9 x
1 g( ]! v3 h0 [& r3 }
typedef struct
* m. l4 y" k# Y5 b
{
- R' z7 H9 Y8 M$ ]0 O; e6 H8 n
unsigned int a;
; b8 j2 I" W& K' N. Y! S) c
unsigned int b;
, P* I1 F3 e+ C7 I
unsigned int packet_cout;
- k2 |) r9 m( B' A8 S7 }" R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. \& z# x+ ]( P8 K; J
s; z7 A* `) u8 t& Z, }: t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& Z7 W* F o- H6 r4 Z8 J0 j# N
unsigned int count_copy = 0;
& k; J7 C/ n& `( ~
! o/ h" @% ~4 ]4 W8 y+ g
e6 r7 x8 c8 H( [, R- _9 E
int main()
L& Z* f- O6 k: W2 s% @& h: I) I
{
3 u. u1 u0 q; | W. R2 t- V. q
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 T/ R; J' u2 B' t: I
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ G9 X* H# [. u6 j7 ~5 ^
0 M. M l/ S) H) e) X
while(1)
% S& p/ Z2 E% v$ F" F/ c
{
! R# C. D% \5 b2 X8 Y7 h
read_MSG_buffer(pshreRAM);
- h! R1 F- h* r
}
* C8 [( |; U5 { v5 \8 D
}
( S/ Y0 h# A3 x- q3 K
) A2 U$ c q% ~2 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
Z( `- f: v" [0 l/ S% Z0 Y2 k
{
# ]6 r3 I% [, R9 s5 R8 O; Z
RX_MSG_PROTOCOL buf;
9 u9 u8 W- }0 Y" `0 B
: `+ O1 \5 v2 A% }: z' }' Q
buf.a = pshreRAM->a;
7 v" T( X% `* u$ r# j4 W; w, V' k
buf.b = pshreRAM->b;
+ q5 Y: q2 X8 b/ A
buf.packet_cout = pshreRAM->packet_cout;
; G# [8 V b+ a: b
, b/ O# j8 A4 h
if(buf.packet_cout != count_copy)
8 C* B! k& O) i7 ^6 w6 D
{
+ t$ ~/ _/ N2 B# N6 {0 {
printf("a is %d\n", buf.a);
: F8 h4 @0 C1 G& G9 p$ z2 I
printf("b is %d\n", buf.b);
9 f: P- P% O+ [$ A2 B1 G7 P
printf("count is %d\n", buf.packet_cout);
- k4 r" w: |1 F# ?* T& G( a% ]9 ^
count_copy = buf.packet_cout;
6 I/ O& h: r, v
}
# P! i9 D1 Z$ G6 h
else
' s% ?8 p: v* }3 y! G& h4 i) V
{
: X+ V5 N* a' c' u+ Y3 M
printf("No effective message!");
5 O" D2 @9 c, j- ^5 @+ r
}
7 F5 `& V) S* H4 p7 O8 a- R2 O- k2 f
}
0 F9 T! [, @9 b, L% E# E3 g& z# I
& ], c9 [* T/ S! Y1 i7 i4 g3 i
+ t: Z' i, Y! B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 j( ?" v7 f" j4 s: j! f
使用下面代码,对内存使用了mmap函数后:
2 R! ?- h8 u. {% q7 m+ e9 b( N
#include <stdio.h>
2 q! P% V- T- R5 R' G
#include <unistd.h>
8 n8 d9 \( A) o6 Z7 d
#include <sys/mman.h>
/ w% g& u8 l. S! i! w! B" i
#include <sys/types.h>
8 k s% i1 A' R: s) p% `
#include <fcntl.h>
* H, N1 j- ?$ P; z
) \2 l8 d! N" Z8 B0 s
#define SHAER_RAM_BASE_ADDR (0x80000000)
- P0 N1 d% X. T: h$ I9 \$ N( R
#define SHAER_RAM_SIZE (0x20000)
: Z E1 U3 q# v% l+ B' L+ K9 h
3 n; \5 x0 z' E& f4 }+ B
typedef struct
7 ^: s ~/ N+ @3 q
{
) d: k4 n0 H7 u1 K
unsigned int a;
6 w% C6 w1 p+ f$ e: g1 G' |7 J- w
unsigned int b;
' ], V2 r" i- q; G
unsigned int packet_cout;
6 Y3 K6 D; r6 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 ?; ]) r. n& Z$ \1 g2 ~
2 ]% G) c: I# l8 @' D
void read_MSG_buffer(int *baseaddr);
3 M, w# T" A5 {
unsigned int count_copy = 0;
0 `& I" b) x n, o# P
7 G; G; y( Q' b2 }" Z
int main()
# V: d( t; E3 p+ @& q q
{
! U w( X4 `3 l9 D- B& U4 |5 l
int fd;
3 o* l: \$ x' O! `% O' g+ a
int *mem = NULL;
# V( u' r! B% g. O: a
9 c# B4 V' n' f( X/ W+ }
if((fd = open("/dev/mem", O_RDWR)) <0)
' G% B/ X# d9 N2 X( r+ E3 _
{
6 ^% _/ D' J, q5 W* B5 S
perror("open error");
0 P% v1 D4 z8 I
return -1;
% T5 g, P* b: h2 t( P
}
0 x1 N7 Y+ C- g8 K* r" z8 C: }' Z
# d& K2 q" I! d5 _! K$ K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( X9 K9 _9 s# W
- G+ U" Q; N' S) B( I1 M/ Y0 c
while(1)
9 j/ b1 c: h3 J( l3 G# X0 B
{
]4 i! J" z$ d2 p" o% t- D
read_MSG_buffer(mem);
) u& S. d- o9 g `
}
7 o! d+ ]' H5 U( f
}
' e4 X' E6 t7 s5 E4 L
1 [" A7 j. K* q& S
void read_MSG_buffer(int *baseaddr)
. Y! p6 t' q$ E: g# Z
{
: ^' Y2 m! ]( m$ v; ^5 T) Q! M
pRX_MSG_PROTOCOL pshreRAM = NULL;
) r* _# ^# J0 c: o
' U! Q, C* e. v- _: d2 F; p/ W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# s9 r# i! G r4 ?$ T M
0 z$ |, P- D3 r w+ w
if(pshreRAM->packet_cout != count_copy)
. y" Y; [* m; J$ w3 W& G) A/ L
{
' S5 ]' r# K# f( b4 a6 Z. H" G9 `0 l/ z
printf("a is %d\n", pshreRAM->a);
4 A6 j; G2 p9 D# \& S" d& E1 N Z2 a
printf("b is %d\n", pshreRAM->b);
4 ^+ o/ ^5 Z0 {
printf("count is %d\n", pshreRAM->packet_cout);
, E7 M( T- H$ {: z; S, k
count_copy = pshreRAM->packet_cout;
0 v1 ]' {+ J( Z+ V% A R; ?+ v
}
6 d& Y" Z& D7 l/ o
else
+ }4 b# U9 U# X4 e' [ S; o* v
{
, u6 C( W) x% G" Z+ D" H F J( x8 y
printf("No effective message!\n");
5 R& s$ r# y' ~: r
}
: t4 S4 ~2 B# r$ H$ O2 B" u
}
1 H) w4 A" N& I1 [' U& w
6 l3 c" i1 C6 L& B+ f( t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 B; [- O* V" y7 E9 G0 P
, R$ ]7 x% m" M
6 Z/ G3 N1 `: `, k( E$ [$ ~: ?# n" d
+ ^) D8 m" e$ |, S7 V2 H) X
/ J+ u$ C! v: v& y+ \
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4