嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 [& h, o4 r7 f6 u' T
* w8 i6 ?: g' V$ Q E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 D# T" y3 g" n5 m$ ]6 d
#include <unistd.h>
6 E \! ^: d' Q& N
#include <sys/mman.h>
7 o' r9 d7 j1 C
#include <sys/types.h>
1 Q c w; V3 m8 c2 |9 R
#include <fcntl.h>
& W7 V/ q7 C5 E' d, K0 l0 \; n# i
$ F2 _! T! t( b* s* n0 _& ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
) y, N$ }# S8 N& G9 W
. z& ~1 L5 h8 d* W N% V
typedef struct
z( L) T" T k1 L
{
" V1 |% T" v: Q* g
unsigned int a;
9 A1 s( E% @% J
unsigned int b;
$ `0 ?3 j! l8 R& K: @& q% @
unsigned int packet_cout;
6 C4 j+ D7 X D1 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; {) e4 r2 {2 Q0 V* T1 P
5 l+ _1 U* {4 K$ R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( X. \3 S5 u2 m4 \ l
unsigned int count_copy = 0;
! w X: f3 ~7 B* X; Y2 n+ H$ A( S, o
; ]3 B, E, c; g% A" m
' _( }1 h/ W) N2 L4 n. ?
int main()
/ E2 J/ G' P5 ^: Z5 |' f6 U
{
" P/ O2 Q4 c, O2 V; ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 b' Q) t& N' y! j% L7 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( m, ~; ^# T' S8 q) W6 {; u6 r3 @
, B, L( l9 ~" t( n0 g
while(1)
; W7 b, D b5 H d
{
4 p# E" n# L% h5 T
read_MSG_buffer(pshreRAM);
2 D8 e- x5 p# m5 @# J Z
}
# M+ M, x' M' R
}
9 J; W( Y% N1 q$ p
& D/ z* M* U4 ~ X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 L( C$ _4 @ x( i8 N
{
, g" E9 s0 u9 T8 d
RX_MSG_PROTOCOL buf;
. ~4 i% \% v0 q8 o/ I: y: q
, t$ z: G# m& q7 d/ K
buf.a = pshreRAM->a;
, N+ j6 ?5 H% J" ]8 ~
buf.b = pshreRAM->b;
2 c+ h3 A3 l% }. s
buf.packet_cout = pshreRAM->packet_cout;
+ r; G2 m$ T2 |8 {+ }& d
( W4 s) I. H7 `. l# u
if(buf.packet_cout != count_copy)
6 }# C' B2 y0 p# Q9 |# X
{
7 n1 k8 h7 h3 x$ s9 W
printf("a is %d\n", buf.a);
! c, B4 q6 n! Y! k/ P7 J
printf("b is %d\n", buf.b);
8 b2 E. B N. p* f; b
printf("count is %d\n", buf.packet_cout);
6 k2 e9 }! ~. `7 b
count_copy = buf.packet_cout;
/ F( J3 o* z- L" m/ \0 m
}
. y7 V; A: ~" d6 E
else
f* F* \3 B! V$ C! c9 f( G
{
8 A5 G8 o: Q8 `9 _0 T1 s$ \2 V1 _) ?' F
printf("No effective message!");
& U7 {9 C0 `7 A: e/ L) m& d
}
+ J; P/ ?0 ~- V9 D
}
# |( t+ C a: m
' l8 Y2 Q5 A1 B
1 R9 v5 p4 p% h7 \8 [2 m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- [ o2 M5 C( I/ u0 B1 ]& H9 ~9 ?
使用下面代码,对内存使用了mmap函数后:
) J5 ]5 h8 z/ k' k H
#include <stdio.h>
" \ h; z' }0 Q6 z7 ?! E5 \7 {
#include <unistd.h>
9 Y8 H0 [( ~3 F
#include <sys/mman.h>
# m# T/ j4 D& f1 z$ G6 D+ G
#include <sys/types.h>
3 a4 a! ^! U, G! R
#include <fcntl.h>
2 r) r& F+ @' V6 K7 O
: e3 o% g+ K% z! p8 M
#define SHAER_RAM_BASE_ADDR (0x80000000)
. W. T8 R# E8 T+ f0 l' O! s
#define SHAER_RAM_SIZE (0x20000)
- l- w- z6 z# q! p
1 y# y7 h7 {* Y; W
typedef struct
* F) Q$ F+ P5 [# P
{
x7 H+ b" _" }; `; o/ v
unsigned int a;
; i/ Q" k$ e9 `4 N) e6 i
unsigned int b;
# @+ I" T+ U* g4 {
unsigned int packet_cout;
, F6 E1 l- ~0 b) m/ m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- P2 o! i( z, y# ~! Z; m9 q
" [" R1 `: v4 A) [ p, G1 m
void read_MSG_buffer(int *baseaddr);
2 C4 \$ P f: N$ l
unsigned int count_copy = 0;
* ?) E7 p$ @/ @& T# u. }; `# m( D
0 D% C7 f8 A7 c3 `5 {5 N" O- }
int main()
2 Q) X; k' B& x& K) d+ E
{
" [; p$ i$ T' n5 n
int fd;
$ [* ^2 T; W+ J& @! B; `
int *mem = NULL;
/ Y! Q- o, ^7 @$ D1 C+ U* J
+ P; S: p9 s( Z% h2 S" g( A
if((fd = open("/dev/mem", O_RDWR)) <0)
" ^$ ^/ [3 U- m3 X: h
{
! C. o- k: A' A+ u
perror("open error");
: z* c: T5 L- e' j1 s$ L) `/ c, i
return -1;
. k) s0 x1 U7 b& y1 {9 J
}
6 G: X# F+ L( u
3 n& `, k1 o( z* Z+ D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% q, G& ]9 A! y5 f8 h- U% K x5 ]
j3 ^' a& v& Z g- [
while(1)
3 n' z# |8 b+ z. n7 u0 Q
{
9 m* g: O7 R; {# F; b# x
read_MSG_buffer(mem);
9 H x. T! f/ f x0 i7 J/ g7 I
}
+ Y \7 k% u1 |7 y9 g7 [& h( N5 k( [8 y
}
' ^; G% V# X1 o
4 x/ y5 o I5 g* \6 N: O% o$ s( B* d
void read_MSG_buffer(int *baseaddr)
2 Y5 d0 Q* x: F, j( v$ L
{
/ k$ ~4 H! P9 g/ n( O/ M9 X1 }6 I
pRX_MSG_PROTOCOL pshreRAM = NULL;
) K: l0 H, l$ L
3 q( w% l. @; J* @& ]' B
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- Z4 m5 S* X4 o a+ f
0 B* t; D3 A+ I& _
if(pshreRAM->packet_cout != count_copy)
) u5 ?# ~4 u) _# Y$ C4 C, L
{
; q. F: z$ T8 Y8 q0 w4 x# X
printf("a is %d\n", pshreRAM->a);
. {5 t+ l* h8 B) I; U1 y7 \
printf("b is %d\n", pshreRAM->b);
( e3 H0 k/ o: `+ K1 Y# ^ b
printf("count is %d\n", pshreRAM->packet_cout);
0 D1 M E8 e& T
count_copy = pshreRAM->packet_cout;
; ], f4 d+ z M T+ e0 D7 p
}
) ]: z* d" H6 i3 a, u! X+ Y6 L x
else
8 h0 o2 i& J) @
{
+ a9 f0 ~/ @ W2 X& F
printf("No effective message!\n");
1 @5 j2 @ p; r4 ^$ I7 T
}
) ?2 G; E% W5 O6 u8 U
}
2 m2 y7 c/ _1 k
2 G. V' @7 e& p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& F- q" u% N0 S8 E) E6 ]" y" h
' M5 K2 S" e& t4 @0 H& o9 t
* a* Q t$ W1 } y
% Q0 N* `7 x1 ?+ Y) [) j7 Y) z
- ?5 m3 `4 Q* y, [; D" s
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4