嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ l7 r6 e6 ^$ G1 h) z* |% C
( w; y2 x. g, B1 }) O2 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* |* u% R* u7 z
#include <unistd.h>
" i a7 A8 ]: W+ i" E% E9 t! s
#include <sys/mman.h>
, C8 V+ h3 @/ G1 o
#include <sys/types.h>
+ I- T8 f# s! J# Z, ^0 l# }6 ~% a
#include <fcntl.h>
" @ S& t1 q+ e: z1 p6 w8 ]# z2 U
+ @# N. H- k$ n$ c! B& w x
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 g! D9 W+ q; q8 t/ F/ ]
8 h. d+ J6 H& e9 {! b8 [
typedef struct
) c0 {8 D) |+ N7 G$ E- X$ Z1 \4 d
{
4 B% R- x( n8 c* C& w) d
unsigned int a;
# k; X O5 V5 J
unsigned int b;
' _# N! X: E( N: K" D7 w/ a
unsigned int packet_cout;
' v! {9 o1 ]& M3 N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 b8 _3 k5 `, p3 {
; o/ w8 }( v1 p9 X7 i2 L0 K( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ ] o# J7 Q# ~ V
unsigned int count_copy = 0;
$ ?0 a% f0 @1 V
/ I* B# P% f( N1 Q% F4 A
, _5 f0 j* H: _2 v7 ?) {! H' j% f" d
int main()
( W6 M7 [% z- I7 g4 a- j
{
; i0 @. m# j/ n1 Z$ w
pRX_MSG_PROTOCOL pshreRAM = NULL;
! f3 {* }+ y1 v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# C% B3 s5 D. Y
, _, l9 n8 Y. c# E4 q0 f% Z% }
while(1)
. ~ g1 @4 A4 d! ]! r m
{
1 ?; T6 q$ x8 M# S/ @
read_MSG_buffer(pshreRAM);
- p }4 f# {3 ?
}
}4 a& _) S; ?1 i$ Y9 P1 S3 Q
}
3 b/ X; M* d1 d" b* r, i
! j: L) ~$ B! r5 _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ {# ?( D5 G( h6 U m
{
% B5 t6 z& W& l+ h u
RX_MSG_PROTOCOL buf;
) O n$ ^5 y+ j) ?$ i0 I
6 z3 _$ X, g- {$ {
buf.a = pshreRAM->a;
0 W( D& m' U# o' s" e& [
buf.b = pshreRAM->b;
; A: x8 X1 t3 d0 Y; |0 [
buf.packet_cout = pshreRAM->packet_cout;
( }# m }/ R3 ~& `2 P" A1 T# r% a
8 A. X" K* G: J! e' A V+ b
if(buf.packet_cout != count_copy)
, I8 @0 y5 r- Z' t# O- x6 H
{
& y7 j5 f+ F& X* y
printf("a is %d\n", buf.a);
- S0 q8 }" ?1 j0 a( d8 g- B- T
printf("b is %d\n", buf.b);
! z! X5 ]" p/ \% i* E6 [+ R
printf("count is %d\n", buf.packet_cout);
: ^+ l/ F. u( j: y3 h ^
count_copy = buf.packet_cout;
' Y( m" t$ ~5 q% t6 \/ |; d
}
- L6 }$ v( ^: N, J( r7 u) }
else
* ~5 i. q/ z$ x7 }
{
L" g9 c& [+ Y `
printf("No effective message!");
+ S. X/ v) L- {, ~. `
}
I3 |( @1 v, E6 o
}
( m, @/ I7 r5 `' m
+ _7 i8 c' B8 T( b. p, ]
7 P J9 L7 _4 x0 m/ ], Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% w; E3 d* ^; b3 o7 o) K
使用下面代码,对内存使用了mmap函数后:
& I8 B! D& ]/ ]& m
#include <stdio.h>
, o1 b2 J2 G! Z; B
#include <unistd.h>
, x3 s) B i3 c1 Q, r0 Q/ y! B5 x
#include <sys/mman.h>
) ~+ a# t- Q( c9 N E
#include <sys/types.h>
5 {7 x6 n4 b. {1 @/ y; A
#include <fcntl.h>
$ f3 e8 N L. ]$ q) D! }! \
- \1 X5 E! g" P+ [" R2 ~7 J" Q! G
#define SHAER_RAM_BASE_ADDR (0x80000000)
# f, X b( j, B) d
#define SHAER_RAM_SIZE (0x20000)
) ^+ |. ]( f5 S
& Z+ f6 p1 Q9 J! b" k
typedef struct
; `1 x: P/ d/ R/ s0 w- Z
{
. @9 D0 v# A7 e. _" J" u
unsigned int a;
! p' I y5 R1 S2 i2 k! r
unsigned int b;
3 s' E2 P! k h0 T/ q
unsigned int packet_cout;
. U( d' Q8 ~. L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) _. z- l" O+ r3 j" b0 F0 ~% [
, x4 n* Q7 d9 ?& l/ g8 f$ r
void read_MSG_buffer(int *baseaddr);
5 A: H7 ? j1 S+ I- D
unsigned int count_copy = 0;
0 d1 @$ I) n9 m$ B% n
( E* J$ ~: s m' H! p$ c B8 u
int main()
% |3 U; N' E1 R# {2 d7 K
{
4 ^* m! P; r- L( l
int fd;
4 \7 M# P, n/ j8 Y0 J* ~
int *mem = NULL;
; o* Q: R( U% R, P. p8 h( g3 R
+ u2 r9 a7 B, i, p- B9 g8 @
if((fd = open("/dev/mem", O_RDWR)) <0)
! ^3 }. F9 n+ |' r
{
6 ]& e: a6 B9 O/ {. W
perror("open error");
) Q8 }: h/ H9 |( J K3 Y
return -1;
! G2 C8 S. F q2 t& f/ T
}
8 `6 [; \/ s+ i3 [
) X/ o0 G/ O7 V* O0 K' x, k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ b, ~* e0 A# O3 ^! a1 M) N Q
* D, l" R+ T) B
while(1)
* h j( i- y' i) E& C1 Z
{
! T L" n, n9 K: A. T+ g8 K: A
read_MSG_buffer(mem);
; D3 P# m! I n5 i) l6 x
}
0 B2 {' m% R4 O% [$ A- y
}
0 O1 S& G, G \# T/ U
& u* n9 F# m) X' T0 l2 n
void read_MSG_buffer(int *baseaddr)
/ ]' D/ T- S- U5 }* I6 n2 |' P5 z$ k* i
{
8 Y7 Y3 {$ O$ D
pRX_MSG_PROTOCOL pshreRAM = NULL;
" K, R! y9 M' t- o7 U1 z
% v. r! s1 h8 c3 a/ c1 A. L
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! H, g2 [; ~8 A) u+ a
4 N8 a2 T. W0 G8 C2 ?
if(pshreRAM->packet_cout != count_copy)
* W0 O$ w2 _( a8 B" x" G
{
6 Q: S2 ]& P$ v
printf("a is %d\n", pshreRAM->a);
# y# T) w( ?$ K7 D
printf("b is %d\n", pshreRAM->b);
. x m c6 L, e' V9 W2 N6 J1 G
printf("count is %d\n", pshreRAM->packet_cout);
# h$ B& p+ f& N6 `/ C9 M/ C
count_copy = pshreRAM->packet_cout;
: _% _4 l" `( T5 r9 C3 O
}
+ s: K- ]. s- A* F; v& s) D: ^9 }& R
else
/ p2 d% }: r9 E: o
{
: w7 G, G0 h* G; ~( {1 T
printf("No effective message!\n");
/ _. M% K' J7 J3 X- z% H O
}
2 ^ L0 f& ?+ e$ j' K9 B) y
}
# q0 [6 s0 Q% N
/ a6 d8 n) T7 M6 _) G& n6 R* J; `
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. d) ~! A! h2 l$ t$ o+ p- w
5 C, x+ d$ C5 c, \& o, t
% o% m5 X {. X Q3 O
8 p# D. Y y% ^* {+ F
9 L9 R$ h+ X2 v$ K& I* y& i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4