嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; N8 Q) @0 B' V
5 a; f+ }7 ^" P5 |+ J. c1 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( J! b, s* ~1 A1 t5 k" \
#include <unistd.h>
/ S* E+ {: I) h7 h6 O. w: b# o9 s: U
#include <sys/mman.h>
, e. h9 D! g5 A( c8 T) T& K
#include <sys/types.h>
8 Q2 q5 U' |" i. W. A- E$ ?
#include <fcntl.h>
; ^( t9 y& V( }7 M/ [
1 A6 E3 X, L3 S+ Y" d' g
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 i% M- T- ^4 V& d
$ U- ?: Q" L( b' V
typedef struct
; x* Z. f1 C3 E' G( `4 z' F) C
{
- T1 z9 h5 l* k0 ~4 v+ p
unsigned int a;
* L6 H, z! F% @9 C
unsigned int b;
+ d$ J; h: p6 C0 a$ o8 C
unsigned int packet_cout;
% s8 v5 D& O3 D* k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! k8 E1 E5 `% n( m8 ~9 @
! L2 o @9 T8 ^- L2 i% e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* N; x3 o' d. N0 z H, l7 U) `) Y
unsigned int count_copy = 0;
5 P' _* h3 s! J, y' w, k2 N
0 S5 w- q7 v- q" ~: c0 B
& \/ ^" L8 s W: v4 \ k; G
int main()
" z% @8 B" d8 z M6 a4 o
{
: P! f) d4 W. J, }0 {5 i5 J
pRX_MSG_PROTOCOL pshreRAM = NULL;
( ?! v9 x% Q! x6 c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. y8 |4 H: U9 s' M. Y5 o
( N) r# X) N/ G
while(1)
& n2 j! L- ?- v% d* k) I7 E
{
( {4 Z; J, g1 l. I Z
read_MSG_buffer(pshreRAM);
4 w2 q. r2 L4 t+ ?. E0 p8 X$ b/ I
}
! d" b" ?2 E- T+ n- r, O
}
k; `* K1 k, {5 f# t3 h2 I6 ?
3 K+ |/ N8 S) {6 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 ]$ k( Y3 `# ~9 V4 o
{
/ F f* L. l' K- e6 z$ Z
RX_MSG_PROTOCOL buf;
1 W" N# w9 A7 e0 S5 ]+ D' W- T& T
) d. z* E( _* L+ ]# g7 z
buf.a = pshreRAM->a;
, i* ~9 s' A" @) [2 r: T
buf.b = pshreRAM->b;
- u; O' {' p8 J6 e, _
buf.packet_cout = pshreRAM->packet_cout;
/ n: X7 S6 B/ l+ a
) M: k- T0 {9 l7 @ R
if(buf.packet_cout != count_copy)
/ u2 e0 f9 T9 X3 q0 @9 j& f4 q1 c
{
: A6 c- r6 H v* O }7 ?" N
printf("a is %d\n", buf.a);
/ ? m& V" {9 P6 D& R: ^
printf("b is %d\n", buf.b);
& M% B- R8 h) F7 s$ h9 Q
printf("count is %d\n", buf.packet_cout);
' @; i" Y }$ F3 L
count_copy = buf.packet_cout;
5 d5 z) y v* I, y1 S1 Z8 d
}
2 j4 x2 H& m& E% x0 j- ?
else
' m6 f, X* |$ s: @' |0 ^
{
$ `( o( B& _9 v. `5 H9 h
printf("No effective message!");
( o. K9 L$ K/ X! \2 K4 ^# t
}
i7 W* X# U1 Y; `. `
}
+ o' ^. b6 f. v- A
. j4 ~5 R/ L1 I! Q5 c
$ h; ~+ Y& U$ T3 ?6 V, U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
q3 L. P% Y+ H% I- E
使用下面代码,对内存使用了mmap函数后:
+ W) [( T0 N& `6 Y
#include <stdio.h>
2 _! S( f& l( D2 v4 Z0 B& c) s
#include <unistd.h>
4 [5 R) U3 f9 `) s: {- a
#include <sys/mman.h>
/ n @' j2 ?' A
#include <sys/types.h>
/ A0 c) X0 o* R2 E
#include <fcntl.h>
. i7 \% U! H9 u6 b$ Z6 G
# ]$ c1 A3 z, b$ @" b8 J6 f
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 B# t& }8 j8 L% l0 ?
#define SHAER_RAM_SIZE (0x20000)
3 L0 _/ A" H1 S# n C4 T
L/ h [9 N* x2 s0 v
typedef struct
! ~/ p! p& ]1 w/ |4 l& ^
{
- k; |# T. W' \# X
unsigned int a;
! L# l s, T" X3 g. A, v, Y
unsigned int b;
% j1 l1 w B9 U7 A& U) n% ^
unsigned int packet_cout;
! v9 N' \: o% n$ c* k: S8 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) N: |7 @( a# @- \
* }* l. Z g* U/ l0 i
void read_MSG_buffer(int *baseaddr);
) G2 x9 x0 k( v: p
unsigned int count_copy = 0;
* i: ` X) L, U" D1 M/ M0 I* h
: @3 u- P/ b8 C% {) {9 l
int main()
: {' Q7 {- @9 b/ {1 `( f" P
{
# f3 r( Z$ P2 _& @0 |
int fd;
7 ^ m* J6 R h$ J
int *mem = NULL;
$ b, ]. [- B4 B6 f
- M4 {" |1 E$ n
if((fd = open("/dev/mem", O_RDWR)) <0)
1 }+ k9 ]' Q9 S- S. [
{
9 g4 S4 a" M# U
perror("open error");
" M. X; g! h" F8 G. G
return -1;
: J! B+ }* N8 E6 s/ ?
}
N; H. Z K2 X' H% z
8 J0 D- Z, V# C* U9 P( b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- A0 ]: V+ L2 m( S# T4 o
, \; m0 j5 d( v. c- i0 l1 g
while(1)
+ w; D& v2 j# G. m
{
" j2 D6 j* j: K4 |, h" E! i
read_MSG_buffer(mem);
8 U; j6 W1 A9 f0 v
}
9 C2 F( `9 Q3 u9 A3 h8 C
}
- u( l! `; _3 H6 m
0 D0 r6 h% U! O5 e. T3 E
void read_MSG_buffer(int *baseaddr)
# z: }5 R- m5 ]
{
) w0 G+ x5 u. j z2 H) J
pRX_MSG_PROTOCOL pshreRAM = NULL;
, A0 f. _. z8 A
2 I/ p4 y( X B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! }' z0 X8 W# |2 N1 s
' h7 z: C- u: N3 C& t/ o5 w: a
if(pshreRAM->packet_cout != count_copy)
" j; b& F0 a Y. k- P
{
3 x1 @# N* _; t0 c
printf("a is %d\n", pshreRAM->a);
+ H$ Z& l! Z* _4 Y! v
printf("b is %d\n", pshreRAM->b);
r$ @0 w; F5 j2 \+ W; _( Z, P
printf("count is %d\n", pshreRAM->packet_cout);
% @) n% P: {3 V# s# d+ D
count_copy = pshreRAM->packet_cout;
6 c" k, I6 m) o8 R0 i$ H& T
}
( Y; @) J" R$ Q$ ~2 E
else
0 z0 m% a$ F9 z& h, g. C! t. D
{
0 c6 @( i9 T% f4 V. d) v. w0 z
printf("No effective message!\n");
' |. |8 J! U& n! w5 i# S7 }
}
+ r, ]" V5 y4 p. M' p5 u8 C9 W
}
9 z3 m& k4 y# @0 _* U
; |! \- a$ D" j! \) K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 O3 g; M" X" Z+ T
2 }2 ]! |" \' o( P5 c
1 L. z% b. S& h& B4 M3 B$ p
) Q: o7 y: i6 n3 f5 i1 G) D# i
; p+ r& B& Z2 \) y( G- q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4