嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , w# y& T4 s0 v( j( w* Z& }
$ C) T5 T. H, C8 V. K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 \9 M0 W+ r$ @9 o
#include <unistd.h>
% Q4 a4 J/ T1 D% U& N#include <sys/mman.h># X2 \$ K! A& g1 e; n% |  P5 w
#include <sys/types.h>
2 d6 M8 ?/ t, ]: ^# R#include <fcntl.h>  ~% Y! T0 m/ v0 G. U! O

8 |; o1 M4 g% I- B, L/ h#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 G1 v8 x1 j: a! g2 |- ?. W& v2 r, j( g2 Q- [
typedef struct3 a/ Q. x- x+ [9 Y1 G* g
{
" f1 _1 R: v4 `5 [" V        unsigned int a;2 ~% I- q* W0 v( y
        unsigned int b;
  H* g  _% J* R        unsigned int packet_cout;
1 ~/ s" p* d! j9 T# G3 L& @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! R6 S6 `. I% w4 T; b' j4 J$ }4 [( J  v( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* O" F; L# B$ f
unsigned int count_copy = 0;  E% a8 _, j5 c  ^4 \
% t; V$ q1 e* w7 y4 v+ N( K' c

' L2 x8 M0 n; w4 `4 r$ n: o3 iint main()* |* Y) X" Q# W2 I, R+ J" @
{6 j4 [6 \' ]$ l* G* I
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ C  F+ A/ g3 n  W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: o$ b3 r% |8 A( f7 n  W0 d7 [; M. Z2 C- t4 s: d
        while(1)6 _6 X2 u. X# {* e
        {
& t, s% t$ {' H7 ]+ Z                read_MSG_buffer(pshreRAM);
" R" N+ b. i3 r9 P. N4 x; n        }               
- a/ X; h, |( \/ Y# c& o% {0 t}, C# m( R8 ?* N. X: M  @9 B
; w6 q6 Z8 X/ C# p/ X: t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' l9 B. J0 t; v1 ^7 c$ p0 O
{" Q$ [- K0 c3 H6 T1 \( T7 z" S0 G6 L
        RX_MSG_PROTOCOL buf;5 Y3 i$ {; i. c2 n/ g9 ~
        
1 C& |3 N, z, p" f        buf.a = pshreRAM->a;3 `6 a( p- x0 m1 B8 [8 o
        buf.b = pshreRAM->b;& z% x! Z7 W5 C( c$ ^# f; M- p
        buf.packet_cout = pshreRAM->packet_cout;, }4 z( @2 i1 t7 S1 L+ e
        & L$ t( n3 D- k5 f/ h8 M
        if(buf.packet_cout != count_copy)
0 N' Z) N  a, O$ V" `4 A3 M% k. |3 @        {
& H! ~2 `6 A, B+ Q5 A; @                printf("a is %d\n", buf.a);* C  f6 O7 U. S' v+ n! h% n% p
                printf("b is %d\n", buf.b);' D6 l" K4 N# I  _( W' @( g# K
                printf("count is %d\n", buf.packet_cout);
* S1 ^4 D( Q% l' E% K& ^4 j; M                count_copy = buf.packet_cout;: `) U# R: J% Z" y, Y1 G& q8 c; h) F
        }
, j) |9 n2 c0 I) p% R& K; ^        else- O5 d" q- T7 t( I; H1 f8 T4 w$ U
        {6 k5 O7 [: o8 d6 T$ p% F4 E' ^
                printf("No effective message!");1 W" N, Z$ d( D# T3 a
        }% D" s4 i* e% r  g  r
}1 \* t- W' U8 m! P) M) o# p

$ C& ^- V& s! J; ?( q( f  p- j/ ?  O# s( V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( v6 [& J& p% }+ ~/ P7 g
使用下面代码,对内存使用了mmap函数后:; c; e- ^$ ?7 r# p) ?. J4 c* j2 l
#include <stdio.h>9 W" e. w( j/ k( U
#include <unistd.h>
+ W) U  C9 j* c' P+ L! S#include <sys/mman.h>- w& p  C! u3 u/ \9 N6 T% \& v
#include <sys/types.h>
8 l. n( Z$ Z! z9 Z: w#include <fcntl.h>
* `- T# R$ t, c  x2 ^
3 {2 I$ b0 ~" u( ~' l#define SHAER_RAM_BASE_ADDR    (0x80000000)- m# D- K4 o, k( x
#define SHAER_RAM_SIZE         (0x20000)   7 a  P0 p. z- }. a

) U# g  J8 x$ p0 `0 f0 j" ~( Gtypedef struct- d3 I" `( [* O7 N3 y
{! x3 B9 I) R8 K. |& m5 C/ [8 J3 }
        unsigned int a;; a  X4 ~* p0 M3 f8 ?2 L$ }% s6 ?
        unsigned int b;
) u+ {( a+ O# [8 f        unsigned int packet_cout;
) a+ G0 X8 h8 e+ K; Y$ j& U1 W; |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ n: k; {! S+ i. ]2 n7 Y/ m

- c; g! [; |* q; D- Y: vvoid read_MSG_buffer(int *baseaddr);
$ k) b) ~1 H. d5 E/ o3 N! t" Y$ Z' Y- W7 Yunsigned int count_copy = 0;
, F) r3 x( w  x: ]8 u8 D
' C; r; ]9 A! k1 p+ K6 Bint main()
! m/ Q. R6 r6 L" ~{
# I" I2 q) h( i6 o        int fd;
; A6 B" s, g6 ~% p        int *mem = NULL;. t# B& S2 ~( G) w/ L' w, N

7 `, ]8 e; U5 E) }& }3 \        if((fd = open("/dev/mem", O_RDWR)) <0), @) w: c2 P$ w5 K2 y0 @
        {+ }8 J# T9 {2 S- P
                perror("open error");
- R- p9 ~. j! s                return -1;
4 b/ h5 N7 F/ s9 N8 r        }
; N1 [: T% z/ h  |        
! l  m7 P, h$ m% z# S% [1 M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: j0 t8 x7 \+ D0 y
7 |* `, x; v6 u( p; C9 B  P7 N        while(1)
: u$ b8 ^! X1 P        {( D9 b* u; a, a' K( l1 e% F
                read_MSG_buffer(mem);
6 L' _+ h$ @8 L1 \( h+ _; F& M. m        }                3 Z; s8 l5 {3 ?8 g
}+ Z1 b* i" T3 @# e  p7 F) j
  ]! u  u. q) Z& q) k
void read_MSG_buffer(int *baseaddr)5 U  d1 G4 h, W( U6 K6 x( |: V( n
{
1 s5 d8 d5 e+ i: n) U$ @- f, S        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 N3 O! c3 l* A; T5 r4 u
' E1 H* n0 [: |6 S& @8 r        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 a& a) I) x1 s7 m
3 Q: @2 T+ i" P
        if(pshreRAM->packet_cout != count_copy)
* r9 }9 v$ [- x, C0 V# `; K        {
6 [; G6 m+ X7 n1 ~- ]/ J5 n2 I                printf("a is %d\n", pshreRAM->a);2 c3 p9 U& u6 P$ g7 O! L2 a# h/ P
                printf("b is %d\n", pshreRAM->b);5 P- y2 F3 ?+ ^7 U7 p$ w
                printf("count is %d\n", pshreRAM->packet_cout);
) j, T/ d, Z! K3 k- K  m                count_copy = pshreRAM->packet_cout;  L, j% |2 Q% l) z# N
        }
& R4 S) z# m: @6 |  k3 V        else2 z' X" T) Y- u: l! H
        {- `! v: J- V5 W0 ]; q( ?
                printf("No effective message!\n");
# z& Q1 N+ c. r: a& h- ]. H        }
" Q3 N7 z4 t" o! s4 J  `}
  k9 e6 V. q) M2 R; \2 T6 m: ?0 }- @$ |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: Z; G7 i4 B8 o9 U
0 Z- h# x# Z$ o$ n

2 R8 T" m5 Z* h8 K- L, W8 j! \
+ w% W( }2 x2 Q& D8 f" p$ Z$ R! n: M$ U





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