嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 {' z& s9 J; t1 ~$ b/ b: B6 l( }6 F
. C4 D Q. F( l& o- r& t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 {1 I5 G7 s5 w/ d" \$ g7 m
#include <unistd.h>
: i. T8 E3 J. U$ S S
#include <sys/mman.h>
u5 T+ Z' U! O3 S. s
#include <sys/types.h>
0 N% }! U2 w" s+ J7 F0 q N
#include <fcntl.h>
6 ?: A, T; M& i) H1 N. O ?
' E( L6 c q& V
#define SHAER_RAM_BASE_ADDR (0x80000000)
! X8 o0 h/ A# f2 @
* g' T! |* Y( r$ v6 A
typedef struct
! c; M4 Y8 J/ S+ M; j3 K, R! z8 M* H
{
3 b1 q- L4 p9 C0 d9 U
unsigned int a;
9 M8 S, P' X& w
unsigned int b;
) m% {/ e* K) A, W
unsigned int packet_cout;
# d6 [3 `% j0 C7 l8 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 V: @* l8 R* Y! x6 M7 E z( `
' }5 C3 b1 c U8 \0 p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# V* u) _ Z9 S8 P/ A" B( s
unsigned int count_copy = 0;
" t7 Y& b R8 Y3 t( k; R
q) I" M) t: W8 c# R
; S8 W$ m" m1 N5 X+ U
int main()
% k" \9 Z# O/ I7 F" y
{
1 A/ m. J6 K' q
pRX_MSG_PROTOCOL pshreRAM = NULL;
@; x4 _7 }$ c+ A+ N% h8 P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 i0 E9 i$ ?* O3 J, m3 O) T: `9 t
* ?0 W. d1 p) D8 ? q3 G# Z! f
while(1)
% M% z: T& h! S: {! y
{
, c9 {2 e3 M) i
read_MSG_buffer(pshreRAM);
( g- b Y; I% s2 A/ T* K
}
! c( a5 X a/ Z q J, R4 l1 x
}
, ] ]. ]! Z" r6 {3 H
; x' C9 e. p, E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) @# x- h/ x, K: O
{
: Z9 p4 a. I6 j; t5 B
RX_MSG_PROTOCOL buf;
$ {9 ?: [0 g6 {( }& p
" C6 W4 s7 z/ J# @0 [3 {+ _7 r
buf.a = pshreRAM->a;
4 [# R3 H4 e& S% D
buf.b = pshreRAM->b;
3 o9 f6 ]' l2 E5 d# L% c/ y
buf.packet_cout = pshreRAM->packet_cout;
# |( H# M }; \- F( Z
+ Y) ]) I1 Z* V! K9 Q( F% O
if(buf.packet_cout != count_copy)
3 e+ x. l c5 e
{
R, A+ x6 q9 S- K" K+ W6 `/ N
printf("a is %d\n", buf.a);
3 `+ S4 Z% N# M; d6 H' k: L
printf("b is %d\n", buf.b);
4 f8 t7 I( H# f) N- q; |4 o1 w/ L$ J
printf("count is %d\n", buf.packet_cout);
! _3 r/ h; } b! Z
count_copy = buf.packet_cout;
. a4 a7 o, M+ Z, k* g
}
* E$ l1 M' e! x9 K
else
0 C) X6 z, J0 ^
{
: J+ ]. A' F' q! j3 c' ?+ n* U
printf("No effective message!");
! S+ [% e- G' L/ Z% \9 a" G8 N& O
}
" g* y4 ~, q" x( x8 P3 P( w& E8 `
}
p/ v4 y( O, q5 N9 Z9 O$ r
# ?& a) e: _# m; O
C3 m" k4 w2 k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ M! D2 N3 R4 X0 T4 t
使用下面代码,对内存使用了mmap函数后:
9 x: E. z: ~6 Y5 c' ^+ T- T
#include <stdio.h>
# E" d8 r3 w4 S" R2 v6 r& k7 j
#include <unistd.h>
$ ^* v/ A, M: e, {
#include <sys/mman.h>
$ ]! |! g7 r2 q. O0 q* o5 I& D
#include <sys/types.h>
, L6 }2 J' q, m; [
#include <fcntl.h>
& G4 p+ f2 j9 O5 ?) p& h4 e5 y
, Z$ l# d& D# L# d3 o @" V# C. M6 @' ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
" C9 f& r9 N- V
#define SHAER_RAM_SIZE (0x20000)
8 v( d8 O2 C j* u f2 c8 ~
: l) E6 c* l, w
typedef struct
7 b, C) S8 n9 H. q; U/ B
{
$ I& w* f1 f b; s! {
unsigned int a;
2 y: Q' E9 L5 R
unsigned int b;
$ [' I3 x5 A: k5 s1 b
unsigned int packet_cout;
8 {4 u3 B7 f3 J% {, n2 D3 q: I8 d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. u( H) j1 s0 w" t2 @, ?
7 K _7 W3 K" p. k* s
void read_MSG_buffer(int *baseaddr);
3 Z" k- m& H4 d( [: C8 Z# M
unsigned int count_copy = 0;
6 J4 h7 R* w' |0 O+ B6 ?) X; G+ c
" I. w7 \2 S* l9 l' h
int main()
0 J2 t6 Q# ~4 i; D# W
{
$ W$ W- q# ^1 r( D2 g, c/ x
int fd;
- l" O5 I$ q- x o
int *mem = NULL;
4 ], l9 l$ j% M" E7 _( L: \4 F
5 _: f9 K% w8 ], h! T
if((fd = open("/dev/mem", O_RDWR)) <0)
" P5 r5 a* u% V9 ~" m
{
# X: Q# R- }" @! U7 G
perror("open error");
2 A' K+ u4 P0 e3 Z3 [
return -1;
. Q6 l: m9 [* k$ e) w# X
}
& ?. s! a2 G# H o1 `; n
0 r& n9 x( t+ F( Z% l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; B7 J, n% a. o# c* q2 ^8 p! O
, e) \$ t* d7 h; U
while(1)
, Y. X* V2 `6 }
{
: n1 f# I! V% |- Q' N1 s
read_MSG_buffer(mem);
2 N5 c1 x, p. C q2 Y* E
}
% \) x1 F* n1 h- m8 k# @3 n
}
2 d3 R- h& ?+ [ [* O$ @1 ?; |/ m" E
: b6 f# w& v# m. d6 X3 ]
void read_MSG_buffer(int *baseaddr)
4 ~! b: E1 e- Z& p" t; c
{
G) D: q1 ^! x+ R6 L. U
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 r3 h7 \7 B/ j( C
7 r% _) t2 g' A/ k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 x5 X9 I& t2 r* A0 Y
$ K1 p, b7 C. U6 ]. H
if(pshreRAM->packet_cout != count_copy)
. [4 ?/ W6 [4 r; {2 k, p$ x
{
! }- X. n0 x3 @9 _8 F
printf("a is %d\n", pshreRAM->a);
) D8 M* t8 i- B* A+ R5 r
printf("b is %d\n", pshreRAM->b);
% q! [ @7 _5 U8 i8 e5 Q
printf("count is %d\n", pshreRAM->packet_cout);
R A# v/ E* v0 `# s+ k6 Y
count_copy = pshreRAM->packet_cout;
: L. m3 V) h, m) s) I! u5 f# ?
}
2 m& o1 [& G. i" P1 A* {
else
7 f2 z& J: U: I0 E5 r
{
, @- V/ j; \. m, f4 @
printf("No effective message!\n");
& o! s# W4 S) F+ V) H. d
}
" D8 D p6 W7 h/ j" J; Z
}
% _$ r9 E- ^: X; w6 S8 C
, i" A+ G- C- h7 {" }/ w \ ^6 ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( s0 ^" s6 ^9 ]3 ^, e
' L' Q" L; { D( n
0 M# i0 m8 d' {. r4 k% K
7 o1 M4 K" ^) x" F$ a, o7 \: S
& V' U$ |" g) E' a# D" b( A2 F. R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4