嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ ^% x. d% u1 k% P
- b5 Y/ b0 U- j) B# S- eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 n7 s+ V9 E1 K+ B. |; Q5 Y7 o
#include <unistd.h>" O1 e+ z0 R: Q4 d- X
#include <sys/mman.h>
2 c, G. s2 _' _; t#include <sys/types.h>
, x% A2 l0 ]/ @- ?% `2 y#include <fcntl.h>+ C0 {/ X6 j9 W2 q0 L( g6 t. P

" c$ D, a6 p) a7 ]; ~; G! V0 v#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 L3 `! ~- t% a" f% f4 T

  G6 _$ ?2 A/ t9 }% n3 |0 `typedef struct& j2 O! T! N% n2 f/ m
{
6 e$ l0 n2 K+ V0 a5 W) u% e        unsigned int a;+ E8 K0 K; Y7 c3 a+ ^/ v
        unsigned int b;
6 p! F4 D" k- r+ ~8 u        unsigned int packet_cout;5 O' c9 X8 f0 W  F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; E. n, w/ O: E4 @& d' X
& @) a2 s& u) e9 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( y+ P6 M3 K6 w  C4 ]! |2 q
unsigned int count_copy = 0;
9 ~! h( f, x% _. g8 U+ O' n. m( @0 m1 i4 v  X. f
: E4 n: K) H  A! x- g! P
int main()
, @# f. K. S! n( O{' H2 R; A, F* }6 L6 a( t# \
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 R, a2 C) k8 X4 b& t- K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& F& N2 H3 w1 s" l, e2 Q* h; l
9 U. |6 n2 O. `" m; `
        while(1)" d$ x5 {. o; C* |0 q
        {- K& q# ~8 z: Z1 l: X
                read_MSG_buffer(pshreRAM);2 [1 Y# _7 {3 J% r' j8 j# m. q+ O
        }                + }  g' O# _- e: S
}
( n8 D0 C/ P5 m: k* W6 b* z7 D( q& P. ?4 K/ v7 g1 F/ |- c+ h" \) i$ i6 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  r+ y4 j6 A+ d$ I
{
! I& L* W( u2 {6 f# I/ x        RX_MSG_PROTOCOL buf;
/ |) u' i% o1 ?4 J        
( l; q8 F+ b& O8 g  Y) E% L        buf.a = pshreRAM->a;
' I% e6 e1 g" w        buf.b = pshreRAM->b;- G" |9 Q0 H. W( G9 p# V
        buf.packet_cout = pshreRAM->packet_cout;
% }7 U* T8 S! W% O' K& y        # q( A% ^, I1 v" }$ \$ O
        if(buf.packet_cout != count_copy)
5 b& \' Y, N! l6 C* y) x        {
8 L5 z6 M1 x# @) C                printf("a is %d\n", buf.a);6 C( m! e& |2 a- \5 Z9 W2 X' [
                printf("b is %d\n", buf.b);
2 E/ P) Z# v0 h! v! b: f! F                printf("count is %d\n", buf.packet_cout);9 G0 a' K( F* S% M" \# r* m% M
                count_copy = buf.packet_cout;( o7 S% h% `6 J
        }% g8 I8 J0 c. H( Y% o! F
        else
* E4 d  l$ [* g9 ?9 P        {6 q7 y9 E% k( F
                printf("No effective message!");9 i3 Y$ s  B3 r; p: C# \# ^: R
        }
) \5 {+ x0 r+ R% P* m}  a; I: A- T1 K5 ]
; @7 \$ Q* @( k
  V8 S" J% q* K8 r" X2 d( @; y0 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; _# v9 v4 y1 V
使用下面代码,对内存使用了mmap函数后:
" W# ?8 j) V/ w0 C7 {#include <stdio.h>
: P  T: E- J* J4 A0 `#include <unistd.h>: ~5 g6 S$ u2 }
#include <sys/mman.h>  Q2 T* D/ R3 u& a3 E& Q
#include <sys/types.h>
) n: _' }: S5 x1 `/ q/ V0 z#include <fcntl.h>
: u# P; ?( y; K# M5 g; r' Y/ J+ l) G, _
#define SHAER_RAM_BASE_ADDR    (0x80000000); w7 d; V; E# h! c
#define SHAER_RAM_SIZE         (0x20000)   
% R8 x5 G/ ]6 F/ n  r$ c
0 h3 }. l  j$ i2 w% u$ ]typedef struct  M8 \& p% ^' g. a2 p3 s( e
{2 h9 }4 l9 M1 v8 o" `3 S+ p7 _
        unsigned int a;  k9 R4 Y8 I1 h* V: I: K
        unsigned int b;
1 Y1 w) a1 c/ ^* a/ M, `' n9 H% ]5 e        unsigned int packet_cout;
1 f+ s( d# |# W" _' a( U; F; E! \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 _, S: F4 [4 X4 A: |0 e8 v, Y- I4 |+ j/ E" R; m
void read_MSG_buffer(int *baseaddr);
% Y  ?% n0 D% X9 o" T( {unsigned int count_copy = 0;8 C" X( S5 p/ k* J9 |, b
1 T) W- f  p% _8 h3 O* w
int main()7 O  t" T# Y0 Q3 ^3 z( }* K9 |
{
( y% t: M  e: R3 Y5 e1 V        int fd;. k; P9 ?0 w* D6 o  |
        int *mem = NULL;
! W5 I+ T1 l8 ^4 Z" O4 t8 M/ F6 \( i
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 P7 u! M# |  A9 D  W7 P        {( K/ ?; v* ^/ D" `  d
                perror("open error");+ H- z( t# I% t- t( _! h
                return -1;- Q8 J; K3 D5 J
        }
9 l. }- R# w$ W9 W+ f2 l        9 q, q( n1 F  j# t# P; p. x: f
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 K3 G2 w2 O4 P& i+ e) F+ P3 t1 t: T  x# [# |. n. v- F( u
        while(1)
4 K6 Q4 K9 p; a* q- G1 ~4 ?  {1 k  X/ J        {) k, R( u  b% ?8 B& `
                read_MSG_buffer(mem);
  b8 q& E! q8 a; @$ C, ^6 ?        }               
% v7 B2 B* o% X1 F9 J! e7 d; k}
# K9 r4 b  P; h  r3 \/ ]# g" o+ G% \( e
void read_MSG_buffer(int *baseaddr)/ ]& Z' G8 b2 Q
{
5 C0 w4 d7 d2 k4 M* p2 u" Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
  M$ p* m3 M6 n2 C- a; b1 ]: p* m; u
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 C* T# M( L* O( j' @

4 H0 p- \5 g5 w0 t9 V        if(pshreRAM->packet_cout != count_copy)
0 _1 C# F3 E+ T& t6 o4 Q        {
' I! W9 w& F1 i" [                printf("a is %d\n", pshreRAM->a);
7 [" e& J9 R! h1 s5 p5 X                printf("b is %d\n", pshreRAM->b);( m4 e- `7 U; f7 d! Y5 h
                printf("count is %d\n", pshreRAM->packet_cout);+ I. O! A- J; G% ~( J
                count_copy = pshreRAM->packet_cout;3 t% N. K9 n! b3 q( Y" ^0 s
        }
. F( b; y# V- v" s5 r* R4 S        else
0 r: j- w% B; ?$ H/ Q        {
+ H5 u+ G% m( Q$ C! C# c                printf("No effective message!\n");* ~, O4 f3 {( H4 G$ n: z2 W6 ]
        }
" X5 n' i  P4 X) g% c}8 i. l  Z7 a: N3 y. l

# x7 J7 Q/ m$ a* i没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ s& d, y- l+ u; T- m/ m
; c. D3 ^* i# Q9 W

8 }+ P- K- I. S; K+ v4 Q" g6 _3 a, n" p' P# y7 N
# z7 X, Z8 ]6 g0 S! W/ a





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4