嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, T8 p$ q& q9 ?+ D
! m9 ?/ r' m$ r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% |3 t, J! f* v2 ^& p
#include <unistd.h>
1 [# x" Q0 P: @- m: i. G
#include <sys/mman.h>
# s# W6 t! k6 z+ |% [" ^3 S
#include <sys/types.h>
8 T% S- g/ N9 M
#include <fcntl.h>
7 k4 q5 W: [9 S9 G! Q5 C
! {) h2 A0 F9 n
#define SHAER_RAM_BASE_ADDR (0x80000000)
G6 ^) L. e: \$ E6 `& O |7 u" S! _
3 A/ ]8 Q/ ~; u. L
typedef struct
) \2 L% O) w5 E) q8 l+ b6 i. R
{
) u+ n2 k( c; A5 p6 N: J7 y7 R
unsigned int a;
- `) z9 g2 a& a2 O* S
unsigned int b;
. a1 C: B3 x4 L6 f
unsigned int packet_cout;
2 V8 t' j; p6 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ M6 P" `) W. j
' N; P$ h0 R3 ?4 d* W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- h6 K( N# N/ U
unsigned int count_copy = 0;
0 W: x+ B* \5 u9 O9 L
8 y8 @3 O7 ^% a9 w
: y ^; L; z! V! f4 b4 P
int main()
( K! q+ `2 ~" j: o7 z j
{
b$ d' t; c/ s+ I- N
pRX_MSG_PROTOCOL pshreRAM = NULL;
- }( O# V/ p" r; X* R! l+ z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' J) v6 @9 `; i' c* j8 n: B
& v3 L3 J8 l5 }9 r8 l
while(1)
0 r" l: E" U7 p1 M
{
/ A) X& n5 A; ~# z
read_MSG_buffer(pshreRAM);
$ q, c( ?. y+ _2 z
}
. X, l6 z) k( f! ?+ U5 s
}
# u, y: A7 a1 k( }
6 m& H& I k4 m6 t' t5 o+ ] h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- M/ Q9 U8 n5 g8 Z+ w7 N% i, p @
{
3 T3 C8 U4 N- M. J4 X
RX_MSG_PROTOCOL buf;
: U, n5 t) `0 W' x: L1 S1 [( W
* K8 B9 J8 r+ b; h9 p2 n7 {) w
buf.a = pshreRAM->a;
# ~, Q. K$ }& _% u" c8 ~" u7 @8 a
buf.b = pshreRAM->b;
. D. [% J' b$ t( e5 q) U
buf.packet_cout = pshreRAM->packet_cout;
) h" O* ?( H+ @6 k! ?
3 D' G& }/ a( q' x8 X" T- _0 X
if(buf.packet_cout != count_copy)
/ w6 }' W& W& k( d+ F% P& l
{
; V) A3 F9 ~) r9 p i w+ w
printf("a is %d\n", buf.a);
* O4 U g* ?4 l- w7 r. O1 n% [
printf("b is %d\n", buf.b);
* W: L2 b8 e1 p- j( P" e
printf("count is %d\n", buf.packet_cout);
1 a/ o* s% k: T3 ~/ t9 E1 n! L9 q
count_copy = buf.packet_cout;
0 y2 ~! A- [! l' j
}
) T8 G" p6 F, c& ^: ]/ n# a
else
* {8 U" P! Z; s; Y
{
: ]$ S" a% `1 u
printf("No effective message!");
( l3 ] t2 M b1 x" k
}
, Q. c# o4 C V) l0 S0 V
}
) K( |! \2 h+ ~! l$ w; b
4 M( E1 r& @" X% _3 x0 q: z
0 \4 K0 d. }% P' D) ~, q& V2 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: b6 d/ a/ z! Q4 S* s [
使用下面代码,对内存使用了mmap函数后:
* a6 Y+ ^9 u% Y+ K' d. q
#include <stdio.h>
+ t# M) a: s @2 k# C6 L2 p
#include <unistd.h>
" J" E' K7 F; E1 w- k* F4 o/ J4 B
#include <sys/mman.h>
! ?2 v7 H" E% _4 Z6 O' m. Y
#include <sys/types.h>
) Q8 A2 g8 s" [. v% G0 A
#include <fcntl.h>
( ?- E/ u4 f6 @2 o6 d
$ |2 \' N3 M3 \6 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
% B( _& [1 e2 ~" k
#define SHAER_RAM_SIZE (0x20000)
, {3 d9 l4 q$ |& [
+ \8 Q& B: [, H' |7 R! V& L* O
typedef struct
2 \& W$ E: W' N& y- j7 q) |0 B2 Y
{
# [, @! X% `7 _1 K$ h8 u+ K
unsigned int a;
/ J" j/ a8 y, S) Z0 z- I% Q
unsigned int b;
0 @8 c7 f2 S0 C/ I0 S. {* ]
unsigned int packet_cout;
' T6 ^7 U! E; q* {' x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
b |: @ ?2 M
- D! \, y7 L( C4 o
void read_MSG_buffer(int *baseaddr);
, ~7 A: S3 @4 @$ C+ e" Q P$ A
unsigned int count_copy = 0;
. B& t( O4 K. f: X }, x1 R
' k" X. F- Z5 W) k
int main()
9 @, O1 u3 a) Z9 x
{
$ I% C6 H/ o3 M2 p; l
int fd;
. I2 X9 S( O' f
int *mem = NULL;
K: T, F$ c5 D n9 O% X" `# z
* ]1 `8 q! v0 x# H" P0 { P. _
if((fd = open("/dev/mem", O_RDWR)) <0)
$ L) C; d2 d1 o0 F
{
2 u& ~$ t9 B. w4 r. Q+ D+ u4 G
perror("open error");
% I/ m0 I- f; f' k0 T) G7 ]
return -1;
7 V2 e" _. i; k8 [5 F0 _* b
}
9 }3 B' J% D/ x0 {7 |+ |
/ J2 X. e* @- F# _; {9 G/ U. w
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 @% t, Q% [8 `2 e2 Q
6 o) |0 r) O% Q0 y% j# H
while(1)
, S# d* x/ V: |) o! o5 ^7 r2 l$ F/ K
{
* b3 ^( G" g+ z P9 N! D# k
read_MSG_buffer(mem);
* G+ |9 A# ] J* _$ q
}
- P) |7 {0 e6 t/ m3 x0 s1 c
}
% r+ }2 D0 U5 N7 x5 p
% i" ]0 g; {! X+ K0 |6 u0 t
void read_MSG_buffer(int *baseaddr)
6 e3 D" j9 ^/ W5 _9 {
{
; @+ {4 X6 w0 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
; J# D* n0 |$ a
. a1 ~- l! S3 n6 l5 v' A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ F; H5 M& M. J* m/ k2 f) O
7 P4 l! A4 |$ L* |. @
if(pshreRAM->packet_cout != count_copy)
: @* N1 b4 C% C
{
. a9 e. c" M3 A
printf("a is %d\n", pshreRAM->a);
' N# V& f7 Q! G( F
printf("b is %d\n", pshreRAM->b);
) ?4 }, f r& |+ H: |+ x2 x5 p
printf("count is %d\n", pshreRAM->packet_cout);
3 c. i2 ^& j! U, u1 r5 _
count_copy = pshreRAM->packet_cout;
7 b: I K* @4 Z7 }5 S
}
& y) h5 n" v9 p6 v: P6 m
else
. T, W* W9 ], [5 f. G% G
{
; z* D! r% B ^/ }; A6 m5 C _( A/ v
printf("No effective message!\n");
0 H# F' Y( T/ Y) N- {- a1 C5 k
}
: R/ k5 o( I6 n$ B9 t
}
" y( P" U7 W6 F& r. E0 B
9 i. m2 P9 c w, P6 I5 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% g; P1 R; x4 _+ z/ Y, O. q
8 c) A& H0 y2 V
/ H/ a5 u3 a' [0 o( h, W1 B
; n' s3 U8 B/ g9 D8 V- v' A
P! O* w4 J' f: O+ i6 S
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4