嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( b( e5 M* F' D) U) F* k) j6 W
2 K/ h; t3 `4 ?( B8 N0 ~8 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& Y# \' V7 S! O
#include <unistd.h>
) S5 Q/ b/ R' k
#include <sys/mman.h>
; N: k6 |: O' w& p- |
#include <sys/types.h>
3 E5 F. A+ h( {; o3 h
#include <fcntl.h>
9 n6 l+ d0 A3 s+ ]! v1 T: v P
$ C* N* h& a' Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
( v! L/ y( `" W& Z
( \+ l$ G1 ^9 P# Z* j$ _; Z6 ~' T) P; }
typedef struct
" r% s; b+ n; m" A: K* V( Q
{
- T! g# z, [" t. [* w" Q8 @5 e
unsigned int a;
: w" ]+ A" @/ C* e
unsigned int b;
3 ^$ C+ q' `; b7 ? |0 x+ e! `) @
unsigned int packet_cout;
! ]; s6 P: L) Q8 }" J3 |8 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ }- v r/ S6 [7 ]# N" p2 r
' K; t1 w! S6 ?) u( Z7 a) f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" b% Q" P7 n3 j
unsigned int count_copy = 0;
$ Y+ _; V$ E2 x+ l7 d" R
2 b+ x8 m" m P. g4 ^
! G. ^" b. X- [7 Z
int main()
W; {, H& k& n* U6 E& c0 e; |
{
2 O1 k0 [- I0 q% c( h
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 T/ \5 _) ^; M2 [' | A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 O" ^6 ?# ^( O4 n& N3 `5 W% n: f
7 Z! [$ f+ ?9 ~, r
while(1)
7 r7 J, z9 I1 b% {3 _( g, j
{
6 {: P% o' c1 C8 S z6 p
read_MSG_buffer(pshreRAM);
8 r0 [% h i5 z4 W
}
& d/ J: C: U" r
}
3 q; V, O& s% S6 Q9 H- q8 Z0 ?
+ t3 g6 M" j1 l1 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: ]* I9 S t4 w: X1 z) M4 }
{
+ T- v% K4 D+ u5 h! s: F+ X6 `
RX_MSG_PROTOCOL buf;
9 x/ i4 O7 C0 g. ?% |0 a' z+ I+ x
: q+ F/ L$ j. B2 s6 I2 S- q
buf.a = pshreRAM->a;
. x; q( d; w8 R8 O M$ Q8 _# {
buf.b = pshreRAM->b;
9 C. H$ r( X2 I$ S
buf.packet_cout = pshreRAM->packet_cout;
$ E# z4 Z' y+ ]( v2 Z
/ h T! d' l! C; {) S
if(buf.packet_cout != count_copy)
1 [! Y; L9 ~' u, b3 R8 f
{
* t+ E. ?' m0 a- C
printf("a is %d\n", buf.a);
) ?$ P1 [+ V( N: K4 j( e6 t3 i
printf("b is %d\n", buf.b);
2 i" t `* L2 K$ S& l) h- R
printf("count is %d\n", buf.packet_cout);
. e1 B, v6 |. W; I" u- [" \$ N. O
count_copy = buf.packet_cout;
5 t8 b2 y% z& m( G7 z' d! A
}
7 H. c |% m6 ]' G0 v4 M! t( b" C
else
& V" ~2 W1 }8 ]0 U4 d
{
1 D0 E# Y) U% k. |
printf("No effective message!");
& S2 J0 L' ^5 y- e8 f
}
2 A! f: ?2 ~0 n
}
* }3 B3 y0 x+ a1 k; \
& |/ i1 ]3 ?4 h( t+ b
5 P* x7 w, C( b5 o7 {1 O O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) x' c2 S; t% p3 G U+ P( Q
使用下面代码,对内存使用了mmap函数后:
: O @& ]' ]) Y# \& F
#include <stdio.h>
' k* s I/ ]) Q5 {. Z6 [8 X. ?5 A
#include <unistd.h>
' c6 {$ l" a: I! O" v8 i
#include <sys/mman.h>
' U; _1 r6 e& b2 m# x
#include <sys/types.h>
- |5 J! @2 L! s" i4 S* E
#include <fcntl.h>
1 |+ P9 A8 h! D' ]* M5 E
; o7 h, e x* X" h @
#define SHAER_RAM_BASE_ADDR (0x80000000)
; y5 u( c* I8 Q* K; v: C' v
#define SHAER_RAM_SIZE (0x20000)
" `9 p: y& A5 b D
6 p; w/ ~) Y X% W; i
typedef struct
% j2 y6 g+ }, I
{
8 k) D. _% [& L, `7 P
unsigned int a;
6 D& e/ @7 _* L& u: e6 A
unsigned int b;
1 g0 i7 x5 N/ H; y6 W) J
unsigned int packet_cout;
2 R" N! R6 Z7 V6 t' P* R/ n3 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. f: h4 |* Q9 O! @
, ~4 n/ q1 W3 t/ t
void read_MSG_buffer(int *baseaddr);
4 M2 m( @7 u V( l Y
unsigned int count_copy = 0;
. ]$ M: h0 v, J5 Q) [( u
) [2 C9 [+ \* t/ F8 d+ B, j- g
int main()
3 M. O0 w! l$ j* P) F; `/ u
{
6 ~) `1 B3 }) Q7 O' @+ M
int fd;
) e* B" D: k* Q- p4 I2 S4 e! y
int *mem = NULL;
3 K: a+ f e4 {/ }8 ?
* I" J! V# ]& {) L! ~- w
if((fd = open("/dev/mem", O_RDWR)) <0)
3 R! Q, t5 d1 F2 Z- q1 J
{
) h- q2 n" ^6 M3 r7 f- b
perror("open error");
: F* c( M5 f4 j7 R
return -1;
* t! r$ n5 n* ?' i6 B% q3 w
}
/ v! o' b5 T4 N
+ ?- E" F- k& v# O
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 g* y, Y, t- k6 }! ~& }8 _
7 O) z, {$ p8 A# Z1 O
while(1)
; ?* F. F) d4 a6 q. f# o8 b
{
" ?; H/ I( Q6 C/ T/ K2 q( O' E4 k
read_MSG_buffer(mem);
. L2 ]/ W: y! q- Y7 a0 E3 {1 a4 |9 O9 B
}
6 c" f8 l1 D' R! t
}
# e2 y p* X5 u" Q+ d
8 q" z* C0 L% J: G: ]- j) r& L
void read_MSG_buffer(int *baseaddr)
- ~: S# Q2 `8 l" i/ @
{
- ~; ]" o! ?' b' G3 N g+ x9 B/ r5 U
pRX_MSG_PROTOCOL pshreRAM = NULL;
# I, d5 v) I6 }' R' W" e* o: c
; H6 T! e, |. f! q3 r( B- D8 d, S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
}6 L3 j/ E- W% B# r6 N7 z, X
; H$ _& W: C; s/ D7 v ^
if(pshreRAM->packet_cout != count_copy)
4 O; e) ~/ M% g5 T* ?$ J0 q9 i
{
; d0 R* t+ C0 W
printf("a is %d\n", pshreRAM->a);
2 N3 Z8 W( k, \7 i
printf("b is %d\n", pshreRAM->b);
/ U) E+ @- r7 A: G$ q$ T
printf("count is %d\n", pshreRAM->packet_cout);
1 W4 d3 J: q/ [' h2 _- {" w+ M
count_copy = pshreRAM->packet_cout;
$ p, u3 ^3 J7 L
}
! y2 P B T# k* g r, h* q6 P/ L" B2 G
else
7 \6 H: ]2 [' W6 I% [
{
; Y! l- S. v2 o! ` ]3 B s" L( b
printf("No effective message!\n");
3 L; i# F4 r: M" k+ o4 G
}
3 ^( W3 Q; p f) p) z
}
7 U/ G& Q5 o. b7 m. Q! N
. e6 v! @& @0 A. g2 g5 l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ ]7 P3 W1 v6 n* B) w6 v
8 K( ]/ ~$ N( S: I a* c
2 a- {% J* T' j- P0 @
! |8 E% R. N6 ^: J% h9 X; I1 |
) m5 e4 G4 @( [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4