嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" ^7 s: f7 F' ^( }
# u) Y: s) Y4 c; {) h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# T2 \5 R. @! e/ a
#include <unistd.h>
. n5 f# \0 X4 ^, U" ~. A# ?
#include <sys/mman.h>
3 y! Z: I/ e8 U1 k- p) u. x
#include <sys/types.h>
, ~% m) p' _' k) r m0 E
#include <fcntl.h>
0 M6 K0 f1 x, I- D6 |% V
9 ^8 i1 O' @" A
#define SHAER_RAM_BASE_ADDR (0x80000000)
: m5 D6 p9 L. i8 m9 @) R" U7 h |0 X- y
+ X7 t ?( v" L. |5 j: F0 W
typedef struct
. x0 P3 @3 p) C
{
+ R- \# G1 k1 s' ^/ V# K0 g
unsigned int a;
5 A* n% |8 E: I1 Q, K2 ^
unsigned int b;
8 J5 X4 ?* x, r+ x& F. Z1 n
unsigned int packet_cout;
* b2 w" r$ V4 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 j0 B. D6 c3 v: V' M5 y
1 K9 i9 }$ I( U9 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* j9 O: H/ {0 \5 C& H9 T Y' }
unsigned int count_copy = 0;
6 k o L. ~; Z1 {- k% z
* T |% S8 I9 K2 O% I) W% A
, ^1 k0 E4 z j0 L$ }
int main()
6 }! G4 F1 F5 {
{
0 s# A" Q! m& X1 e' x# m
pRX_MSG_PROTOCOL pshreRAM = NULL;
, l& P( W# S+ i9 D8 ?! F+ ]8 w2 f
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; v# h* @; y: X& h
( {3 @5 ? b4 u1 w# w3 f; m2 G# K
while(1)
- G/ I# ]+ P6 T3 |: a, Q
{
$ }+ v& X/ T* u
read_MSG_buffer(pshreRAM);
. g- W$ ^0 N/ m; j0 y* f# z( v
}
' U( {. S8 M2 C$ U+ K, @
}
) ]5 Q% ]8 Y' ?/ }( j u% @* E& |
! V5 y0 x7 u7 I- G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 J, J& `8 h t
{
9 }/ F V: n1 U' Y
RX_MSG_PROTOCOL buf;
, |* N0 {6 F) m; U
# o* w# \! @$ q& H6 `5 Y$ G3 f& j
buf.a = pshreRAM->a;
7 q" e6 u! Z! c, l
buf.b = pshreRAM->b;
& G/ {, b8 w' p, v7 t7 ^8 L9 j
buf.packet_cout = pshreRAM->packet_cout;
: j1 I; {8 a |( b+ d
# Y, {" U0 ?! R* W3 n, J
if(buf.packet_cout != count_copy)
- b5 W2 b" e- ~ R5 B, k. o
{
! l, z h' Q" ^5 R2 n; {% T& N
printf("a is %d\n", buf.a);
- S- c( e' T) S; _
printf("b is %d\n", buf.b);
. @6 y% G7 c0 O( t8 ?; m
printf("count is %d\n", buf.packet_cout);
0 K$ E" U6 t7 v
count_copy = buf.packet_cout;
) c0 p& d7 |- [
}
- y9 i* S) @; i7 J5 S9 o
else
- s2 o( `: P# ~! H4 s: `+ G |1 M ^
{
# v7 A+ i/ V$ L' h6 H! ?* g
printf("No effective message!");
6 N$ v: _$ p9 s
}
+ M B4 R/ U! Z- c" T
}
- L: \9 d* w. X- O7 _: \; z$ c
( U+ w, ?8 ~5 B
2 F: U6 t# n4 t: F7 S0 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 Q8 v/ A3 o% b
使用下面代码,对内存使用了mmap函数后:
. I6 D2 T' Q5 ~9 ]$ k: i* D+ d
#include <stdio.h>
8 b3 d6 ~( w% z1 I4 h" f
#include <unistd.h>
8 I, E8 q T6 |' \* n( n
#include <sys/mman.h>
5 {# T ?2 O. p' f0 J, F. P9 r
#include <sys/types.h>
( `& F" q! W2 F9 @* p; b
#include <fcntl.h>
1 i$ C* R8 `3 }) Y# n
: { ?/ t6 H* \) G: X5 J2 `7 e
#define SHAER_RAM_BASE_ADDR (0x80000000)
& d) F; q8 e# v
#define SHAER_RAM_SIZE (0x20000)
. h8 C$ ]3 R6 ~. L2 H
: q7 G7 p# L& @, f
typedef struct
( d1 |% k$ G& `$ w+ [/ ?9 S" s
{
+ c O6 l% ^* Q% F- E
unsigned int a;
+ q0 `& @2 r% X3 q
unsigned int b;
# d0 H/ R( {8 C
unsigned int packet_cout;
- d: g3 b& ` ]7 p! s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 [8 X2 [! {; S2 ^0 o6 _5 m
" J5 [3 l; @7 P6 }! _
void read_MSG_buffer(int *baseaddr);
0 l0 y+ S/ e1 ] D& k
unsigned int count_copy = 0;
( `( H& x6 N6 u! k0 Z# _
. B& \/ W+ a/ z1 o1 N
int main()
+ t" z/ a/ d# Q0 Y
{
% E! L! v! e) Q" G$ t# X7 G9 @
int fd;
- ?( O( n! T, k1 S$ n2 S
int *mem = NULL;
) l7 W" r( P- K3 H) r3 y4 \ I
6 N3 F- a$ u; o! o% P: Z
if((fd = open("/dev/mem", O_RDWR)) <0)
8 v% D% W" |* E# x
{
: `7 X/ F# @; S! w
perror("open error");
# d) K* M. }, ?7 ^4 e
return -1;
% {) e" {' s. L# Q/ T6 Y
}
* a1 z+ X( [& {8 Q
9 y6 i" m) ` o; d. c# T7 O& T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" g- f- r1 g7 ?
8 Z: P3 Z- G- M: |1 k
while(1)
! o v; G& E4 m
{
) C/ J8 r0 |* {. I: g2 Z+ _
read_MSG_buffer(mem);
- R1 L M4 p. k w) L
}
% y, }7 |/ P) s9 C9 x
}
2 X' E( y# Y7 s0 D
; V9 p" e( V2 w
void read_MSG_buffer(int *baseaddr)
. m4 Z/ W; z" v
{
p1 u6 Z" ?( i8 a5 n$ x+ W
pRX_MSG_PROTOCOL pshreRAM = NULL;
! L+ X6 E- M. g% f7 D& w1 s3 @6 ^
& }0 W* F* T) M6 Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) p4 }9 h7 E" o: G. \/ ^5 @# ^ }
$ R# a' T, R8 \( Q
if(pshreRAM->packet_cout != count_copy)
- E: V% T6 ?" x$ E- Y; a+ X4 c
{
% Y$ d/ I# \) U% r9 K0 K$ |& W: A
printf("a is %d\n", pshreRAM->a);
; e. C! \0 \: s5 @; b3 W3 s
printf("b is %d\n", pshreRAM->b);
3 ~* X! c6 _/ Q0 n; Q% M5 B8 L
printf("count is %d\n", pshreRAM->packet_cout);
; u: S( C) s3 l2 \1 r$ d* A2 E
count_copy = pshreRAM->packet_cout;
+ a( j9 ^ @4 ~' [$ J
}
. W% t8 j7 p( I N9 r
else
+ v8 @8 i! f! X. m- ^
{
4 }. s6 M8 J1 ~3 ?6 m
printf("No effective message!\n");
- o% m7 Q/ e1 r3 B6 y/ D
}
1 {9 [$ |" {7 A# e, I
}
0 a3 X% P: k! C, |+ m
# A0 u9 h2 a+ ` W1 j, b5 f1 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! Z2 [; S6 `2 v' W! x; z, S
0 d- e2 f! L' M) v/ j9 ~6 ~
6 g1 o! u' y) `& g' ?; w
- w3 e$ C9 ~8 k. N
& C2 \7 n4 O3 ]/ y! F# `! k* ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4