嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 O7 {& @5 `! K0 y" {- P% x
( a: ? h; Z8 C' E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 y" ]9 R3 s2 q% u1 W
#include <unistd.h>
8 M, e/ z2 S( f: b. T- `
#include <sys/mman.h>
, j! }5 W2 Q; d4 i) t4 D
#include <sys/types.h>
7 Y' R; z" }! h8 D
#include <fcntl.h>
6 y$ G0 u0 G7 e) w: N
# R4 d/ _* P' z
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 \; m7 S1 e& Q. i
& _- E7 g; h. |0 j6 w
typedef struct
# Z# g: \6 y7 F) V8 b% q
{
. { D2 j, O& i& o- ~
unsigned int a;
8 T* ]2 Q) e( @2 `% f6 p1 d
unsigned int b;
4 e% C% _* P$ n, k$ |5 Y; t
unsigned int packet_cout;
# f" @2 s; [! O+ g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o$ {' l0 {$ Y: H9 F
8 }8 p- A) ?: }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* @9 Q6 J- E$ e
unsigned int count_copy = 0;
& O7 g; k3 F) g% j$ A
4 m& L9 k& ?* i/ M5 s6 z+ S# X
* J9 A0 u! k. j: d& D7 g
int main()
0 G- U+ W! Q! H
{
% C* }; Z7 P" V, K
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ M! f4 R. ^# V4 O$ n5 y+ {9 D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 M4 r) G2 Z$ b( `; L9 f; z1 s2 Z$ j/ P
2 [, g- S& r u7 N& `. Y
while(1)
& I" O Y6 p2 g8 m+ v n, z
{
3 {& p) |; ?& }* h9 g- p
read_MSG_buffer(pshreRAM);
6 d+ N$ m& g6 v. a: Y5 ^! f
}
. Z& r* [. {4 w! A$ M2 w# p
}
! a: K5 m3 w; C, Q' _: z1 N. I) d
8 w2 e/ \) Y: c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ G9 @3 F5 x, _! Z4 @+ b
{
0 z/ E% F8 ?& J) d8 |, y
RX_MSG_PROTOCOL buf;
% J0 r& b9 y9 b( Q4 z0 R3 L( |; ^
' Z3 ?, M3 _# @
buf.a = pshreRAM->a;
; h+ U- x" M2 ^8 Z5 j/ A0 b6 I
buf.b = pshreRAM->b;
5 k/ f- M% ? {- P$ Z
buf.packet_cout = pshreRAM->packet_cout;
1 A: q) u+ t& e7 i
* I- k" `( s5 V. J+ {& Y4 P
if(buf.packet_cout != count_copy)
7 U, ~* h6 S+ ]3 e, Z
{
8 T3 Q8 p5 `- M6 @% `
printf("a is %d\n", buf.a);
* ^# Y2 Y$ b) E
printf("b is %d\n", buf.b);
# b: r* }* V+ f7 o& [- A/ L
printf("count is %d\n", buf.packet_cout);
( J9 G0 P1 z! {; }2 g9 x
count_copy = buf.packet_cout;
4 c1 t) A" O* l) b- j( S
}
) q$ G* o& Q$ m" ^/ v0 t9 i
else
, s- d) ]! u7 k/ s8 ] w
{
3 s1 Y6 q+ k. U
printf("No effective message!");
2 k& R( M6 B5 W+ I0 q/ V
}
- L; k; _4 y) O, T: d+ o
}
* J4 A( }! n% B1 G0 z8 g
) q: U* z2 i1 l( N
. R6 T: g& [3 K4 z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 r8 I) a% s Z" U& L; n
使用下面代码,对内存使用了mmap函数后:
% p+ X+ S2 ~, l8 f/ ^; Z7 {$ z7 x
#include <stdio.h>
& Y& k# }- T; C/ b4 `
#include <unistd.h>
) s' a! ? x7 @2 `. F2 F
#include <sys/mman.h>
' {5 U: ^% e% ?& K4 i2 s
#include <sys/types.h>
, A+ [1 i% |+ a# e
#include <fcntl.h>
- C: w# Y" e8 f. ^8 a( ]/ {
: _2 j& Y$ b o( l% _
#define SHAER_RAM_BASE_ADDR (0x80000000)
" d4 x! K* B/ n" W n6 E- {
#define SHAER_RAM_SIZE (0x20000)
1 C' x* d: X. \9 _5 u9 T& F
/ H, s7 n) {/ C% J$ I
typedef struct
( p, B6 l2 [. B; \/ T
{
: q0 n, G8 `9 l
unsigned int a;
! V0 I' @. m& i6 J
unsigned int b;
4 ^% [5 v; k& [
unsigned int packet_cout;
) r1 f+ A% R- G% Q9 P/ D7 S& a" P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ G9 S3 u$ L: Y& G- d( w
6 k/ h8 X* K4 r' H; F- P9 d+ f
void read_MSG_buffer(int *baseaddr);
* n7 c/ V5 U/ F y0 A& _: B
unsigned int count_copy = 0;
( G$ @) k1 V+ Z/ Y& `
5 |/ X. u* N" J: O6 i
int main()
4 o) e `2 K4 U% h7 h! B
{
+ \0 }* n; ]/ K8 x; V+ c
int fd;
$ K6 @% d- B4 a7 ~$ C6 w# X
int *mem = NULL;
1 Y# @; x) \( p. b& Y2 S
4 P1 O" ^& J- a6 j* j! D
if((fd = open("/dev/mem", O_RDWR)) <0)
0 H0 x% _ c: t! V+ v% s; m# x) H
{
: N; e8 y' `# D" y+ d2 A5 u
perror("open error");
. {$ Z/ W$ R) s: s
return -1;
- N6 A0 P v( H( F" t' ~
}
( s: h- V, g' a0 R) |
/ s' V/ r* h2 h/ U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' S/ |! `6 ?+ j' o/ B% s2 N
/ N- y% V, d1 P/ f3 K$ q. y1 g# W
while(1)
' `9 S8 [( x+ \+ r
{
7 ?) j6 L; a" T4 u5 [
read_MSG_buffer(mem);
7 W; A1 x6 G8 U/ |/ _8 U4 O
}
* P# _9 h" u9 {3 z: V3 O
}
! g) g: ~) M+ Q9 D0 q
2 F" _4 w! q. u' N/ n Z0 @
void read_MSG_buffer(int *baseaddr)
3 {, W4 ]( d$ {0 q& W
{
! Z5 A* w4 N1 E$ P- ^$ @+ ]5 P, w, B
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 M7 y# j& C* D& |. Z
) `6 y2 D: V; Z. M/ P! h
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. V3 H7 F. ?" i) S; t3 k" v5 W& m4 P, U
+ ]8 m2 F4 ?6 J7 o# q7 u1 C
if(pshreRAM->packet_cout != count_copy)
# j/ x! S3 o9 ]% i8 A
{
3 }0 e2 I) p; j
printf("a is %d\n", pshreRAM->a);
# m2 }8 Z# e& y
printf("b is %d\n", pshreRAM->b);
, E8 x2 }3 L5 a( v0 w+ ]( W
printf("count is %d\n", pshreRAM->packet_cout);
' U/ p3 z; K" @
count_copy = pshreRAM->packet_cout;
M9 a& `' ~/ ~7 i
}
1 s; {: T' m p$ q
else
& z0 B) [* a3 J+ n5 }- b9 b3 a* D% h
{
/ _- C: ?( H- ]: b# }
printf("No effective message!\n");
^& P# z6 l F- \, E. c) [) V
}
" Q: d% q( |# E0 M# @
}
* `7 ^3 U* N. F+ S+ n* g) L
4 g# A4 i# m7 h. a' Q- T1 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ e% C# P) g- l n
; R: X) h% z, g2 V" d3 C
+ ]# H, y+ k0 i0 x+ {8 L; A5 F
4 d- ~ L: j1 @) F/ ^) ~
5 X% u3 w8 g" u% e
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4