嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 ?, y8 X6 \) @, j1 ]
3 e* P6 m* ?# u: ?& n& g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 F$ d# Z3 |8 f7 G
#include <unistd.h>
& S. ?/ N4 k& p: S* f6 {. ?* D
#include <sys/mman.h>
' k* F7 {& N8 e* X! W3 q6 y
#include <sys/types.h>
( p- x |$ X# x% A: T& o
#include <fcntl.h>
9 U1 s$ j. n* x9 R f8 U
* o. N9 f" a( h- _2 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 G/ E; J5 {* N+ s) e6 x b# i
! x3 d3 n2 a$ ?9 h9 r9 @8 Q1 Y
typedef struct
2 l: I0 i) _+ S4 U9 Z# @
{
* |% ~8 u9 R; N
unsigned int a;
3 ^. e; z$ O6 [/ d V5 J& A
unsigned int b;
' T$ z F' p3 o9 p' n8 c
unsigned int packet_cout;
2 ]* p. p, g+ N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 t/ i# A; \8 e, ?1 @* ]5 s
s! u" {3 [# W" w! o' x# L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 Y1 ?+ _8 R% S, W. r& s) u& ?
unsigned int count_copy = 0;
/ M" q' G1 K$ D* w$ l* z( D( X' L
0 j$ i! B. Q$ u& [: W
. @6 Q9 s5 k/ X. p, R5 G# A) ^: i
int main()
& U$ r' X# @ s2 c( c4 S% h5 r
{
7 K% s& i5 P( q2 A5 e
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 M, H& j$ Z5 X- s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& O0 D& z7 o G
7 `* I; o5 ]% Q* m: h* C7 T
while(1)
1 D6 h3 i, N% v, d
{
1 d4 c8 a+ a7 z+ l4 u
read_MSG_buffer(pshreRAM);
; |* f7 ^# Z6 |$ E- B
}
C* m8 x, v4 k0 d& M
}
4 f# P. u- T }7 y: o2 }0 F; l
* Z9 V% G4 q' b8 T6 J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 u# _6 E# `% L$ M L. i% q6 g" Q
{
) f4 N7 [( @7 x
RX_MSG_PROTOCOL buf;
) p f, a0 }' v) a4 J
3 ~8 b$ u4 }1 p2 [2 N$ v
buf.a = pshreRAM->a;
$ R4 L0 L* ~0 W& E/ O7 p
buf.b = pshreRAM->b;
3 e* t# }9 d0 A& U0 E8 W' t
buf.packet_cout = pshreRAM->packet_cout;
9 b( C) y" [1 Y; g8 F8 ^
, _8 r! H' d& D4 x
if(buf.packet_cout != count_copy)
0 S4 O$ j( {6 m) Q* l5 l
{
( M5 y3 i& V7 M- v1 A/ ~
printf("a is %d\n", buf.a);
2 K% ]8 N& C# X. M9 b: s+ U
printf("b is %d\n", buf.b);
) q" k! s+ C' {5 U3 V+ {
printf("count is %d\n", buf.packet_cout);
4 T* Q5 t4 p7 H2 |# E4 M
count_copy = buf.packet_cout;
- c7 o" v5 E! s( c# B. _. T- Z
}
0 n* G4 _) u: R# L8 v
else
! \3 T0 t4 @6 e& M9 L
{
$ D/ l' `' v2 \4 o4 f# G. i* |
printf("No effective message!");
5 ?, P- `& X. G/ W* C
}
( a9 T/ c+ q- j! c5 h& _
}
+ E3 W0 A" ^9 `( K. l3 g+ i
) M+ E* @2 P1 |4 \; h
* a- ^7 k, _8 X2 D7 l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* y$ l" p; W! E/ v4 s0 V* L0 z
使用下面代码,对内存使用了mmap函数后:
+ X4 h# W0 s6 k$ R( C4 A3 C J
#include <stdio.h>
9 F7 j. ~% l, N8 q5 Q) ^' R$ [5 I
#include <unistd.h>
w. d9 }* q; g+ m: b
#include <sys/mman.h>
6 _9 p) U" F& P6 U1 q0 S' }0 \) W( h
#include <sys/types.h>
5 @( t/ O) `/ [+ L
#include <fcntl.h>
( q4 J- X5 g7 x0 k% F8 k
0 e- \ T' ]5 n; P- s V+ j% m. b
#define SHAER_RAM_BASE_ADDR (0x80000000)
( g" D6 h A9 L% M1 ?' f
#define SHAER_RAM_SIZE (0x20000)
8 ^% |- o1 D7 U/ u3 u/ |1 T- [* J
; U* M4 p/ Y- c2 K+ I
typedef struct
- e7 m+ Y$ h; V7 I9 }. }2 E! @
{
. P# v. X' W2 p5 I& _6 @, b
unsigned int a;
# A& c: z0 c G" ~" I/ Y; o* k
unsigned int b;
& T% h2 k* |" _- V% G
unsigned int packet_cout;
7 q8 H( @! I* S! N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 I z! ^$ I+ v9 {! k: V
+ H4 X/ e; p4 p& z, ]% M* k1 q
void read_MSG_buffer(int *baseaddr);
* T9 p# C/ P1 W! K. Q7 w
unsigned int count_copy = 0;
7 Q L5 z1 x% b
6 Z: u" d) O. y& u, k4 `
int main()
( i" k/ B; W2 k6 R6 Z. V$ j" E
{
( u0 S1 W, X/ ^2 f" z$ w
int fd;
~ u# {, ^1 R2 u' O- A4 M
int *mem = NULL;
# g8 q' W$ h' R; Z2 w
& ]# W0 H6 o9 }& ]+ c5 e3 l
if((fd = open("/dev/mem", O_RDWR)) <0)
( D3 i* d8 Q7 Z! ]
{
4 B- o) s1 ? f( d5 _& V% c
perror("open error");
% R9 t/ ~! G& l1 a) N4 Z4 M
return -1;
. a1 V e/ G, H6 B
}
3 D4 W% H4 A" w2 B
" B2 E Z3 Y( Y) I! `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" I) j. Y1 u- t" y' c0 J
( L9 G9 X& D' \, I& Q5 O: W
while(1)
9 |) C! U0 N" C- L. E# ]7 Y- F3 N
{
7 ~$ n4 l* ?$ U' I" d6 b* _0 X5 j5 V
read_MSG_buffer(mem);
6 o6 b X( ~' C8 u5 A& v: v
}
' p: \; g$ g; o" }5 Y2 p. k
}
& q6 j6 U% S$ k% `
* a' e0 `" J, p5 M. P, B
void read_MSG_buffer(int *baseaddr)
7 |1 s8 E. m3 ] i( i$ }
{
: I. R! w, \: X- d/ \( w
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ W" ~! _: c3 w8 v4 e
' s& ^* t( g a
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ n" H1 y( E8 k' I# o6 D3 }
% X6 s% o. Q$ u. P7 M
if(pshreRAM->packet_cout != count_copy)
J m4 e% F" K* V9 V( B/ {/ ]& p
{
+ x# m# A/ d. _; G) ~/ k( o
printf("a is %d\n", pshreRAM->a);
& v9 x* X' l/ G9 y5 [* q4 o1 c
printf("b is %d\n", pshreRAM->b);
' h; \4 @# T- j) F& X# h
printf("count is %d\n", pshreRAM->packet_cout);
, l% }3 `4 M% b! |3 Y' U( Y. @
count_copy = pshreRAM->packet_cout;
( d5 j6 d$ Y j% ?$ b3 B
}
( M" V+ f* }8 S/ K: Z4 x
else
5 |4 b. X# ?/ }1 S1 b$ I+ F. _
{
$ Q# `. P4 S5 {; c4 |5 |1 T5 o& d! {
printf("No effective message!\n");
: y4 q! o) ~( C; u8 K! ?4 Y# ~( P
}
o3 a" d( c, ~$ `$ ^! U
}
, v( a2 V: X- M0 Y+ E2 p
* P) ?8 ]2 _2 a: ?% {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& ^- V' j# {+ H
% x) n/ l' a% z5 g
! ^2 _3 g! t, v+ m |# q# e
! N5 Z5 a9 \% r3 ?. n
! Z. R! E! Z* ?/ }9 Q4 O6 \, |/ k
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4