嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& `$ S8 v' ]! e3 l
! r. a9 H9 j7 o" _/ M8 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" I, ^. F6 I/ M4 f
#include <unistd.h>
+ F6 l1 \4 X) \8 g$ G* W7 U0 H
#include <sys/mman.h>
% \) u% m' P( J, M; T
#include <sys/types.h>
6 |! ~& { {) R: {6 i
#include <fcntl.h>
6 L8 ~2 Q; j7 m- K0 M+ K' r
0 s! B9 A* V7 r/ Y; r
#define SHAER_RAM_BASE_ADDR (0x80000000)
* H% c" T# y" U
- x+ s) ?- t' D6 z
typedef struct
* S/ d% P$ ]6 w
{
0 @- O/ q8 R7 i6 k
unsigned int a;
/ B- r3 u7 }4 \1 C3 ?
unsigned int b;
7 U- H7 ^+ o; J- g J
unsigned int packet_cout;
+ e4 R9 c5 y/ p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; ~$ ]/ M; J- [
}8 S7 E0 B6 E R' P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
J) x' Q( _ I, ?
unsigned int count_copy = 0;
5 j @) B( y) V+ w! Y# U
0 v) _: z" ]: V$ S& r
; {. a7 X; B" t& N6 \4 Z
int main()
9 g5 m: |5 @. q: _$ q1 \5 N
{
9 K4 y6 a; E$ @1 w% @
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ P1 Q0 s* }% n- B$ b4 P4 h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; h, W! Q, D' I( \+ B
* f) z- h7 b/ P* h' G
while(1)
; ?, M1 |6 }9 S
{
& V& L& j& T) m7 \
read_MSG_buffer(pshreRAM);
& x, H: E6 M# p) L" h+ R* c
}
0 b* I5 J9 Y% J
}
: t. ]( L% N* O
( P- i* E3 k+ I3 o0 k/ F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 G t* a9 x; W& a
{
g3 _4 x/ U! L% K* v/ j% ]
RX_MSG_PROTOCOL buf;
, O/ ?% I2 H- q5 n/ p$ s/ D
3 i2 b* B! o; t: g
buf.a = pshreRAM->a;
0 i( W. s6 g0 x# {
buf.b = pshreRAM->b;
% ?" A) T) D( `" }2 m
buf.packet_cout = pshreRAM->packet_cout;
, D9 s$ P3 r7 H# C" B0 C
8 A4 x: A8 a* e( R R
if(buf.packet_cout != count_copy)
- _' M9 e3 q8 t ~
{
0 _! p0 H* U* e* c' @$ y
printf("a is %d\n", buf.a);
& |: J) L4 f$ J/ A( I* P
printf("b is %d\n", buf.b);
' i4 l% O) `+ n1 H8 N: z
printf("count is %d\n", buf.packet_cout);
, F2 ?% {) c8 R' a! G" y
count_copy = buf.packet_cout;
2 ]) Y8 }% w: h+ e4 v8 c6 E6 c
}
7 H$ J$ ?! V% J$ i( G% q
else
3 b$ y1 W; I) k" j5 U5 n( T; O
{
- h& ?6 U( W9 ?% W% Z: ^
printf("No effective message!");
# ]3 F: t. U/ q" c4 g) E! l
}
4 H( G; Q% f; p; P0 ~2 ?3 n
}
' Y! ^0 [: v" f" v; `( D5 t8 P
0 g' J4 d. ]( _# x3 c; M6 n7 S0 y
9 _3 b: ?0 T/ Q/ h4 ]/ g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' m3 y4 O9 I- A+ c2 b- l
使用下面代码,对内存使用了mmap函数后:
, [2 \% r7 v' M2 X" e, l( b
#include <stdio.h>
" t% \( v6 h/ i$ [2 Y. y
#include <unistd.h>
: ]% G. I3 \' J' Y& a1 h9 _
#include <sys/mman.h>
$ n5 s, ?# ?4 u3 r' A1 p
#include <sys/types.h>
( r0 l) A- b' U: P) n: R
#include <fcntl.h>
* U+ j$ g/ P3 O) J
5 g% K0 g' d$ Y! `6 k! l) L& a6 U
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 d2 L4 @& ?' |9 v8 `
#define SHAER_RAM_SIZE (0x20000)
# e/ u% n. i, o1 G8 F' K
( W1 k3 G* t$ h& b" P. A7 v0 \
typedef struct
/ V: l* t5 f; [2 b9 V
{
; N: R" u# r( p2 a8 X" H
unsigned int a;
. J# k, R% X% l
unsigned int b;
4 {9 O: w2 [3 i0 c2 Z! q0 O3 {. M3 _7 A
unsigned int packet_cout;
$ H- K5 ~# M+ S* s( b1 o) t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
y6 ], {* N0 l( H' D
* e+ o! @3 D( {# | t8 b/ G* L* n2 I
void read_MSG_buffer(int *baseaddr);
; U) O$ b" Q# s _
unsigned int count_copy = 0;
. I3 c+ _* N7 ?0 }6 C- K; l. S) e' u
7 d: w4 T8 r7 B7 _- w, ~
int main()
% H0 Y$ u& x/ E. T) U
{
+ E$ g; _; `. h8 g
int fd;
7 ]4 Q. Q( M8 @" p
int *mem = NULL;
/ Y7 ^; R$ [! A, e
* v0 f" j& Q0 P
if((fd = open("/dev/mem", O_RDWR)) <0)
- W. m+ y5 w, O, g2 `, f
{
5 V G5 [9 d, u/ m; C
perror("open error");
, _0 E; q, H4 C5 t9 K4 b6 ~
return -1;
' F% ]6 D( z5 i0 I! ? q3 C
}
: ?; @( W; a: P5 i; X9 f/ E3 ^* H
5 u, Z( M: O' J4 @ V* n; E
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, I# m) e# Q: F0 c0 z
- r- m5 N2 X1 ?( b0 s4 V
while(1)
`" C Q4 d, p+ X5 z' c+ N; ?/ F+ J
{
, {& U4 f6 W( N! \- p% s
read_MSG_buffer(mem);
( D. Y1 o0 _' x1 r
}
; X2 i9 P) q! B; J
}
9 e- U1 R9 L2 }6 B' F* V
}% O, \- _6 }
void read_MSG_buffer(int *baseaddr)
" J* e" S9 F* U; p0 l3 M2 g
{
; O. E" l& D/ c7 x! I8 e: q' Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
( C/ a! A& F! A }" F
6 P8 ~+ o1 |$ d9 v5 K Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 e. b- ]) H4 J( W# Q8 b
2 l0 U' n2 Y: E% ~9 a# w
if(pshreRAM->packet_cout != count_copy)
+ z f/ I! _5 U( G8 i) M2 B
{
- j6 ^* n+ V& p; F+ s" D" p3 @
printf("a is %d\n", pshreRAM->a);
- R4 e8 h, C& f0 I
printf("b is %d\n", pshreRAM->b);
8 g- h3 L6 g+ `6 d7 l5 G
printf("count is %d\n", pshreRAM->packet_cout);
" @: F0 U( P) x6 _
count_copy = pshreRAM->packet_cout;
9 t( t1 J* \+ j' e: X
}
3 ]! k8 L5 [) E9 H/ w8 i9 Y
else
8 ?8 o" Q( L3 L' s9 a9 @7 E
{
9 v- s3 y( N, Z2 J
printf("No effective message!\n");
/ ^- J0 I# |& s3 q
}
7 t) _4 c: x; `: B0 E# m
}
/ z" _9 Z; |( z+ h* k
& r3 J& L" Q# {1 f/ p1 K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 \; f# U) F1 t: V% d6 r( S
6 q* H' @9 w+ P
2 x, I2 Y- e/ s5 ^( t
% f! k/ c5 E/ D9 j7 C9 ?
6 K; X: ]' n3 a4 w1 S; N
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4