嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 y4 @( ~7 K) |/ e( X
( f7 a  Q" p  w  Y0 L, A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ y( e$ j: w/ E) I; H& p#include <unistd.h>
- C/ F) y6 W5 }: H#include <sys/mman.h>
: m* U" H% q( g+ U8 [+ q6 u8 q#include <sys/types.h>4 i6 s. r6 G( \, c) ^. C4 S
#include <fcntl.h>
" w1 X. B* b7 C& _( \+ I# @. u1 r$ n: R6 l
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; Z0 S  [- \9 h, D6 V' \3 ?) m$ ^# z, ~& H( \- m! U6 r
typedef struct/ x* F. |: n, @+ ^9 V; y' Y
{( @' ?) z% W3 b$ j& Y1 f
        unsigned int a;
; d2 s& b, a4 k8 i) E        unsigned int b;
3 Y' o9 _  ^9 ]0 W0 u' G        unsigned int packet_cout;
5 }; C) F- J! X) m1 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- {1 ]. ]% V, H  Q% e
4 D, }, }: Q! h* q+ z( @$ h; t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" t, p1 @% u  F9 n( Runsigned int count_copy = 0;- ]' G9 K8 j9 i: h: T
( M" ^# W% ^4 a, k& |3 j  j
' h' b1 ~8 i' s& O
int main()0 i$ E" y. F+ H! M* Y+ s& K: k: }$ p
{
$ J# J( I, Z0 h' L3 Q        pRX_MSG_PROTOCOL pshreRAM = NULL;/ s% K! \: I& }+ k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% @7 n# f1 I! y% t: n: W  y4 z2 ?; b% f; ~9 x
        while(1)  Q" N% C2 G3 \5 J8 d4 `" ?3 z3 t
        {
* Z- g" _4 Y. M- C1 \                read_MSG_buffer(pshreRAM);9 ?$ G; h9 _& \- c! D8 L
        }                ! ]3 p& `% d# M) M$ i: c( H# ?, X. r
}9 Q/ j% |4 M' E6 \# e+ y
$ K& h! s4 K% |* W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- T) L  \% i% @; M4 O- Q0 [* p
{  V; Y) B9 O& ?; K# `) Q5 h
        RX_MSG_PROTOCOL buf;
7 p' r- ^( J* N  k- L4 U; ?        
' }' r4 }6 M; u        buf.a = pshreRAM->a;
4 Y4 R, L* s! N' P        buf.b = pshreRAM->b;
& U: \. Y/ [* I/ U9 S        buf.packet_cout = pshreRAM->packet_cout;
8 ]* x8 s9 j: v- w        
5 E5 E. j3 z0 b; {" g9 S) ^        if(buf.packet_cout != count_copy)+ B4 }9 v3 k) M: N0 ~
        {- t1 E% t5 F# }# R
                printf("a is %d\n", buf.a);
8 N# e8 y3 x6 T6 Z2 k                printf("b is %d\n", buf.b);8 n+ C- K0 C6 R; u& z) G" z
                printf("count is %d\n", buf.packet_cout);6 }7 H( C1 ]! |- o
                count_copy = buf.packet_cout;
, y$ Z/ E' u$ B. R' d9 x" Y4 F+ ]        }
+ L3 f( Y! c, J8 @8 Q2 V        else
0 b8 D  {4 a4 Q  H: ^/ P( \        {9 g' d, f9 l* ]0 t' j
                printf("No effective message!");/ x6 I& s/ E9 d6 k9 @6 i- \
        }
( e! k) w/ n) f, k: c}
7 X6 g' ]+ Q7 t1 Q, L, l5 d2 o3 ~' A* F4 G

1 d  V2 x5 s5 B' Y2 O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  e/ V' v3 h5 b8 A7 I' W8 ?. o使用下面代码,对内存使用了mmap函数后:* D- q2 L# B' F! U  Z( V4 \
#include <stdio.h>6 n5 b6 s8 W( [7 G
#include <unistd.h>
% A1 t4 f8 O8 _/ z) v+ U#include <sys/mman.h>
) K; E  ^; m& K7 a- Y#include <sys/types.h>% A% @2 a; E# a
#include <fcntl.h>
1 o5 J. w# v: ^7 I2 W$ W" R
+ \0 R; r) ]( R1 Q#define SHAER_RAM_BASE_ADDR    (0x80000000): E- ^$ x1 ?. P% y( E  q1 E
#define SHAER_RAM_SIZE         (0x20000)   
. v* l5 W- u: N8 F0 m8 z& O# m; x( Y7 r* M  C6 t7 Y1 ^" F! p; }
typedef struct  D/ v* o) K2 l4 @, X" ]
{
% O9 }% f& u: I3 I0 j" B/ ^        unsigned int a;
( h0 i5 M/ U) y( q# B        unsigned int b;
) R; k3 j7 O* d! i! f$ ~        unsigned int packet_cout;
5 E; ^, f! E( C/ x: s" _% ?! K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 `- j; B5 c$ j( e+ _# P
  g- f# b) b! s* J+ ]
void read_MSG_buffer(int *baseaddr);9 R0 \  K; Q& E( ~
unsigned int count_copy = 0;& m8 c7 M* E+ Z! Y

  `! \6 A# k/ @0 d/ nint main()) [" J1 w4 m5 }& h' f$ M* P7 `" t2 }6 W
{
1 ?0 |4 ~! b3 H1 j        int fd;3 b3 A- O* `, B
        int *mem = NULL;
6 f. J9 f/ z. |& p0 I# Q# ^) S9 ]! s3 \6 V! j
        if((fd = open("/dev/mem", O_RDWR)) <0)) @, h( N* ?- A  q
        {
: b( M( }; S3 v                perror("open error");
( T# ?. x# j7 ?, ^- \' n+ f                return -1;
( p6 y, s7 C2 G9 D        }
% w. K' e1 b* z# c" x3 y1 v" C        & b! F% P/ b% E+ S8 u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% x( P. Q4 o2 F. `- z2 L2 F6 m1 |+ r) i9 ~& o; `# Z
        while(1)
" i  Z- c: @' z        {2 [$ w0 b) Z3 Y/ \, g, N- d# |: A
                read_MSG_buffer(mem);
5 D, d$ q4 C' W8 e7 A4 n& Z        }                % P  v& o7 S6 f2 j. f
}
2 N$ y+ d3 `% S9 J* g. a- p; N; d$ e( n, @/ q. @* `
void read_MSG_buffer(int *baseaddr)  Z1 {8 A& K6 |
{
+ [3 n- `' a, `6 M* t8 V& t        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 B2 o2 s* [: }
: |, x8 W; ^) Y$ s3 m4 C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( [% {# M+ e7 C7 s
! r& Y  X4 A- H) {0 W* J        if(pshreRAM->packet_cout != count_copy)
' }/ E" O, C+ T( Z. U6 @; i) ^        {; d2 J$ C4 f8 z0 |. P
                printf("a is %d\n", pshreRAM->a);: E  J. e5 N  t) Z$ A
                printf("b is %d\n", pshreRAM->b);( ?! r7 F. w2 B4 }9 T
                printf("count is %d\n", pshreRAM->packet_cout);
# ?% q" m4 V% p+ l2 `                count_copy = pshreRAM->packet_cout;: `6 ^" [' M5 G: Z4 u! F
        }
, ^8 M; W2 H, _  L% t* Q8 n        else
- p0 w0 _3 V- u. d; }% a        {8 p, l% V6 x. N, M$ _0 S
                printf("No effective message!\n");1 O6 o, `+ h! p$ h* h. z; i: K3 ^
        }7 B. L! ~4 V& Z
}
7 @6 r6 A  ^9 o( s+ h2 ?: W9 P3 G2 T3 s4 G- Y) u5 ^5 b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 ]" J9 P& n  v. @, k% [1 c: H: d3 ]3 y6 l/ u
) I! m& G: g; z: {3 _' Q

5 C9 f& r, [* w+ l" [7 X6 x& M) G( Q" k: s$ Z





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