嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 H& n$ M& K- ]# c( u6 S" V
* t8 M7 ]- \3 I3 u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! N3 V8 l5 s& o- P0 @+ @
#include <unistd.h>
$ q( a7 o! F+ g- ^2 y* }/ d
#include <sys/mman.h>
9 }) u2 x! @# a! }" O+ Q- D
#include <sys/types.h>
" q; `3 F: @4 @. ]# M
#include <fcntl.h>
& v4 T# l4 @. g8 D& |; ]( k
: G# P9 I" |4 F( Z8 V* L# _
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 L- g9 {: N3 ^ S/ {3 T
" I+ E: K1 Q$ U( B: b/ v: v
typedef struct
6 r8 B; G4 F1 ]) C6 s, ^
{
6 w9 \, M2 C, _) d- |
unsigned int a;
2 J! `8 {4 Z& _+ V2 n) @
unsigned int b;
o3 D% D$ g& B; Y
unsigned int packet_cout;
- v4 d& o3 f7 F! ]0 {" ?+ Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% L* t7 l' ^' F! N
) M* _# m4 D6 O! [5 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. z6 ^' p# J3 l2 N
unsigned int count_copy = 0;
3 I+ @4 A9 c5 \8 S6 ?/ B6 h
Y2 v* F4 e) ~& ?3 O" w: n
0 l3 W: Z D# \! S u8 y
int main()
3 L7 h% `7 ~6 U( a; |3 N
{
8 L4 N) v3 V" N& c8 h& J: Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 l/ Z5 p- i6 y4 v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, s1 w) R3 F G; l# c q
+ ^+ ?( N& }2 V* E! |
while(1)
% h) P$ y- z' b7 E
{
( z# b) N( Z& z6 r
read_MSG_buffer(pshreRAM);
1 J: v+ i9 j$ i7 J4 z* ]
}
4 y6 r9 l( i9 B9 r
}
/ {0 N7 W$ \: C8 E; I3 T. G
4 X: S, w9 l2 }( k7 D6 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ d/ Y3 H4 @: E, G% Q/ b: i# E
{
4 G) }" R7 I" Z* [1 i) g
RX_MSG_PROTOCOL buf;
# ?6 [- l; d. z3 n' ]+ d
? X# |9 A5 w
buf.a = pshreRAM->a;
. l- a* n, D" i- D s
buf.b = pshreRAM->b;
8 H2 I- ?: x9 E8 m! X
buf.packet_cout = pshreRAM->packet_cout;
3 \* |) G, S1 X
2 h$ U" k: d$ V6 ^: V9 Y
if(buf.packet_cout != count_copy)
1 ^! U7 `( Z3 G; E3 g( ]' A
{
6 }4 b& z: A' a, p6 `2 w
printf("a is %d\n", buf.a);
) a) Y) A/ f! S/ m- ?8 V# ]
printf("b is %d\n", buf.b);
% p+ p! }9 w5 f1 c$ i% z
printf("count is %d\n", buf.packet_cout);
2 z) L1 Z! d" y
count_copy = buf.packet_cout;
. f' _1 H6 z- l1 A% e* y' `
}
5 S3 W* {. l( P0 F3 _& j
else
; ^: H2 T' X3 g7 \3 l) |1 v6 c1 j# p
{
' ]- l- X# t+ E2 m( ?
printf("No effective message!");
8 ]' T8 e' b( }. S( i) c$ W7 L i
}
# k4 v6 m, l, f& F3 Z
}
3 m6 i3 ?7 X, E
( L0 ^$ Z+ \' [
' L+ a' o$ _' w& n4 |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 M- s, D; s% p
使用下面代码,对内存使用了mmap函数后:
$ T' f% N6 p4 ?* n9 \5 J9 P$ q
#include <stdio.h>
$ W) b7 c& {, O3 r
#include <unistd.h>
0 d5 U1 a, g( A$ N
#include <sys/mman.h>
3 x7 y. A8 }+ R: f; V0 Q( }, Q, r
#include <sys/types.h>
% e, y- t3 G0 |5 Z4 ^' v3 S" @
#include <fcntl.h>
8 T/ b7 n3 X- B3 ~0 n
( e" j& Z: B$ i# J# W0 I
#define SHAER_RAM_BASE_ADDR (0x80000000)
# z, K, i4 _! V$ O3 r C* z/ [
#define SHAER_RAM_SIZE (0x20000)
/ W- Q" u* X$ r9 @: d; p! }7 Z
7 {. S* p. v: F( O9 V% G# M* s8 B; G
typedef struct
' Z) v, H; s5 Y! u
{
5 R* W1 r% j# ^& t/ ]0 h& ]
unsigned int a;
9 G2 _: h8 s0 L$ R
unsigned int b;
. X8 Q+ Q9 ^6 _% N! h
unsigned int packet_cout;
$ ^% d. s* D/ a, L- a# Q: Z/ U3 V/ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* [) l+ }5 w. t% E* J
+ R n V' q$ H* ~) F- y
void read_MSG_buffer(int *baseaddr);
7 Q0 I2 r- _% q2 S6 }2 T1 N
unsigned int count_copy = 0;
. I, O$ w2 P8 z2 G% o/ e) s
( h& {* v3 n8 { U2 K2 e* p3 I
int main()
% w8 Z; k J9 B/ V9 J4 m
{
4 I& a. @. [9 _, @1 C4 C9 v. G* P# Y
int fd;
6 V% X6 r' K' [* i0 W9 o4 a
int *mem = NULL;
9 L& E( e" g2 I1 y
3 z" x- d* g. ~ P; t% c, b
if((fd = open("/dev/mem", O_RDWR)) <0)
2 Q; I+ z b y) d
{
: V* I; O$ k% ?
perror("open error");
0 C% M& V5 P, J( w
return -1;
8 j- c1 k8 _ K$ s" f3 T' c- }
}
6 h4 d0 W) {$ Y3 U
4 i$ Q0 Z1 q0 J+ Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 D) f+ g+ A) I; w8 Y( B6 U
8 Z2 f' H. y& n% D0 W
while(1)
2 ?; C9 X9 `7 C5 J$ L9 M. d
{
5 X0 Z0 n! F: ^) l6 p
read_MSG_buffer(mem);
' j" J& N& W, W# M9 [# c
}
. t3 q2 I7 \1 D0 Y+ m: z
}
# i& v, C: w* `
1 t( J/ U( Z2 j& g L7 k0 o
void read_MSG_buffer(int *baseaddr)
2 k; Z5 d- G; [' x
{
. O f; ~7 T5 ]2 G v
pRX_MSG_PROTOCOL pshreRAM = NULL;
- B& r3 U' C \/ t
$ t# U& f! {+ D9 A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 r/ z" j$ }* V/ y% c
$ }+ ~1 }6 z; l+ h! H# z. w2 m6 f
if(pshreRAM->packet_cout != count_copy)
/ [. W# @) P% L- V) c% ]
{
) ?0 P" e2 ], R7 C2 l
printf("a is %d\n", pshreRAM->a);
- P! V5 A; X0 _& j& {
printf("b is %d\n", pshreRAM->b);
3 w7 x. M1 _6 H
printf("count is %d\n", pshreRAM->packet_cout);
5 B6 h! X ]0 e
count_copy = pshreRAM->packet_cout;
. X* F [: r. J D# y! n# F1 H
}
( g# b* U) P( K' g2 S4 V6 G0 K g
else
9 n% E3 ~ k1 ?$ \$ g$ @
{
; C6 y, C+ b4 X5 L# h
printf("No effective message!\n");
0 ~/ v/ ]& g- @( y: F
}
; r9 K4 o; n5 e6 E
}
' P! Z5 s' I+ b/ M4 L4 h
$ g$ C \$ O6 c3 j; D: m% J% w/ F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ U7 a, `0 E% D5 ^$ p9 o G
- w3 `9 R" U0 ]
. p/ x0 d8 p1 [* G
) I, \) ?, t; V$ ?/ F
6 X0 V {; W: s" `5 a7 [# T; u( P
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4