嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 K: q6 e& j2 e4 _7 J
1 D% z: h2 h& I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) f2 `5 e( ~4 p D; r6 [* W3 }
#include <unistd.h>
; E+ I; s/ t G
#include <sys/mman.h>
+ T8 G- k: m- J1 n0 ^) F
#include <sys/types.h>
* S4 P& f& \( E- @4 X8 g
#include <fcntl.h>
7 y4 R4 i5 M0 o" a7 ?$ p4 a! ]/ v# V
. Z3 P5 V9 H7 N; N, E) ^: c# r
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 Q/ u1 C% v8 e( j$ v4 ? y1 q
) _5 |/ A; W0 M$ r- j3 d; ~
typedef struct
* y# g/ g- z6 ?
{
; G: L5 @5 V* U
unsigned int a;
7 V, u+ U' Y1 e! S* c# w
unsigned int b;
8 _& f; E. I9 X9 _, b$ m/ c: t
unsigned int packet_cout;
0 z. I8 | }7 `" o9 W$ L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 g( r( M' Y! ?/ X3 ?% u
& X6 S$ E& }2 \2 a9 N: Y' `$ B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" y$ |1 [3 ~2 U0 r" u
unsigned int count_copy = 0;
0 v A+ W" Z' v% O. T5 l0 z& ^" A
) v, a5 Q$ s! z- o: g' Q$ h
9 g, m( S, o+ C- C9 X W. u- e
int main()
6 Q& q8 Q$ Z% h% e. b( k- f
{
. z9 z* Z! S' H5 g
pRX_MSG_PROTOCOL pshreRAM = NULL;
( o: C0 J5 S7 {# c
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" s7 n- U/ d- M5 `, v/ ^$ \
4 p& I) v* k4 K
while(1)
7 l; Y: P* ~) d1 g
{
* ?. s7 j. J; m% R+ k3 Y
read_MSG_buffer(pshreRAM);
9 }" Q) c" w$ R8 @5 x0 J
}
9 A" l# P4 [5 k3 s& s
}
' |. {8 Y" \+ L! E3 Z2 H
; L' C- E( w: W/ g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 o4 u3 o% q, y6 h& m [9 a3 x% j6 N
{
6 p# s, P% y9 J/ k+ G; T6 Q! S1 ~
RX_MSG_PROTOCOL buf;
! V6 e! g( j2 v! ` z* u
+ e+ [1 h( V3 b8 d. D
buf.a = pshreRAM->a;
7 u" x: z* L4 h$ `: X) J
buf.b = pshreRAM->b;
^( {" z7 H% {) j" n
buf.packet_cout = pshreRAM->packet_cout;
0 V+ P2 a( U& ^; @6 C+ r Y/ t
" d$ ]" j4 `7 Z/ R
if(buf.packet_cout != count_copy)
& ]- g% l1 R% k
{
" V; K, @5 b0 G
printf("a is %d\n", buf.a);
. o0 O' v X! o& B6 _8 c
printf("b is %d\n", buf.b);
6 r3 M! ?: n+ `* W6 ?
printf("count is %d\n", buf.packet_cout);
$ K) B' ]: m1 |' G1 Q& L
count_copy = buf.packet_cout;
# m$ I7 g! q J/ H7 t
}
9 R+ S9 M4 F# l) G
else
3 m% m" _/ o4 q/ A8 C# O% {
{
' u/ N3 V2 w1 L
printf("No effective message!");
/ m! v I$ G% B% K2 j
}
# Z5 q( A" z& K \% g0 \/ U
}
' ]. |' T) S' U' s
" ]! }1 U3 z7 f" x. G. t$ i
' r! w! J# O0 y: r) M. x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- }3 w& W0 P, |5 [, x1 H6 p* a
使用下面代码,对内存使用了mmap函数后:
) \ w% @3 q Q( v
#include <stdio.h>
- L" U+ j( c' q3 i
#include <unistd.h>
+ V( d2 H u$ p4 g( d. x. |, K1 l
#include <sys/mman.h>
, Q. M) R p" {
#include <sys/types.h>
; w; Y/ q" I" Q/ T/ w4 X
#include <fcntl.h>
4 q8 r8 U: B+ G# V) R' w0 _
1 H! K$ l: j, |% C3 ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
, w$ v' {: C8 |# i/ W- `! w% x
#define SHAER_RAM_SIZE (0x20000)
2 X- v3 K6 j( C4 k
2 ~2 B$ v6 _9 [$ |# p- v
typedef struct
, r5 s& B5 v+ K, q) M& }
{
/ c. s9 H! p0 G6 O8 y* f5 Q
unsigned int a;
. D" y& U6 u7 X0 q7 N0 {
unsigned int b;
% u4 V" y: p* g/ ?
unsigned int packet_cout;
/ I9 w5 Y' ~/ A) N. N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: _. l; a, k w
: o" Y3 w" S& M. v
void read_MSG_buffer(int *baseaddr);
. P% s3 e9 w0 D
unsigned int count_copy = 0;
/ P2 G% ?# ?3 ~* Y
1 d( J: u1 }7 k4 n; o5 {
int main()
8 |4 M$ k7 ]1 \; f2 H# b2 S! D
{
* u7 A9 B) r4 V
int fd;
' n1 u; A- [, }
int *mem = NULL;
5 L% D/ p( }: E* B+ f, [* o, u
1 X6 M& b3 ~1 I- e/ i3 }+ \2 I$ E
if((fd = open("/dev/mem", O_RDWR)) <0)
* d7 \! z8 t6 }1 J
{
7 F( H$ K" Z9 u" T0 `& G: F: n
perror("open error");
4 c: i6 n4 ]5 f# z3 t! V2 s+ S
return -1;
! q5 S& C# `8 ^1 Y: q, ^1 f0 a4 X
}
& [1 f- p" p# i/ v0 t' G5 n- i
7 i/ h2 [: y1 ?: V1 g1 Y. X& u( s" x
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! n8 y8 i! p1 M% p1 |- }2 t+ T) O
. l( O, I+ ?0 L- I+ s& k
while(1)
. i5 V! V4 c% z( X3 X3 @$ b
{
* D9 S& C# G9 z) m
read_MSG_buffer(mem);
, {- i& N/ x; L z! w
}
$ Z4 I7 s) p2 W5 I* K. I
}
6 c$ s- D! h& V5 M
6 U3 L& k, o2 r, M; ~# Q0 P3 r: d
void read_MSG_buffer(int *baseaddr)
! }( M! \0 i# V' z! S
{
5 F/ j6 q# N8 N0 ]
pRX_MSG_PROTOCOL pshreRAM = NULL;
- a2 S( [5 H1 ?3 y( w/ b
9 W1 X+ r- a2 G6 M/ {0 d/ d3 Z. q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 D" X7 k% w5 K* d
+ S7 q! B {# ]# R
if(pshreRAM->packet_cout != count_copy)
3 a* L5 O o6 S1 V' V
{
. ~& ^9 a" @7 u. T% {
printf("a is %d\n", pshreRAM->a);
" f( A8 x8 }( D9 U! h
printf("b is %d\n", pshreRAM->b);
4 y5 K! m4 c: s6 D* I
printf("count is %d\n", pshreRAM->packet_cout);
; \4 s7 |; W7 o+ `
count_copy = pshreRAM->packet_cout;
4 b. n% r: [1 x- f
}
0 |' @4 { h& h. _1 z* Y. ~
else
: @9 o0 i7 {7 I
{
( u. m d5 u. s) U5 z$ k' v
printf("No effective message!\n");
7 G) J5 R, W, \ r' j0 s
}
+ A: ?4 E+ V$ w: ~$ i: v; w, b. M* `
}
: l/ Y6 p5 \, @9 D. u6 U
* F; D0 U2 n3 p8 N( c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 v g! }4 I. y2 Y# P4 a
+ ` m$ A& a" X+ E% Y( ?
' G" \2 w, a$ Z7 y/ F
3 @2 e' s! y; d. @# ?
- X3 F4 U- w, w1 G) l
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4