嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ C6 M- X: r$ _ k9 A% X
5 Y) v$ o, e) r. D5 F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 _( a/ r$ s: F7 L4 ^6 n
#include <unistd.h>
6 J% A. z3 }" U, F. q- \3 d
#include <sys/mman.h>
5 E" a8 I! W- I0 G) m
#include <sys/types.h>
" h) {/ t6 I1 K6 y9 v$ a. \
#include <fcntl.h>
: E3 J' j0 w' Y! B8 }! }! F( J
. i7 [5 J- {1 d8 `
#define SHAER_RAM_BASE_ADDR (0x80000000)
, o* b% q8 Q( ^2 k
' }4 a: [: X5 L( |( y9 a
typedef struct
4 C0 R- C- w+ A, l+ @# E) j, k$ x
{
4 h+ L- ]9 @: I$ P, D1 ]9 _1 ^
unsigned int a;
1 ~1 e; s; t2 S; c
unsigned int b;
, h! n6 {/ ]! A( Y( ]& o3 {2 q
unsigned int packet_cout;
, K1 J" _. b0 h" b/ o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* p% V% X6 u% R) y6 i2 l
2 Y' G& G9 q# x0 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 ^! V* l Q! |% K) k4 E: c
unsigned int count_copy = 0;
$ b$ i7 G8 S3 D7 z+ Z3 q* V) K n+ s
& G u/ p0 U( }3 J$ a" G: ~7 S
' Q: o& q1 {8 y: u9 O$ y% ^
int main()
; y. n/ f2 a* @' b6 K8 B
{
3 F( W0 W6 M4 d
pRX_MSG_PROTOCOL pshreRAM = NULL;
% n- S& Q6 f$ j
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 S5 v/ D7 p+ S8 M
* L4 L: {3 K7 r3 B& _' Z
while(1)
2 m) o( ?/ ?2 _
{
8 R! Y. b- b+ Y
read_MSG_buffer(pshreRAM);
0 y! O$ ~' o+ f' |- P
}
4 |' @1 J" A9 T8 c5 Q- D5 k. W4 G
}
, e7 Y6 \, H* ^- K+ S) `3 X
1 k- V2 }2 ~+ [. h5 k2 Z/ ]) e2 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( M. V+ ^- ]5 q" A1 ]
{
# ^9 s& a' @! D- B8 @# Y
RX_MSG_PROTOCOL buf;
& J6 `& f+ d5 Q" Q8 O: r, }0 Y
Y2 f0 r% J4 w
buf.a = pshreRAM->a;
: u, S4 `3 W; b8 s$ l; y- }
buf.b = pshreRAM->b;
% }9 s# `1 [' ~: t
buf.packet_cout = pshreRAM->packet_cout;
, r, w5 u z V- a+ n& x
* g* H# |5 ?; ?6 K& {
if(buf.packet_cout != count_copy)
# W0 t/ \! L2 ]
{
4 O6 {+ s C, p/ Z: Q+ l% e
printf("a is %d\n", buf.a);
* `* y& a8 i5 d- H' l) a
printf("b is %d\n", buf.b);
& P7 p9 O4 a5 |$ I) G5 ^
printf("count is %d\n", buf.packet_cout);
; R, y4 Z% o* H3 B- w. @
count_copy = buf.packet_cout;
6 K8 _2 o& a4 F. s G% J
}
5 _$ L# J' q' a7 Y
else
8 \0 h/ {% B. j: _! f/ e' n
{
* v! B* v! {* `6 X
printf("No effective message!");
- v: I" L: h2 q# _5 f
}
2 [/ v6 n t# r4 D$ w6 U
}
+ f! W% W, s0 h$ j; T& c: j& D# F
8 J) ?9 P# t* l! @( w% s9 o- ?+ e
' @% d5 d( G# m; ^# K/ H( v2 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% p" w% Z. W: r& I" C5 A
使用下面代码,对内存使用了mmap函数后:
9 E$ g% e8 O7 _
#include <stdio.h>
1 o7 B% i' [1 N- u. A4 }" w
#include <unistd.h>
, c7 F1 E, b' q
#include <sys/mman.h>
- B* R% T7 E! Q& e! S
#include <sys/types.h>
7 e) {# {6 }$ n, E& b
#include <fcntl.h>
& }1 N/ ^' y- o& ^1 c
% [1 \. ~# A/ B1 o
#define SHAER_RAM_BASE_ADDR (0x80000000)
; M' k& z' a D6 K `8 W/ _4 Z
#define SHAER_RAM_SIZE (0x20000)
% B5 Y- Q+ G3 Z. w
7 P: G; F7 n {5 _ U* S9 T7 z
typedef struct
' m4 ?* n' L$ g5 p; a6 N4 w) [
{
5 v& k# Z. [9 y6 e
unsigned int a;
0 D! X" ^" j- F
unsigned int b;
- B9 a, y% i; U4 n
unsigned int packet_cout;
6 z9 M; U- J) ]3 M, B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ j4 \# I8 l4 a. M/ C* }
; [9 @$ i5 i( b% b
void read_MSG_buffer(int *baseaddr);
. C) ?9 L6 n4 P( R
unsigned int count_copy = 0;
$ \# j6 S) ^5 _2 L( t
- z, e$ ~$ K5 \, b: f9 n& q
int main()
5 j: T7 b" P5 T4 d
{
N5 `) t' I2 _( Q$ {+ W8 Q' v. F) w
int fd;
2 c. t0 Q; d- c
int *mem = NULL;
- O! r s# D' z
2 d2 P& `/ O( D" Z: a7 Y* p
if((fd = open("/dev/mem", O_RDWR)) <0)
- x8 |; W/ [- ^
{
" C# A1 q& Y( W
perror("open error");
9 F# d. I/ N" O" m H9 f$ I
return -1;
5 u. g* Y: V7 v; K* ]2 }5 J
}
% Q. |! O7 I: H1 a0 D
/ F6 Q! B7 n/ T) X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 S% T( h& b. [8 E1 z% C) K0 s$ F$ A1 }
/ I0 T' z7 p' X- G- O' `
while(1)
( Z4 d0 G6 d6 F
{
2 y" y0 @7 B0 D: @( X1 @
read_MSG_buffer(mem);
. H) i& g, v) {3 i0 n' z3 u( f) w
}
2 S" r8 [! i: [
}
8 A( H1 i7 m6 t: V
; y! m8 Q. Z- H4 i# g) k6 V
void read_MSG_buffer(int *baseaddr)
1 a1 |" J a, W# l- n
{
) ^- Q& j4 d# S2 ?5 T$ [* e/ L
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ F7 Q' p; ~+ B# {, S7 t$ ^
+ ?4 Z9 q& G- f0 G F Z0 d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 e7 p& l! R% X: D% e& V; M' a
6 \; ~6 f8 C: T
if(pshreRAM->packet_cout != count_copy)
9 |9 D# s. d2 o# T
{
^% n3 E$ t% b$ G. }+ [+ f
printf("a is %d\n", pshreRAM->a);
% O4 v! T3 g& b/ ^9 f7 ^3 X8 f
printf("b is %d\n", pshreRAM->b);
. P, S+ G; s/ D5 |* Y- G4 [
printf("count is %d\n", pshreRAM->packet_cout);
% J. @5 y8 j2 \ f! x
count_copy = pshreRAM->packet_cout;
9 d+ S& ~" x8 s2 c- a; n
}
! u: i4 A h. ~
else
2 c, W1 o7 f% X6 b4 G
{
+ R0 i2 _" c/ h0 X; |
printf("No effective message!\n");
, O0 e3 K* r5 o" C$ `8 p4 M$ Z
}
: c4 d8 w" m2 z3 i& F% @+ D
}
" I& m% O. I) w& `
3 \. \& H% Z: O0 H, p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 L: p+ A1 H" G' S
* A/ p5 s( s7 }" X, u9 n- V" H
& q4 L8 t! f* m" B' Y% t, i" S# d
+ j) D; U; e; B2 e* }
* E Z; n( o L" M, r
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4