嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 R( q% n. u: h
# f6 X; C5 P2 q z. A0 S, v. `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 {' ~ g# [- t# G+ } g
#include <unistd.h>
2 w r1 `" t: G& r
#include <sys/mman.h>
0 q8 {0 a$ {) d9 L& \4 w, f$ p
#include <sys/types.h>
1 R- Y0 s% n( _8 L
#include <fcntl.h>
8 D& T3 c1 W2 O3 o4 U
" s* [. [0 X( V* z
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ E* r+ y1 D+ w. r( {4 B5 M& q# m
. c3 _, e3 p7 }: m9 w( t) o* f9 a
typedef struct
- Y% C, \" d3 O8 j
{
, J. e$ Q6 q( y, x
unsigned int a;
* L. d2 t) B: Z& P* P; C; l
unsigned int b;
9 X/ t4 d, r( v$ i' R1 m2 T2 e
unsigned int packet_cout;
$ m; U6 `0 p: o! U. w$ a. d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- {, Y s/ j+ l! a! n+ G7 ?
# {# F' D6 A" x8 T8 L1 @7 T& T, A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; l4 W+ g" X+ r
unsigned int count_copy = 0;
% r2 o* \- N! F9 C% \5 [
4 h1 }8 n; p0 Y
5 \8 }0 Q7 ?5 E6 y8 g* G& w
int main()
. v, g1 C9 }0 ~% E
{
" F7 ` w* }! k/ g3 L& U
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 e3 x" i& k: ^+ x, i' A% K+ S6 Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ t9 }0 p6 {1 V
# z) z( p+ H4 L* |/ D* u$ A
while(1)
: I3 |& k" p; S# ]
{
5 X! S6 s$ z: _5 \% c
read_MSG_buffer(pshreRAM);
2 F( _& ^8 }6 a/ j6 I
}
# T6 l; L8 ?5 k0 G
}
& A" P, J' ~8 G" e
/ A7 Q9 x7 Y' Z5 x; N7 e# I3 @9 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 w& d0 h# ~% a2 B) E
{
. @' P5 g) l& Z O1 P7 S
RX_MSG_PROTOCOL buf;
. k; K( m- c7 Z- V5 C( ~7 a6 a) V0 W
$ ^) r( _9 h/ V$ z E
buf.a = pshreRAM->a;
$ ]" N; w! L$ A& z
buf.b = pshreRAM->b;
) R8 s1 g7 Q- V; o: N; \0 Z3 \
buf.packet_cout = pshreRAM->packet_cout;
8 Z6 E( Z) O! r, {
+ T: D( d# R- F. q1 { G
if(buf.packet_cout != count_copy)
, {6 j1 v' c3 w" M
{
! h; r0 f* K. G+ A, C3 _7 e, w
printf("a is %d\n", buf.a);
- P8 k, N5 e! T, ^/ N
printf("b is %d\n", buf.b);
) m- s/ M, [ v0 a% |3 k9 h
printf("count is %d\n", buf.packet_cout);
0 P7 i" w$ h9 p; G. \
count_copy = buf.packet_cout;
( J" W7 s9 g7 [7 l) n3 E+ @
}
$ A6 V6 A: n, `- b
else
Y7 p# k% ? d3 S+ Y: P
{
% o4 C' N$ Y' n9 _
printf("No effective message!");
7 E: K9 X4 n) u% G7 o" `2 `9 r
}
" d Y1 d" \& z( d8 h
}
% }) m7 v# K& o6 o8 J# k# ^+ C
n9 q/ p5 y$ c- P
7 @& [% t, `0 m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ J. d. G! ~8 [, S; E) C0 y; Y
使用下面代码,对内存使用了mmap函数后:
, S; m2 a( U3 ?2 D
#include <stdio.h>
$ S, o8 W! l9 `- V
#include <unistd.h>
# l7 s: |1 m K" x! y' U1 d
#include <sys/mman.h>
/ r. G; @( C1 H: ]& [
#include <sys/types.h>
+ ]. I# E( `2 g) _ O0 D
#include <fcntl.h>
" v1 R3 L: ?! o" l" n
|; t% B b6 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
! p" _8 |6 g, R6 e
#define SHAER_RAM_SIZE (0x20000)
/ C" N* m- U# h- T
. D; u U) C9 _' e5 }5 F2 T
typedef struct
+ P* t. | X$ s# @% N0 H
{
. w* e- a3 [# l1 m& K: [; B
unsigned int a;
1 E% Q. C x6 t% ^4 r
unsigned int b;
2 _8 r% @1 m+ X- m) i/ s- ]
unsigned int packet_cout;
+ ^$ V/ e& V/ W, X: z1 o" J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e# x: ~ T' X. S3 J$ q5 L9 M' M( o
7 ?* f4 z: x3 Y. \' w
void read_MSG_buffer(int *baseaddr);
6 z: r# @9 Y6 K9 ~3 c# {
unsigned int count_copy = 0;
% U$ q7 d A: z! O8 }
( v* W% f, R& @
int main()
" k; P' B! { G! a7 L9 ?
{
% M+ z; @, J! e7 _9 }! @
int fd;
3 M) t& m0 B3 S: ^% c* W
int *mem = NULL;
6 r; q2 R& C( @; P
: `! n! j& z: H+ w
if((fd = open("/dev/mem", O_RDWR)) <0)
O5 D! N+ `, x' X% E
{
6 K( j* O+ L8 i$ E4 x0 s' w
perror("open error");
0 p4 ^5 Y4 Z2 N4 j, }0 N
return -1;
3 c& B7 s5 e1 M, G4 @% U$ n0 ^7 Y
}
. C) t1 b9 N- O; x3 L1 F( e& q
4 i `! |8 d$ s) C4 F. P9 L O, `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 r0 a( F) ]- y! a5 r# {
2 i, p$ @ _3 h4 N
while(1)
, p: y0 M4 ~; m3 u6 r$ }
{
' c5 ~; |4 n5 q; j' b/ b* L0 g" z
read_MSG_buffer(mem);
5 z# l h, u* [ R+ Q
}
" r5 g( F; x& _# F
}
2 h, S7 K* Q4 v% i0 ~2 \
* C8 B- g) ~* S9 M; T& |
void read_MSG_buffer(int *baseaddr)
6 h6 V+ y1 Y& m. I8 e" Q( b
{
: ], m& w% ?$ Z9 F8 `
pRX_MSG_PROTOCOL pshreRAM = NULL;
% b' v9 G; y1 W( h+ I/ N5 l; g
; p8 [ z: C) @$ ~- \
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- z. z7 V4 U! f: I3 o! ]" x
/ ?1 E7 l5 h; p" f+ o
if(pshreRAM->packet_cout != count_copy)
) J6 H% V7 h; [4 l3 ?; a
{
) p0 N3 s; m0 p, m
printf("a is %d\n", pshreRAM->a);
* A* i; J+ {/ a
printf("b is %d\n", pshreRAM->b);
- c+ h% j8 A: t8 K6 o: y6 ]4 `
printf("count is %d\n", pshreRAM->packet_cout);
: f. `1 d) Z. B# h, h
count_copy = pshreRAM->packet_cout;
0 o$ \3 A5 }% N1 b$ j) y
}
# K+ p, P1 n1 O; [0 i9 @6 E
else
* `! s- n6 F/ V% g5 P
{
* N6 h( E: b; n9 m+ g8 e
printf("No effective message!\n");
! k2 r7 Z. H4 M: J. \: a
}
1 O# u! }. L- { L; S; |
}
& O$ l/ h4 f7 }
3 F, m7 O& K8 z& j7 w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ z# a/ L8 v/ c6 o
5 S9 v4 F' p( l% ~+ X
5 h# I, g8 j5 f8 ]' b1 D! p
: v8 b. c* r( M+ j
/ B- Y( k" _$ R9 N
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4