嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 J2 f5 ~7 J$ l
0 ~& B7 K: x/ p& [6 z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ d: ]4 W" ~# I( V& Y! ^' u
#include <unistd.h>
O3 I# }- n) O' ^8 s4 m3 _
#include <sys/mman.h>
, n4 b$ F p( b( ?' R
#include <sys/types.h>
1 [: Z; N; N' _
#include <fcntl.h>
/ T( M5 q/ c9 {3 R/ D+ n& V8 e/ s C
6 g0 X U4 j# L' {; L1 E% S7 G$ ^
#define SHAER_RAM_BASE_ADDR (0x80000000)
* Q% R7 B2 |- O" {
; R' M4 m; z4 k; b0 u! d. |
typedef struct
0 A) o2 @8 {3 _6 M, L( R
{
4 n; G& |. v2 d8 d+ c) H8 V- S4 i
unsigned int a;
! R& N1 ^( Q# L* d) L$ g4 Z
unsigned int b;
( }; H A9 a& ?% d
unsigned int packet_cout;
% n; \- w$ v2 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ] J& y* u% Y( q0 q$ h
: m% a! X3 Q% n" J% L" B1 ?9 o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# l& T6 F4 P m* b9 X
unsigned int count_copy = 0;
: E8 X( B' c3 A" J
' \1 P/ c1 y& | _7 W
( z" V% M& h: S
int main()
+ y3 Z _0 I n H" f
{
) I- X3 @: T) @5 m7 g& @5 V+ H
pRX_MSG_PROTOCOL pshreRAM = NULL;
# F3 t- g% p8 R. z6 q/ |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* s, X! \: M& m- _. t" U+ p
; V( V8 ]) j2 V
while(1)
- l& A9 Q: O$ P& \( v p ?
{
8 \" t- b# ~, B P/ M
read_MSG_buffer(pshreRAM);
7 @' L2 C: o1 c" A, x
}
( q0 d4 t4 s* O7 z; Y* L3 x
}
" z0 B6 S$ s5 F% Y3 s9 t
% A( H0 r. m0 w& b0 g0 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ u" Y3 }4 t0 X
{
# `6 q# Z- ] G3 L8 {
RX_MSG_PROTOCOL buf;
. t' V' l' V3 n, \% z3 H
7 k! f$ }! m. j* W1 f! x; {1 g8 V! a
buf.a = pshreRAM->a;
3 c* T- a) t7 k; G
buf.b = pshreRAM->b;
# k- o: W" L! m) {8 x. o" d
buf.packet_cout = pshreRAM->packet_cout;
* E0 T9 j) Y/ |$ ?
5 s9 I4 B" U5 N4 y/ x" R
if(buf.packet_cout != count_copy)
" Z g9 i2 c* a0 C
{
f* o% Z4 s# \: Y7 Z0 f5 I
printf("a is %d\n", buf.a);
- U4 P' P8 g8 E8 ?8 O9 B
printf("b is %d\n", buf.b);
" T8 j! _2 Y& Y
printf("count is %d\n", buf.packet_cout);
+ [; L+ M0 R, u8 K1 q
count_copy = buf.packet_cout;
) e- `& t1 }6 M1 K4 s4 Q. U
}
$ A) ^. _2 }) {3 ?; R2 }4 f
else
5 M" W/ s3 @9 [
{
( q7 x6 V' J; P4 E% b. v
printf("No effective message!");
* K6 c$ \2 i1 z% P6 y6 `9 H: ~
}
" i' |1 B- z+ h/ {- k7 e
}
# a5 B% Y& N6 `5 @* V8 T
% J2 b; m! [1 G1 n/ f% i
" Z1 y, j, A! G7 T1 X( B1 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* C1 |% J& S2 O X
使用下面代码,对内存使用了mmap函数后:
2 ?7 {5 I% U& n0 `+ j' G1 E( c# Z
#include <stdio.h>
4 Q, E, w; p& B, `$ j4 |2 X9 W; u
#include <unistd.h>
/ k+ {! c7 W% y% y
#include <sys/mman.h>
% g+ \( F$ f* _9 X
#include <sys/types.h>
( e# }7 Y; K9 _2 g& }
#include <fcntl.h>
4 N: u9 ]5 C/ U5 E5 \3 B: h
. Q1 j$ K5 d! o" }! c
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ H+ G& \' @, I3 p. a$ R- @
#define SHAER_RAM_SIZE (0x20000)
7 U3 d H3 ]. \& p
& v/ }$ d* _- C9 M
typedef struct
2 e D! P# ` l
{
* G. j0 A- Q+ L; _5 `, J }
unsigned int a;
C6 n, p1 ~3 n
unsigned int b;
0 b8 q5 x+ ], F+ a: r3 a
unsigned int packet_cout;
. c, h) `) W3 T: O2 I( U& m1 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% \0 q* k4 A; l- I: w
- L! Q d# Z) w. i8 w1 e1 L
void read_MSG_buffer(int *baseaddr);
+ \9 m, Y- G6 j# }4 G7 v1 R
unsigned int count_copy = 0;
" |7 i1 q0 }0 B5 m% X* R8 w
7 S: u7 X' f! n. h( d
int main()
6 r; R) c5 Y3 ^6 V- g' G9 n! F P
{
1 C* n$ U8 Y0 C: ]* Q
int fd;
6 z5 Y0 P. X$ r) [
int *mem = NULL;
$ ?9 a& e2 j3 N% o b; v) \* z7 ?
$ V# m: V( M; _3 g, b2 Y0 L9 s: w, i
if((fd = open("/dev/mem", O_RDWR)) <0)
9 p: H! [# L1 x) j
{
@6 P# m5 i0 o: K( `
perror("open error");
9 E+ Z1 Y8 t. b7 z+ B
return -1;
) P6 i6 N3 H. q/ b3 `% x
}
7 E$ ^3 B" K6 K h# s4 j
' J: v' Q, N0 T) a% z) K. Q H
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( s* J* @4 M4 ]3 Q- s* q- ]9 o
6 Y. N- P R% K% @4 x8 J
while(1)
2 @# U- V6 `, u" ?# J% I( V
{
7 e" z9 t& @4 j- k0 g* X" Y, u
read_MSG_buffer(mem);
x6 M& B' K; J9 d4 [+ N$ K) w
}
+ h# Y" N. R" p4 d( ]/ i5 j& s0 T
}
- C0 U3 u0 H) N; |
8 D0 P" f; V2 P; K6 O: C- G
void read_MSG_buffer(int *baseaddr)
6 z5 R U7 Z% o; v b- C
{
3 F ?2 P4 N1 R6 e
pRX_MSG_PROTOCOL pshreRAM = NULL;
% A1 i& q- Z/ p ]/ C. D' n
\+ R" y( w5 D3 t
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 @- p9 D: I4 S/ @3 X4 q
4 {8 h; D7 E& c
if(pshreRAM->packet_cout != count_copy)
: d4 B$ u) ]! Q2 V' ?* l
{
% ?+ m2 V" K7 @5 V
printf("a is %d\n", pshreRAM->a);
5 e# Z0 o8 |+ w1 \( D
printf("b is %d\n", pshreRAM->b);
$ C* d# C7 U: |) r
printf("count is %d\n", pshreRAM->packet_cout);
: r6 \/ o6 _( k4 l' ~
count_copy = pshreRAM->packet_cout;
9 n0 H2 r# Z3 K2 f2 ]" c
}
S4 p2 d1 @" w. s: Q. u
else
# }! N7 K2 x G" \; N) t# W
{
' N& A! ?0 v' ?) `; z
printf("No effective message!\n");
- Y7 o5 M' ^" ?
}
7 M8 @. S, u# } h: d) F; W
}
# x( h+ i% B A+ H
3 Z3 j' [9 b1 B7 }3 e2 h
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- [0 ^5 I) h& z: P. B
5 R; i" ` M+ T2 B$ W
, q, G% t/ H. G
' h/ V+ T7 s# K" }* E
) j( T5 k& }3 _4 w: h% c T. P/ A
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4