嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 K- p3 |' M3 v& k0 [- @. l
9 l9 l. d, I2 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* r8 t/ |% G5 Z% Z$ S3 b
#include <unistd.h>
# R. t! X% V) }8 r7 I' Q
#include <sys/mman.h>
) o; F! L9 x# Q9 A! t
#include <sys/types.h>
* f6 E( E+ C" [% ]/ Q
#include <fcntl.h>
o+ \8 J6 w) k9 ^, T" x
) ?! J! t6 a- J# ^2 e% g( S+ D
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 N) U; d- N6 A6 B/ w
/ M5 X1 M% M6 O. T* O/ E. Q
typedef struct
6 S( O! U* J/ O$ K$ f* G
{
6 w" f2 C) L6 R7 C+ v) |
unsigned int a;
; _% v, T5 l0 S
unsigned int b;
) K$ }* c) e; C# N. p( H- _9 B
unsigned int packet_cout;
! l# E A' l1 f* w$ L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ R2 j& ?$ ^: ]$ {; n
9 Z. K- Y6 h3 [- U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 m' {3 j" s0 N
unsigned int count_copy = 0;
- Z0 s( d/ ]( F; s) o7 i
* Q j s( ?+ G2 f8 D' \
* R' X M! c3 O2 |6 n6 b
int main()
/ Z6 d2 f% w$ }* x' |+ U% `
{
- |. b Y" m0 b S9 ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
! N% |( `- N, |. b% c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 n6 ~$ U( }. z! K7 {. b/ N
, \% I# Z7 K- a0 V/ F- l
while(1)
" r: x* @/ S2 W3 \* o% P
{
7 D5 P+ b2 I2 ~2 u& f0 u8 o
read_MSG_buffer(pshreRAM);
# B! Y m% ?/ J @( l7 s
}
, C& ]- c$ F7 x
}
9 M/ [+ w* t3 E( J$ x: b M# _' D
: P+ Y1 V+ @$ F% X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( \* `5 e- v+ N
{
7 q2 h/ I+ r: ]3 p" x; k
RX_MSG_PROTOCOL buf;
; f% b0 u3 X9 _" d$ V
$ d; \, h1 b; S; d: W
buf.a = pshreRAM->a;
3 C: c& g W0 z @$ \% g y
buf.b = pshreRAM->b;
. ^- V8 w, N6 \# Z
buf.packet_cout = pshreRAM->packet_cout;
' [ K* f# o% r! f/ B8 [6 L
4 t6 C' |5 `! U2 P% d3 F! C/ M
if(buf.packet_cout != count_copy)
% ~" f% w% H/ a
{
% v* O4 N/ J! N, J7 P. j( f
printf("a is %d\n", buf.a);
/ l1 Z( t7 K/ {: j
printf("b is %d\n", buf.b);
; v7 ^- ]9 {% h- K; D% F
printf("count is %d\n", buf.packet_cout);
0 \. r" I2 g, |5 @+ e& Z- ]
count_copy = buf.packet_cout;
& I( K% F- I4 n u# `+ r/ q( o& L
}
! ]! ~# g" D2 i$ p3 m
else
5 J6 B/ K( R1 K( l5 e1 V
{
/ |9 ^7 @( p/ d( Y; G S/ _5 u
printf("No effective message!");
% w' Z/ s- M9 d( q. U& M
}
/ O0 x8 q/ r: L w& Y' E. n
}
/ Q6 u/ |1 S+ Z y' T
0 L- n$ n; z0 I" U# V
. @' p5 Q' i& d8 U; p, J, d5 \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 e- B! T( D8 F( z
使用下面代码,对内存使用了mmap函数后:
1 j# Q) F3 ^7 P- {9 R
#include <stdio.h>
8 O5 J" ]% M/ |4 r# u
#include <unistd.h>
4 E) e; e ] [+ ~5 n! a
#include <sys/mman.h>
$ N+ @! W2 e K( d R+ I
#include <sys/types.h>
+ e3 @+ P" x2 c
#include <fcntl.h>
' h0 x6 B6 i* I: B/ E1 h
7 h6 P% a+ l" `7 a
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 X5 M0 W/ u" C- ~
#define SHAER_RAM_SIZE (0x20000)
5 x1 m4 D! C: k& v/ U- |
5 {/ k( v, h& Y* F& \1 O5 n; ^
typedef struct
$ h/ {8 D- N) [& n2 u9 h
{
' E2 F- M7 c2 _- p+ D/ j
unsigned int a;
2 o( Q1 D/ g4 i" t1 L; ^
unsigned int b;
$ `+ K/ J5 I& _( z0 x- s5 o5 G
unsigned int packet_cout;
8 D' [5 B% E% X3 D! _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ]) z3 r$ @* j0 s& e, v
4 ?8 M. b/ e. T" \$ }: j3 d
void read_MSG_buffer(int *baseaddr);
/ k; z9 p6 V3 W2 Q3 |- ]
unsigned int count_copy = 0;
# g/ H X( [$ K! l
1 J1 J% H1 G: _3 c7 T# o6 ?
int main()
$ ~* l3 f/ m, I, N# t
{
' y z! s+ z( ]" S, |
int fd;
. B# @5 t+ Z2 A8 g9 d4 U
int *mem = NULL;
: A$ L# T7 k. P- T
- j8 W- A& r K/ G# E5 d
if((fd = open("/dev/mem", O_RDWR)) <0)
1 Y# h" c' Z1 y9 Z
{
8 u; L: {, O, g9 \1 c4 q6 ?
perror("open error");
& b6 Z- @ a5 J5 \! [
return -1;
( u7 E& a: S) v' ^* _& e
}
( \& y$ ]! g7 c6 E. ~
: B6 X; [8 L. O1 Y* l0 h$ b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 `. K+ f- F8 W; \9 Z, `% _5 j d
3 {, O+ N7 h: i
while(1)
3 `7 }' @$ V# O, ]0 Q* P& G1 J1 i: C
{
% A9 s, x Y: U9 ?( J
read_MSG_buffer(mem);
( |+ {& g0 i7 X* ]; O- ^" O
}
/ {8 G% \( g: J! O5 J
}
5 T8 p* A0 @" O( V, `# @- @
' F+ {4 t* n: T6 S0 U: \
void read_MSG_buffer(int *baseaddr)
! c7 y+ n- f8 t+ ?9 j7 f5 X
{
2 h( r! Q) G* J6 L' Y; |1 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
- u9 [0 k; N! c1 Y1 O# [% l" k& K
& @9 k; R+ o( p1 @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
% h. n1 M: a5 Z
* ]+ z4 b. C j( p1 ?
if(pshreRAM->packet_cout != count_copy)
5 G1 S- Y5 P- x
{
- a$ Z. n/ Q' U( K' k
printf("a is %d\n", pshreRAM->a);
& |- y$ ^6 \5 B: R: r8 O5 H' w
printf("b is %d\n", pshreRAM->b);
5 [: c! S( G: f$ U2 A8 ^
printf("count is %d\n", pshreRAM->packet_cout);
% ~# g3 c# k5 I6 ^
count_copy = pshreRAM->packet_cout;
3 q, [' z Z; T
}
6 F% Q# H: T3 _# ?
else
( U& `- C$ X, s r2 x
{
4 N5 M( Z) Q4 M5 V/ B
printf("No effective message!\n");
7 \4 r9 _7 O+ }1 }5 r! p
}
, W5 b& ]* Y% a
}
7 O! U5 X3 B: T! z0 b
. |9 I6 P4 Y# ^" {, @% `) {- B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ |" R6 |) C! r: a4 x) Y
/ v! @0 q6 {! X, h
# A0 N* q' a4 Q* C/ W" }; ]
$ ?9 i( B n2 ~' {
2 _/ B1 ?& A4 H) Z/ l3 K2 x9 }
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4