嵌入式开发者社区

标题: 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 Wtypedef 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 zvoid 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- Gvoid 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& @, ftypedef 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 Nint 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 \  I6 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 wvoid 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