嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 J0 X9 r- ^( w4 E: c0 O7 }, K
/ B' U& i$ {5 ^+ X0 Q1 A2 E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# u1 ~1 @& ?; U& [9 @
#include <unistd.h>
4 T1 V4 \. y7 I# [8 A: V
#include <sys/mman.h>
2 b2 C& ~3 V4 o1 b( o- W
#include <sys/types.h>
7 U0 R4 p8 R- H( W9 @
#include <fcntl.h>
' x. ]' Z0 h2 P$ P% |' r
& n' y3 \& @/ N! ]0 H& I
#define SHAER_RAM_BASE_ADDR (0x80000000)
" C3 o0 a1 G& G# S3 n8 F$ o
5 g4 l7 ^2 q; t _
typedef struct
`' G/ D& a: U/ a, r/ i
{
9 t, O/ T3 w& [ }
unsigned int a;
) P3 S7 p$ C* D2 J" t) O, B' w
unsigned int b;
7 o& o* V2 F4 w' w
unsigned int packet_cout;
0 _% z2 w5 k- j; D% t; p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 U7 n9 z% l4 B2 ^+ @
; m9 ?, d0 u# @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" _8 D3 U, T8 ~7 C5 O
unsigned int count_copy = 0;
1 \+ x4 z6 e" ?, _3 u# O
+ L! M. {* L8 c
# } D3 p; S1 K! T5 H% z0 G" m m1 y
int main()
1 `# h. x4 @! x& r% I
{
, v! X0 R8 m! z2 C, H2 f0 G1 ^( |
pRX_MSG_PROTOCOL pshreRAM = NULL;
) d$ `- S8 k/ R; s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' f0 L% R8 y: X% I
Y0 B1 ~7 K5 E: a- o
while(1)
; H, A+ k* I4 O# \! C1 \7 @
{
2 `7 k% ~! V/ | {& x
read_MSG_buffer(pshreRAM);
9 I8 E1 D' @% b( n. N
}
, e/ a# ^! o( _0 y
}
8 q$ |) ~- v3 I3 ~7 n
( z7 v# l9 q' V/ r$ }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( e" i4 Z3 V( }. J* L% }
{
% {9 S+ r. L5 _$ N" R9 ?4 ~- j
RX_MSG_PROTOCOL buf;
1 z2 G( H+ \, n7 x D* J, ^% ^
& }/ g3 W/ p$ U9 ^7 c, C s" k
buf.a = pshreRAM->a;
( E2 B0 N' F6 F) D) \' n) z
buf.b = pshreRAM->b;
1 @( I1 L* E5 q! a
buf.packet_cout = pshreRAM->packet_cout;
" s# Q, d8 e( E: j, d
- P1 ~: C* l5 V) f: E
if(buf.packet_cout != count_copy)
" y) B4 j7 ^0 G, S: \( J
{
: F# M5 y8 v' Q4 D$ u" q
printf("a is %d\n", buf.a);
^& L0 c7 U& N; a- @% P- u' [
printf("b is %d\n", buf.b);
8 Y6 ^, ^# O3 ~6 u2 C
printf("count is %d\n", buf.packet_cout);
7 A- ^; N* g5 f
count_copy = buf.packet_cout;
: R4 n: A+ @8 Q+ _( j* y- y; J
}
/ [( g& O/ C, W# g1 {
else
9 c9 y5 O+ P* r0 C; Q' ^5 X1 R/ H
{
3 m) a! a8 L. [2 _- p% \
printf("No effective message!");
) g- ]7 R$ I4 \! A/ Z1 @" e
}
; P+ k9 {7 w2 ?3 O/ C
}
" l8 j2 Y& f, k, d% R
* V9 Y# e" [1 ]7 p5 W+ E5 O9 O D9 X5 G
$ s' ?! a9 F0 `: A: h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' l& V' j* r2 h+ l# m& c1 U% F1 [
使用下面代码,对内存使用了mmap函数后:
0 G" c9 i" O' Y! l$ _2 _* Z; x# |
#include <stdio.h>
1 d7 Y& w# b/ A# }
#include <unistd.h>
3 Q) A3 k" z$ I# F1 z9 ^, s2 d4 v
#include <sys/mman.h>
! ?8 h$ X q. s& }8 l% x L) w
#include <sys/types.h>
# ?1 @3 s, {8 R1 ~5 }
#include <fcntl.h>
; @8 X; W2 y5 {0 ]# Q
" C! z7 B9 s- k# O% ^4 ] u
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 M. }5 R4 P, {9 T
#define SHAER_RAM_SIZE (0x20000)
$ c+ N* i+ I# _6 c" \% ]+ E% Y Q F
5 I' E( Z7 x; U
typedef struct
$ I8 W0 W, {1 Y. V1 G! _% [, r5 U
{
9 U/ |; R. [9 M, ~! e
unsigned int a;
6 w( U6 m, g8 r0 R& B6 S
unsigned int b;
8 [& j3 N# `9 f
unsigned int packet_cout;
/ o0 [ m2 {5 i8 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 k% ] W3 M1 Q& g, k
% V& j$ V# W8 r! n
void read_MSG_buffer(int *baseaddr);
+ U& ~. }: q, g5 \- I. C
unsigned int count_copy = 0;
- M: C; {$ A E, Y# i
5 ~- p/ T% g. ]1 h8 _6 a8 {
int main()
* S, g! I! S; D# _) C: F
{
$ h' m+ R# N2 J* G& G. U
int fd;
K6 X+ g+ p8 N) o2 @
int *mem = NULL;
/ E/ ]# k: x1 q7 z" H
5 [( b" M3 J7 g8 Y
if((fd = open("/dev/mem", O_RDWR)) <0)
: z; T _" k# t" i) Q4 n
{
1 G7 ?/ ]+ ^+ j I% H$ _
perror("open error");
/ B; Q3 r: D+ F& v e, d) u
return -1;
. X* l7 g/ v7 S' n- ]* X3 K/ O
}
9 |4 v, z% U# ^$ r, ?& W1 J2 e# v( C
9 s' c' w4 d! V8 F- ~8 n( j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' x! N D- E$ s6 y5 Y" ~' z
; V& n& V% }- w o/ ?
while(1)
" s# V( \( Z! j7 x, R" b/ D+ x
{
! k( x, o3 r) U$ s9 @. V
read_MSG_buffer(mem);
! ]4 q8 P# v$ ]0 x- e4 ~4 x9 i
}
5 G( z8 g' G4 t2 V" C# M5 p
}
" X) w$ V) G) P5 F$ b
% T$ C. ?1 ^: Y% ~1 F# R$ V
void read_MSG_buffer(int *baseaddr)
: D- P! L$ o, A, |6 W8 t
{
; ~! D* u6 l. H, ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
" e% a% U) T3 r4 |
6 v( z0 d" T. F/ \8 g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 }4 N: E# X; _
. g6 A9 M+ }) g8 G# w- R9 D+ w
if(pshreRAM->packet_cout != count_copy)
/ k( f: D' x0 t/ ^
{
+ d5 G& K7 @+ ?: l; W
printf("a is %d\n", pshreRAM->a);
$ y/ `0 J# ^2 p& y
printf("b is %d\n", pshreRAM->b);
& \. M: t& {; R8 y# ~1 w
printf("count is %d\n", pshreRAM->packet_cout);
5 }! ]& _% Z( x- u3 m
count_copy = pshreRAM->packet_cout;
+ G2 t: X$ u% ~$ T
}
6 Y8 [/ D d b* G) R
else
$ Z9 v/ ~1 R! [1 K4 l
{
5 i. Y5 m& _+ I: f0 Q
printf("No effective message!\n");
' g) ?5 p" u- `4 ^
}
6 s+ n/ Q5 V2 k2 I) ^
}
# w! {1 ]# w0 p3 z+ T
- t% G& v( e8 \6 {7 F: b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: K1 y$ W3 P1 B' j$ b
' \6 E7 q' |3 ~9 W
# T. {1 q) @% P" a) R
6 P: E3 U& M( u9 E3 l6 o, \
& ]9 @& ~- P S5 {# @
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4