嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 L0 f, D6 Y( f/ H
& r4 R: A! E+ g0 w/ d* ^9 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
U( D" T' z( ^" e7 j X4 C) V0 u# q
#include <unistd.h>
- K: l$ O" D' t& V
#include <sys/mman.h>
& g4 p& R2 @$ A
#include <sys/types.h>
8 b1 k% I% z7 w; B
#include <fcntl.h>
. @ T, I+ n: D' Z0 _
7 A F7 e+ p/ g/ H( ]% S
#define SHAER_RAM_BASE_ADDR (0x80000000)
; \9 o, q* L# P: P+ _8 ^) }
" S% j5 t& e# k% i1 q
typedef struct
J9 y, g, F" j8 F- m4 G1 @! N0 U
{
7 q* Y, w, W, D1 O' c% h3 }9 G
unsigned int a;
; A8 S' S0 _. E/ T2 H
unsigned int b;
# w8 t$ E; s4 g7 N7 e- W
unsigned int packet_cout;
2 M! V* H( q) S( {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# K7 P2 [! q2 C9 J6 W" }
$ Q( z. ^5 Z% J4 I1 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! v' n U: Y0 ?, _( s) |
unsigned int count_copy = 0;
- g/ M; [! S* M) f8 m/ y6 F" r
( w1 y0 B; ?7 _! h2 h; w' K& y
% g/ D S4 w9 l
int main()
7 |6 t. A- Q" @+ B1 o+ p
{
! b( N X5 X) l( `
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ v/ I: }- s0 _5 W1 b }& f8 s( i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ C$ Z+ B. U6 o% a {+ G8 m
0 z4 m( e) B9 a% A8 ^$ h: ~
while(1)
% N5 T5 p% m' _7 K+ D
{
3 U1 V+ c7 S4 h* q) r* w
read_MSG_buffer(pshreRAM);
3 B. b3 Y2 R/ J6 N, P q ~
}
5 ]* V+ k5 P% @; _- S
}
5 i; x0 V% ~- H* q7 D/ H, A8 N
. y U/ G6 p2 z) d1 E+ r, Y' T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( D4 m5 H# B) Q
{
+ q# {# l* l# k, ^5 A" f
RX_MSG_PROTOCOL buf;
: K% u6 n4 }, E9 b
( [# ]% n- P; R+ a
buf.a = pshreRAM->a;
2 N! j; w5 n1 ~ _5 h5 `3 u
buf.b = pshreRAM->b;
4 A- e4 f: w# s5 C1 \& ~% E
buf.packet_cout = pshreRAM->packet_cout;
: U: U6 ~. U. {2 _. F
: a5 [- {2 s# i0 U9 U$ x+ a
if(buf.packet_cout != count_copy)
% G1 d4 s4 A7 X& T) |5 E
{
* T9 m+ P5 H3 g
printf("a is %d\n", buf.a);
2 I4 [- w6 Z/ H( C$ R9 e; h4 v; j
printf("b is %d\n", buf.b);
" K4 N4 |- w! Y& q! k
printf("count is %d\n", buf.packet_cout);
( B+ P. A1 L! I1 T! O
count_copy = buf.packet_cout;
/ _2 r6 m! u' l
}
* W; q7 u( }- F* b
else
3 A0 E9 Y2 \, Q; }& ]
{
4 ]8 n$ `7 d |
printf("No effective message!");
& ?. S+ B# S0 [+ d7 v i
}
9 P( l M: s0 U6 x+ M* C& x. m
}
2 l1 m# _* {9 |; T& c
$ J4 K: r1 m1 L6 y6 E/ W! g
) \4 [* f4 w) ^9 t% W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% ~2 l5 I8 X2 e9 N) i2 v
使用下面代码,对内存使用了mmap函数后:
8 J. h S1 s- W% R& Z/ f
#include <stdio.h>
( _1 p, Q/ w2 R' p$ n* Q/ o
#include <unistd.h>
6 w( A: c) K( f7 C
#include <sys/mman.h>
- A) K/ @. X: E4 V4 A; J
#include <sys/types.h>
. v% ?" V7 ?7 W3 }' c
#include <fcntl.h>
: g0 W2 D% c( K/ D9 n. O
' l' \# S1 P4 A& |
#define SHAER_RAM_BASE_ADDR (0x80000000)
" O8 V' R% U% O
#define SHAER_RAM_SIZE (0x20000)
: y- P2 L- Y+ n* m0 ^& d
5 y- x8 q+ V: t% w7 }
typedef struct
: I; S9 ]% `$ x6 N
{
]: C9 {3 W3 r. ]& C X$ S
unsigned int a;
' p5 |& F" n( L: Z; l6 n
unsigned int b;
) T" z6 d$ u4 X+ {8 w
unsigned int packet_cout;
6 `& {% N# Y7 j2 W" R- O9 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 a" Q1 }& K: ~( p8 l$ J+ R- x
* r& z' K3 h! m7 S" Z' U2 X9 ~: ^$ E
void read_MSG_buffer(int *baseaddr);
; ~% t/ D' q4 x% Q9 W: b
unsigned int count_copy = 0;
1 G& q& m; a+ o- n) z- i
. Y9 |& E6 h& @6 V ~' T
int main()
/ r2 s" R% B7 E" R
{
/ a9 c W# b3 l- Q$ R* `, {. F
int fd;
' U' b% z! k3 P3 b- ~2 z
int *mem = NULL;
! v+ \5 f! A D" t- o% A
1 k6 P' \0 t- F/ C+ P6 I1 H# \: I
if((fd = open("/dev/mem", O_RDWR)) <0)
/ S* ]8 d& h2 M* `1 }+ f
{
! D+ }& e2 K4 i
perror("open error");
. n/ v8 {; k9 [* p" G
return -1;
9 H2 ~ P- ^; j: j! o
}
3 D0 L1 J7 x7 W
8 e/ L8 G) ?8 H# Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 l# @" M R% V! \6 x
$ Q! I7 E* y& `+ Y' z
while(1)
. ^' [/ z( t1 O0 e2 s7 ~$ z
{
9 k5 r9 `: K" ^
read_MSG_buffer(mem);
) R3 z+ w) K0 G' d( N$ c
}
~. E+ q. e! r& T* N
}
" i0 B" s5 H9 B
: W% u3 {, u& N% i. I6 s! T
void read_MSG_buffer(int *baseaddr)
5 K, Z9 {3 O. e/ ~ b9 s3 j
{
( y; }$ T, A/ K
pRX_MSG_PROTOCOL pshreRAM = NULL;
" q: R/ z6 [% ?% g$ ^& M
5 j5 P, R2 l5 T) m( V% s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ O3 ^7 o# z" D- E# [4 U
7 ~. I6 z* J* j/ x' e- I( k$ J
if(pshreRAM->packet_cout != count_copy)
" B* c) r8 F$ _7 C& w* ^$ W7 R
{
+ E" ?7 J( m$ ^2 b
printf("a is %d\n", pshreRAM->a);
6 a2 s5 m8 k: P; |, r, a4 r
printf("b is %d\n", pshreRAM->b);
8 k1 A; q+ u1 A8 g) F2 P
printf("count is %d\n", pshreRAM->packet_cout);
5 H( ]$ S& f; j7 z
count_copy = pshreRAM->packet_cout;
7 [% y( M1 K6 |' j# }
}
) M. z5 t X1 a
else
3 U: |! H, T# ?. _/ N ]: \& @
{
, l( H; ]- i0 z# o* i8 g9 t
printf("No effective message!\n");
- w4 v; D6 R! q# s
}
( q: A* d$ K: q4 D5 ~3 d
}
7 Z2 V* n; d, |& F; E- f
9 _* Q. S" c2 w( A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- _0 t, B2 V# { X3 w
2 O/ F b' K* C( l+ E
; w' ? y8 `- H& o" h* L& h
/ Z9 {+ |: y8 ] L# N* W# D
& e/ E9 M2 w* W9 t
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4