嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ z6 e4 m( u# H9 t
N' p9 v6 Z% }) Y5 F% q) I5 m! Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 X# @1 ~8 K. N' h( K) J
#include <unistd.h>
; m6 g& y. q7 f2 q- W7 r
#include <sys/mman.h>
# `) N+ V" |8 r% B3 H
#include <sys/types.h>
* i+ q# k: `: ~9 t$ A& Z
#include <fcntl.h>
+ o% T$ x1 y" B0 v5 r: R
* s6 }/ u' b9 }6 P4 W; k
#define SHAER_RAM_BASE_ADDR (0x80000000)
]; N6 B& K+ R1 A
& ~( i; E }; B( D1 S
typedef struct
+ g5 r' _$ o+ [6 e* b
{
- x9 h% b$ e, X6 o% E7 m& J9 I
unsigned int a;
; Y a& ~) h& ]" o
unsigned int b;
4 v. ~1 v: d' _2 W
unsigned int packet_cout;
- K& D+ K: U- p) z& O1 _6 N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 S: y" r' [! `2 b" P. l
/ r' l! D/ r% U0 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 X0 B8 r% Y3 ^$ ]4 [5 W/ ]
unsigned int count_copy = 0;
! }. f+ \7 N# m) ?8 P6 K- E# v
3 L7 ~) Y. U, {/ v1 F
: p; D4 S3 S+ N. e# Y
int main()
( }! Z9 F5 }; B
{
' M8 v& x @4 X+ E/ P) V# R
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 E. S: ?- u7 J1 [# u, K- b* ~% L6 `
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% Q: z" X$ z6 x- V1 E# R3 `
6 g Z4 C9 a' a1 J9 b
while(1)
$ G4 I0 I. p4 u2 {% b3 T- A
{
: y7 I* y5 e4 W; B5 M3 m
read_MSG_buffer(pshreRAM);
8 ?' Z1 f/ j1 }* Z
}
9 H. N& ~0 ?8 E" B `0 d
}
# ]2 R; r; h) O; I4 H
5 J w& M o6 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* T+ j% b8 I2 v! j3 V4 k5 `
{
; ~. q4 Z/ D& R9 O
RX_MSG_PROTOCOL buf;
% q4 I) G6 t1 J/ {3 p& q/ C
/ {( x, K+ ^3 \1 V4 j2 b( E P5 }+ X
buf.a = pshreRAM->a;
% M6 E8 H7 f0 t. Z$ d: g
buf.b = pshreRAM->b;
3 h6 ], H! [6 W0 h* p
buf.packet_cout = pshreRAM->packet_cout;
9 _. U4 |" H) q% x0 ^+ X0 ~
+ c: ^; i) }( c
if(buf.packet_cout != count_copy)
f# Y* S2 ~: r6 r) I8 h: n L
{
8 V. e' s1 ~, @' T" r4 D: P
printf("a is %d\n", buf.a);
# r# a6 \! h l: d' C0 U. R% @, C3 V
printf("b is %d\n", buf.b);
( |9 I% O Y6 w# M+ r
printf("count is %d\n", buf.packet_cout);
6 `! a/ i! J9 Z3 m% m/ l$ [
count_copy = buf.packet_cout;
6 T3 p$ P% v! J8 D4 `
}
, q# m4 `& k2 R; q9 _) L
else
- ]/ d6 {( s [9 o# k; g( O+ u
{
0 \8 J2 I6 W; b1 G x# ^
printf("No effective message!");
1 F. H+ r' A& [' l
}
e+ |& n/ k* n+ T; |2 } }
}
) M& |! q0 R1 _# f5 Q
; Y- }- B, q Q
/ g1 c: \) M! B/ r- e; l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ J, M& ~$ R+ Z
使用下面代码,对内存使用了mmap函数后:
6 p! q5 h' W, `
#include <stdio.h>
# N9 t0 U& d7 g, Z2 ^( c+ y
#include <unistd.h>
9 ^2 X0 |7 o* T* C
#include <sys/mman.h>
7 c. @' z' V: u
#include <sys/types.h>
& Z; r& F( P3 [
#include <fcntl.h>
' k' s. V8 C9 U3 P# Q8 l
+ g7 @$ \0 ? B" a0 Z( x, [' t# k
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 O% b7 |: o; H3 E
#define SHAER_RAM_SIZE (0x20000)
( M* g4 E# ]# @# O# s, u
' F8 u) P F. k! D6 ?7 a
typedef struct
' p; E6 ^3 [0 c! {8 U, t
{
- b6 @- u( A' J4 Z8 U4 j" Q& s
unsigned int a;
5 R2 u3 X w8 J2 m( l( N
unsigned int b;
8 z+ g; R% l, e% O
unsigned int packet_cout;
: g) X% f; g( W% ~) r, m! a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
T5 e7 T, L% t& b
t8 K# p: ~* f: ~+ e- g1 [
void read_MSG_buffer(int *baseaddr);
! z9 i# J: E) E6 T4 k6 S8 S/ Q
unsigned int count_copy = 0;
- K+ N% l/ N3 {' `; K
9 Z; H7 H' I: s5 c* @6 {* s5 y
int main()
f$ m6 Y) d* `9 t, |& W" x
{
& y4 T- d. o* y, c
int fd;
" ]' |$ W8 I4 {, k
int *mem = NULL;
9 G) q/ X4 o+ k5 t8 f% `
; k3 \+ j! O, g7 L( \
if((fd = open("/dev/mem", O_RDWR)) <0)
0 y% A% S. p1 g" @
{
( r T) i' {( B9 M8 m. H: X0 I
perror("open error");
# }: n4 u1 ~5 P! k0 a" z, r
return -1;
1 u! Q; Z2 \& i' z. F* @4 i( ^, y: i2 o
}
, D+ K# c; s: [( V0 K5 M
) O: R% v4 v# T1 A8 n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. Z7 K: W, H1 N2 G8 H9 i: T; ~
! n* t. z0 P1 i6 n3 _
while(1)
( i9 R6 u# C: s. G
{
% R. s, U4 r4 T' {' S/ F( j
read_MSG_buffer(mem);
8 u4 { S7 g0 F9 L- s
}
9 x! ^' ]0 E, K& I' f. b
}
# s! r8 X6 U- h6 S
; M( w( i/ j4 }6 M& R4 p- t
void read_MSG_buffer(int *baseaddr)
9 C" N0 v0 Q: f# s( M
{
$ F7 J' A6 g4 G% Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
: q% g e% r% V$ ^* @
. F. s9 o6 | D3 ]! `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, E9 D: O: i9 q& I- w" v; |
( e+ j6 W I8 I( u! n9 q9 I
if(pshreRAM->packet_cout != count_copy)
' z, G; ] W% X2 u# r, a
{
3 k2 p" Z3 C0 F( W% L. }3 q. o" [/ t
printf("a is %d\n", pshreRAM->a);
! g4 u s/ Q; K% h- T+ }# R
printf("b is %d\n", pshreRAM->b);
/ U$ i6 D% M- [0 Z" b, ]3 ^
printf("count is %d\n", pshreRAM->packet_cout);
# q# X O% W4 T. ]
count_copy = pshreRAM->packet_cout;
. q% O5 ]# g# {" m" y! ~
}
0 U7 y Z4 T9 m+ T3 G
else
' ]) } u; d7 M _) S! M
{
2 @# O7 u2 y8 \0 [- S
printf("No effective message!\n");
2 _8 t1 C. m+ O6 X: @/ q3 V, D
}
7 d! c s3 R& q- J4 c j2 R
}
7 v& H2 ~" E* z$ V- U
8 b" `' t% q' A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ E* a- W* t& a/ G) p6 A: y
4 n8 }$ u: }; w* ~
' ?! Y" \3 @) |/ S
4 _* {% V) g( N& s7 \3 a
- B9 b: k- }/ p, Q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4