嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 U. j/ C! G) i
7 x& `& H+ O/ r2 e+ Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 g1 D, s' E/ Y" J3 N& ^8 j3 B
#include <unistd.h>
: l A+ N7 H: t8 N8 `
#include <sys/mman.h>
: |: f; v3 a d! Y6 A
#include <sys/types.h>
+ Y. V, \. [ S
#include <fcntl.h>
- p+ `2 |5 u3 h/ M7 A7 ^: b* q+ \# E
. y2 ?& H- d0 q
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 X; F0 p, h. E* q e I
4 m& Q% H3 ]- t( b0 }
typedef struct
( N+ U/ ^8 J4 W3 }6 x% u' K$ z
{
' b }0 s& ], g D: p# k$ U
unsigned int a;
9 U7 o4 s* l' c. M, `
unsigned int b;
4 |8 m. |/ s- h. E
unsigned int packet_cout;
( k. a- W8 S. S; _6 U+ G( t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 K# j* {6 l4 X1 ]' c/ Q7 i( \) m
; v' d J( |' h" Y' W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% v4 x% h4 R* K1 f1 C; a
unsigned int count_copy = 0;
7 [5 G% N1 b2 g3 f
- S- p" U# O3 o
, C. |4 }0 c+ z- p: X
int main()
& |( f7 k& P, i3 { j
{
; l+ h9 e6 Z5 y2 M) A
pRX_MSG_PROTOCOL pshreRAM = NULL;
* R0 i: L2 f3 v3 g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! R$ U3 O# e. H o Z
2 B$ K: m" |2 f1 ^1 ?/ x
while(1)
& g* A% Q, y4 Z, n/ [( G. I
{
0 g! F G# M$ d6 [7 ]( t
read_MSG_buffer(pshreRAM);
7 ]9 Q. h- j# t) A; w
}
1 R e* [3 R1 f, q6 H
}
# k3 t! J+ I9 `- e6 y0 i
' f B8 P# \7 J/ J) d% ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 W- C7 p% \' u2 G6 T
{
( ?8 ?" o6 I' x# V( l& D3 v
RX_MSG_PROTOCOL buf;
1 Y! \( G* s" s |3 X) ~
5 q/ x. r/ J8 P6 e7 ^- y
buf.a = pshreRAM->a;
" h& D! F0 _, L- O
buf.b = pshreRAM->b;
_6 i1 M. e4 o
buf.packet_cout = pshreRAM->packet_cout;
$ v8 T& y5 ]$ R3 u' Z9 t
+ H+ F* d' T: _6 `
if(buf.packet_cout != count_copy)
' w2 \; U& d; t6 U1 L
{
# @' Z3 ~, Z. }- u O9 G$ M
printf("a is %d\n", buf.a);
5 a; v, c3 ]5 `* X+ r2 V. P
printf("b is %d\n", buf.b);
0 g5 K6 n1 ?9 K, ^; u: B& }
printf("count is %d\n", buf.packet_cout);
) \& V9 T) @3 }$ w7 a
count_copy = buf.packet_cout;
) t C- h9 b h" [9 }& L
}
7 t7 W7 c. G" s5 J! G
else
5 P" M, D+ j8 Q& p
{
& V9 ?8 Y, b0 E9 Q; t+ b# r- t
printf("No effective message!");
& s3 ?- W& G2 z3 V% R9 Y
}
/ V; L$ x E; j7 f2 X
}
; N8 `/ }: Q n
- H/ }, ~2 {; ]* ?
& V( C5 B& Z g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: O& a2 N& A8 T& L
使用下面代码,对内存使用了mmap函数后:
- S8 I. i- ~6 O P$ C: M5 W" s
#include <stdio.h>
3 s4 d0 C) E, I3 p/ A! j
#include <unistd.h>
! d8 |3 G4 w1 {1 E# {
#include <sys/mman.h>
+ N! r% K# E* q
#include <sys/types.h>
T: X! ?2 ^( d, _2 \
#include <fcntl.h>
& i k3 c' W! m3 r3 j, @
! Q' n" ?: \* m% z+ ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ e! H, \* J2 B. ~
#define SHAER_RAM_SIZE (0x20000)
M8 j( ?! u( t, G- X; q- ^9 J# }3 U
/ K( S' B; x' P) A: a
typedef struct
7 H' X$ I. q T6 L; Z
{
4 Z2 j5 U4 o7 x |1 R: K
unsigned int a;
% ?- G" i% _& j v3 m
unsigned int b;
e% T1 {2 l/ s7 [# _2 k
unsigned int packet_cout;
; ^& C( C- d; z5 r0 T( ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* z$ h; x# d$ l$ T# ~
; q+ {/ R$ I. _9 y% h$ \- r
void read_MSG_buffer(int *baseaddr);
1 I; D2 S. ^1 T- {5 b! N/ ?, ? o
unsigned int count_copy = 0;
3 O- A9 s/ [ o( }5 {8 B
: P, O5 h2 r9 B- v* t7 x
int main()
: C, j/ ~' c3 W+ |
{
( h% l* g4 X4 q* S5 V s. z
int fd;
1 ^3 O2 m2 H2 d% [8 y/ t8 t
int *mem = NULL;
' S) _+ D1 c4 j; c9 t
1 `; J7 { F2 u+ |$ {
if((fd = open("/dev/mem", O_RDWR)) <0)
5 w# H% N0 [6 C( {4 g' ^
{
; V* g# m6 B7 D. t
perror("open error");
" i9 v) k: m. ]5 C! P
return -1;
x, t, c. x( |! T7 F0 z
}
! \$ M# T( {; d
, a! Q+ g7 H7 y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( s0 h5 l) L" l: S }4 R9 r2 }
r3 `4 t# I+ R- K8 ]( k0 l
while(1)
+ c3 n5 N/ _4 c- p7 i) j
{
H F! K N6 n6 f+ }, Z$ R
read_MSG_buffer(mem);
. l) }& @+ A; r* ?* K
}
; ~( C$ {$ n5 ` v; v
}
T ^2 S0 Q, p4 d
7 n# D* D0 `6 P. K8 u7 D
void read_MSG_buffer(int *baseaddr)
9 h5 Z. W& Y/ m8 o
{
# l# t& |6 j* o, t
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 c8 j. \2 x4 H# H
! L+ J0 R4 `7 M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& W# s3 N9 f8 a( j: c @. J
- Y& P {$ n% ?4 s$ J
if(pshreRAM->packet_cout != count_copy)
+ l2 F! f! L3 \2 m/ X
{
: E4 G4 Z) L+ I; r* B
printf("a is %d\n", pshreRAM->a);
* _/ y! Q+ [ H' Q$ i! u
printf("b is %d\n", pshreRAM->b);
6 W$ b7 O/ `, ~1 H# a1 z7 Y
printf("count is %d\n", pshreRAM->packet_cout);
3 p8 D+ k1 @$ I4 V3 _; l' k# @
count_copy = pshreRAM->packet_cout;
! c& B0 y; W. A; T2 ]/ a1 ^7 e
}
' n5 O' F& h1 i0 t! Z L* w6 G
else
: H4 F4 J" d) i- q
{
! h+ l8 I' ?- ^8 W( |
printf("No effective message!\n");
; y5 `$ W0 n$ G8 U; A* j; h, N
}
6 d% x! {- ], m- Z- ~* z9 ?7 M
}
5 e6 ]- ?5 {- X- {& |( ?
U- I7 {. c4 v, G# q: \% ~8 N. a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 d! |& A2 p7 y) E B1 M8 L
, L% v- n# L0 h0 X& H. A4 \) N
* }; ^1 V9 k' g$ L; s* k# D6 s
, B5 J. J6 E# t. v- V% _* D
: M" d# \3 ]) A
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4