嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ v" J% L" x: L0 ~6 H
* C+ ^* D/ o% b" D" j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! X/ e6 Q1 M; n5 f) q
#include <unistd.h>
6 _8 c8 ~2 O0 t6 N3 a
#include <sys/mman.h>
4 n" n+ k* S: V! {4 q- w, a
#include <sys/types.h>
1 L2 N2 p7 h/ c6 M C
#include <fcntl.h>
; P- T" S( b$ m& p& E/ W" v- ~
% H h7 U# K9 t+ R& m7 H
#define SHAER_RAM_BASE_ADDR (0x80000000)
( [ o* [/ L" L
7 [' d$ f% U( X: y* s4 i8 O
typedef struct
# f$ Q. c/ x) x# p- }+ W( }/ l5 d
{
( F* p; k9 R& b0 @ k4 m
unsigned int a;
& F' U* | ?2 A2 l* O2 E
unsigned int b;
# Q2 |5 c1 g( s* j: x
unsigned int packet_cout;
6 v' s: w' T' G5 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 |1 a' @6 \' q/ h) H4 g
8 [/ F8 C9 D% v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* Z* _5 H8 o- h$ @8 u4 T
unsigned int count_copy = 0;
2 H9 u5 m4 z2 f* P/ q8 h
. B' h+ c" U" ~! B
4 b0 U, Y+ z( b' t
int main()
5 _7 C9 e; Z" o, f6 L9 L
{
. ~1 r( i( t3 P! f$ V9 i, G5 L
pRX_MSG_PROTOCOL pshreRAM = NULL;
' d3 F9 [0 H. i7 K. q, P7 w6 q8 p+ i( b* x
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. Q3 r2 w+ c$ ^9 n6 O
( T* ` J, g& U" e0 m
while(1)
, Y( v5 O j8 o- w# ? R: p, q* O
{
" F7 {0 p! o1 Q$ Y _# c" U7 [/ }7 Y+ s
read_MSG_buffer(pshreRAM);
# K* _. {; ?; F9 H8 k
}
! x$ K; v$ _% g7 B/ p; J
}
- q C2 j4 X3 O5 s! Q& m
8 v, \; L' l( o- [% S' o7 N S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, L0 ?0 w% g: R1 Y# _$ X
{
# m& L# J4 d* M4 Q4 w9 G" }- |
RX_MSG_PROTOCOL buf;
8 x! R; h7 b+ y6 k$ Q
" L/ S9 P! C9 @$ D& e
buf.a = pshreRAM->a;
% j" J; x/ H* T1 H
buf.b = pshreRAM->b;
% y/ E% ^2 U3 p9 g7 E( z/ o
buf.packet_cout = pshreRAM->packet_cout;
' L( _$ S6 w6 k- a/ v% A: J5 p
/ X* S& a1 {% f
if(buf.packet_cout != count_copy)
& X& B' x9 s4 l
{
( E! K1 L `8 W( K
printf("a is %d\n", buf.a);
9 x3 m- [; _+ j z" ]5 L3 Q
printf("b is %d\n", buf.b);
9 H& k9 w; I0 s3 q5 X
printf("count is %d\n", buf.packet_cout);
' f9 X& p7 w, ^) P- t# M$ {
count_copy = buf.packet_cout;
) `; b5 [# K. d4 |
}
( o v( B9 u, w/ z: W8 L0 R
else
; D1 q% P3 Z, b' p: Y& ^
{
( @) P: {1 q; y& [
printf("No effective message!");
# a Z6 K3 M" f% o0 E
}
) }8 B9 `6 ~1 w+ W/ c
}
, S! {$ S/ M$ g5 d0 t
$ O5 Q4 ~0 ]6 ]. E5 i
. w9 a- l W- I, e: Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 E" r$ G. z% p% n4 s: w$ L( _
使用下面代码,对内存使用了mmap函数后:
6 x. t$ k# J- M3 C# O
#include <stdio.h>
1 ~, x3 ~" \1 B; v: ~* S0 H3 L' I
#include <unistd.h>
9 h. ]3 D0 ~8 J" S% L; v0 v" N, _. Y
#include <sys/mman.h>
. I) I& z& h7 x1 ~2 U8 Y1 V
#include <sys/types.h>
( Y, E0 c1 c+ g# s
#include <fcntl.h>
9 q* u' w% O' y I1 |. Y8 D& z3 i. f
k* r b( A" V1 {5 x! E0 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 e) h4 d& j: o% g" W3 P4 ]% k
#define SHAER_RAM_SIZE (0x20000)
' i9 Y/ t; F* E2 D" y5 N
% J: t! A/ m, I8 C, e8 T
typedef struct
! i+ ]) {7 m r
{
1 C7 \/ [7 N& g, G6 s
unsigned int a;
) ^! \: d9 w2 t% L8 l! b
unsigned int b;
# |. t# g) S6 O2 q
unsigned int packet_cout;
/ \5 q# N; d, y" B0 V. o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ g& P8 D3 W( e' V
: E* C' c3 n" T& v0 X# f
void read_MSG_buffer(int *baseaddr);
' c6 K6 k( O& f
unsigned int count_copy = 0;
$ d: e U% k7 ?
, O( c& E& w6 ~0 X8 i1 H* g
int main()
9 Z& ?0 v, J3 @6 j0 |# P5 ^; |
{
- N+ t- }! @1 q* I
int fd;
$ y6 J9 d# P% w
int *mem = NULL;
1 M' W! e! C! u. l2 \
% H* Q/ I, i2 b
if((fd = open("/dev/mem", O_RDWR)) <0)
3 R/ b5 o2 T6 ]# F
{
% g0 w H& P& k% ~5 l, t
perror("open error");
& N- [( k: [% X
return -1;
" Q0 q0 d. L c- h% k2 ]
}
1 c0 E5 ]: H$ r2 ?2 C6 Y0 V
" N# ]( K u8 y$ C/ C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 A4 Z& w( n4 Y1 r% f, n/ Y. C
- W/ S; O; d% B# Q9 U _
while(1)
6 X+ k: i! C- D6 p1 E u! P
{
" T# y/ r" v8 J
read_MSG_buffer(mem);
! f) p5 o4 a4 E
}
8 H! C/ Q% a* a" Y; I% b
}
+ `9 A( T# L x( i# o" A3 V/ n
; j/ S! G2 X P3 B* D
void read_MSG_buffer(int *baseaddr)
8 t8 n4 B" H7 M5 Y
{
! p. I( d9 ]5 B/ x8 W
pRX_MSG_PROTOCOL pshreRAM = NULL;
; u3 U4 S. G8 Z" A& b
$ X4 {( b- P3 d7 ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ m* R- v7 E' q8 z1 r0 v4 b
; l1 Y6 P7 V: W5 S( H0 ^8 z
if(pshreRAM->packet_cout != count_copy)
) z! m4 y* w0 z$ g# V( F
{
# Y. z% k) u& d/ D. l0 d5 B
printf("a is %d\n", pshreRAM->a);
1 r6 d- S7 `) }; }4 i9 b
printf("b is %d\n", pshreRAM->b);
) O. G! w+ s4 K" ?5 {- Z
printf("count is %d\n", pshreRAM->packet_cout);
5 H8 V# a( \# n. D, q* S: I
count_copy = pshreRAM->packet_cout;
* O! {" L4 h9 ?& W6 w" u
}
/ [3 a5 p. y0 O/ b+ |# d
else
: P0 X, H \* t9 k
{
) ^) z" A& a1 I q! P) q' X
printf("No effective message!\n");
( A2 i) Z: ?0 \2 V, }# C
}
+ W0 [0 t# ^% ]) \8 V& ~! @5 K
}
& g$ x: r7 `# p+ w- r2 w
! Q8 d0 W( u- G; L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& ^" S# G6 H$ |$ z4 B( K
' M- D3 T6 H# m+ w: H: N4 ~0 [8 k
. g5 ~# ?' P2 T3 ]& N
0 k: ]7 I9 h6 r# t" @+ n! V* o
! z6 @; _6 L" J; p+ g
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4