嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ b5 x, Y( i8 m" z
( F7 c7 k* |! R2 K, D: d( Q5 fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. {4 e: m9 a& m* K#include <unistd.h>9 Y  F" i- H3 h5 I5 }7 ~7 S8 V$ f
#include <sys/mman.h>
! ~) J0 w8 Q9 _' S7 w! C& T#include <sys/types.h>0 m6 t# T& Y' H3 d
#include <fcntl.h>
8 B7 f* t3 {  B. U" F2 H5 J( E# A- x# r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 V) e; F7 K( X: @0 c5 u

5 e" `6 S* q- Q3 C& _3 c. ~typedef struct5 D! i+ V# a1 t. R$ T
{* I) r+ P7 Q- F
        unsigned int a;
; d; G. r; G5 o        unsigned int b;* H! k- l# n5 B; H6 Q
        unsigned int packet_cout;* _9 A+ F8 [! m% W8 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: ~* x" v1 {0 D2 c' k. p

$ Q6 R$ F8 M  F6 U3 E8 j( pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& c" H! R: X2 x, M% j' g3 S
unsigned int count_copy = 0;. z. A5 V% J  S1 F( {" e+ ]+ {

6 S. V7 V. q5 u# @0 Z/ U) {, c3 G  u1 p6 r7 n* J$ M
int main()' I0 j# J$ \7 l
{) ]5 u/ P7 E) l
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 X( ?& w0 J7 f5 |5 |. m/ j) m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) {7 p9 ?8 C4 M: y0 x
! s' |! W$ L" {7 k  o4 W! B; T2 ~: I
        while(1)" d( p8 V0 ]' Z& J( i
        {
9 L( A+ A, E+ s! D; F# L0 |                read_MSG_buffer(pshreRAM);
4 d% H2 d+ |9 ?& T  w! h* u2 Z        }                8 b4 P; T8 |& N. u
}$ j/ N" J+ e- u
+ j- Y0 v  i5 L, I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' |2 Z' X/ M8 k4 {7 k{: L3 U8 p$ V2 p2 I0 F
        RX_MSG_PROTOCOL buf;
: [" f! T; `( x% V& p        0 d* T, R0 f$ ?9 {7 q
        buf.a = pshreRAM->a;0 e( ?* e: w5 Z9 G% }" [& D
        buf.b = pshreRAM->b;$ d7 C3 D; w# V# a- v
        buf.packet_cout = pshreRAM->packet_cout;
. n  [7 ^0 H+ j        
! [2 D& N) U6 G# p* M# ]        if(buf.packet_cout != count_copy)  {# a. d0 a2 U3 O! a
        {
- h" w4 i- J  m- e2 j8 F9 A& n+ q                printf("a is %d\n", buf.a);
& Z8 u9 k2 l  C' c# X1 v' _                printf("b is %d\n", buf.b);8 d6 R8 J6 z3 l  ^; E
                printf("count is %d\n", buf.packet_cout);
( }9 K- c" y' g" A                count_copy = buf.packet_cout;
# r6 j8 R* x# r% u7 U6 E( {+ B        }
( D" P( x. @$ X: q        else
' S. p  D& V7 ~! H3 B        {# s* ?( d( p# `2 H; [5 A9 ?
                printf("No effective message!");  H/ E- b& Y5 T: `- n
        }# V. b- b  o( U
}
, @. \/ u  ^2 @
# R- T' h, A! T* W( k  n
% `3 `, d- D4 F- o$ N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: J. s4 z* ~# B9 H. d" g- O% H3 Q  U: h* t: v
使用下面代码,对内存使用了mmap函数后:
/ P6 [" r+ l+ k' G) @#include <stdio.h>
4 e+ s* u) D# ^( c! i+ O#include <unistd.h>8 ^: L2 [/ J# R' ?
#include <sys/mman.h>" E% e4 Q# s& I) X7 Z
#include <sys/types.h>
: _2 R5 m5 Q' r6 L  L#include <fcntl.h>
0 Y5 t+ g$ F! R7 o0 Q
/ w9 `. _" q) J. [#define SHAER_RAM_BASE_ADDR    (0x80000000)$ R* u& a+ b9 n7 \1 U# R; C9 M
#define SHAER_RAM_SIZE         (0x20000)   * j9 _0 Y' H7 H; v' w
+ C! T" ]3 t! R5 A# ]) U8 @
typedef struct
; |) G. u4 x  o) h3 x$ ^  _7 {{
7 ^& ~5 ~4 @6 j/ _8 m  l$ B! y        unsigned int a;$ m8 n  e5 W: [( f! m  U
        unsigned int b;% N: d; a( B! \* ~. Y- x' y; V% ^
        unsigned int packet_cout;
3 Q, U% g, T4 h- B  }4 s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( U3 B1 ?' @# k& @
. ]& X$ h1 o5 ?2 A5 @" Svoid read_MSG_buffer(int *baseaddr);+ u* O% K  @$ d) S9 Z
unsigned int count_copy = 0;
: u/ S! @. }: t/ r  D3 ]" H/ w" C9 v: V: O  G
int main()
) m) i) M) b' S% J, E{$ V2 U' M2 E  W% @
        int fd;9 B6 f+ e) i& g
        int *mem = NULL;( X# f; j# t) U. z  ~( u1 Y

; h4 t' ^/ h: q4 q: H; y        if((fd = open("/dev/mem", O_RDWR)) <0)
) k) ~8 k% @) R6 n# }( p        {
: O, \. X# L+ A! f& ^                perror("open error");0 P! I1 E4 J" M3 _, e5 D" X
                return -1;
  E# e! I2 c: i. t4 _        }
, a( {' s" r7 x) f) A( F        , f& D* X7 D9 L6 c( N1 V
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ L$ {+ |) W& v) X+ h3 W1 _# ^
% B5 P8 v9 E6 K. i% ]# N
        while(1)
5 G/ T4 W8 t( `7 x! I) O9 p        {
5 |4 e: d: w% Y9 ]                read_MSG_buffer(mem);
1 N1 i4 u8 R& \, j# z& C        }                  ^: y3 x* Q: D
}- V* x, O3 A* h. T* s' q" D

# K- I, P3 ~+ _& V$ h+ I: d( `void read_MSG_buffer(int *baseaddr)8 Q! c5 O) w) ?- F( x
{- R/ F2 P1 `+ H/ O9 Q# G
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 S& u. ~( t7 V7 q
3 |1 V% ]7 x  N, ^, O  M
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ C) R; p% C3 l0 h  T% [

7 U( ]; B; q. Q) r) ~        if(pshreRAM->packet_cout != count_copy)
1 `9 W2 p* t4 D' ^. N        {8 ?- a  Z: _& r/ `- g) @* y: M$ t6 z$ _
                printf("a is %d\n", pshreRAM->a);8 R" ]; m- k- g3 H
                printf("b is %d\n", pshreRAM->b);$ \+ K2 w  G0 e2 k/ A
                printf("count is %d\n", pshreRAM->packet_cout);
0 J% K- _# k6 y1 Q                count_copy = pshreRAM->packet_cout;6 a  b9 u* h8 ^0 V% W3 ]7 ~! c& I! ~& h
        }4 {% _9 @/ h/ _) Y0 R
        else
/ e% H( J' \! A* L, D" ^* w        {6 Q% y5 E9 v8 _4 g( Z
                printf("No effective message!\n");
& S+ x, g% G( C: z4 ?        }
) R+ p0 X. r" H}/ [; b# G! ?6 T
" _8 U- U. k+ v: m4 N$ s+ z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 a9 O7 P) s  h% @( t
* U) F/ R& ]8 {- s9 R
0 W( C) Q; Y1 A4 [$ }
6 `9 e8 U8 U- k3 P+ B7 h
" j) n& l# C2 l# n4 }1 Y




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