嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- ]2 z$ ?5 {; @4 R/ ^) N
4 V8 y0 c3 \6 f6 H: TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; y9 k. `7 i! x) V
#include <unistd.h>
4 [+ Q9 }' _2 V4 _#include <sys/mman.h>9 e3 L, D+ U) b) b2 X, x. z$ s" Y4 n
#include <sys/types.h>
  O% F. y" q) M# q+ X# n8 h#include <fcntl.h>
: H+ C0 P/ [# ^: _1 l
! x4 F' @3 T0 d- u#define SHAER_RAM_BASE_ADDR    (0x80000000)   & P$ o( G& Y. P6 e
* h2 z7 V  }3 l" @7 F$ c0 L% V; t
typedef struct
- s' I. y; V# ^+ S( l' h{" u# W  a6 C' o- H$ m2 C% {
        unsigned int a;
% G* q6 B8 r, G7 g. ^        unsigned int b;
3 R/ \/ ~/ G3 j- b1 Q& y; q: s        unsigned int packet_cout;3 k* c; R( W3 ~" K, K% Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  n6 S5 d& s* B* [. H9 @5 S
1 {5 v( x& |9 Q9 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 J- F9 s7 w0 ]unsigned int count_copy = 0;4 H, W" s  ^; g. j! ?
- @1 t. U. y4 x" f$ i- ?; K

7 X" e% I! d# i1 fint main(), `5 s- n( i* a' |/ S; ^
{4 d0 ?7 z, \. Z' s2 b  a5 U6 W
        pRX_MSG_PROTOCOL pshreRAM = NULL;" ?/ r4 I" C! N# u# c) t
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) x0 x" A; E) z, Y) _$ R: X+ z2 d6 z1 @0 W1 I' R
        while(1)
+ M, _. V3 o, c( A6 F3 V# j        {
, ^! v7 r. w- R9 P- Y                read_MSG_buffer(pshreRAM);0 g9 f" u0 ^' J5 f* M( ]$ ]
        }               
7 w5 B$ k% y( z% K/ A% M}" `% I" _4 V3 N; V' t

2 z' H5 k  U& r( a( l% n  A: Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 R) r! D2 \4 p; a4 ]( [
{8 }: h8 n- j' r2 q
        RX_MSG_PROTOCOL buf;
9 k+ I9 P0 v  p8 J2 K        0 i% {+ @6 y4 f( W, Y
        buf.a = pshreRAM->a;3 r2 `9 s# A5 C
        buf.b = pshreRAM->b;8 t7 D* F" N; Q# ]/ t
        buf.packet_cout = pshreRAM->packet_cout;
% q- a0 L. ]  X2 l        ! V7 R: u) d, b1 {- P7 G0 `
        if(buf.packet_cout != count_copy). A- m2 Z9 ?" v' q  m
        {; [& h# l, C; W; T% C
                printf("a is %d\n", buf.a);
$ j1 _: U; {' M- j8 w% X                printf("b is %d\n", buf.b);
1 F* g! I: o: m                printf("count is %d\n", buf.packet_cout);" T6 Z3 {  F' q: e4 |1 [
                count_copy = buf.packet_cout;4 j0 R; `" L6 r' w  C# M- f, ^
        }7 L2 ~  C1 D4 D. r
        else7 e/ e0 l# w) C4 r3 L5 y
        {
& E5 {. F3 F+ P- J5 E                printf("No effective message!");$ k! A" J# M' q, o
        }/ R4 F4 m% w/ V0 w/ K
}
% g3 Y- ^9 `0 t* ]. K5 P. n: W$ X  n/ d$ q

% l- B" u/ [0 ~8 i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 b# }! U8 s5 o" D9 A; W使用下面代码,对内存使用了mmap函数后:
! j$ t8 d4 m8 |- X#include <stdio.h># T* ?7 W2 x( S( X
#include <unistd.h>3 w5 t% n* @1 p# f
#include <sys/mman.h>; \4 T. x( k  m, N
#include <sys/types.h>
+ L9 F0 u1 M1 z4 E8 A. w#include <fcntl.h>5 q# ^9 W1 W4 l5 w, [2 x% e
* @8 g0 Z. g8 p7 j/ {6 u
#define SHAER_RAM_BASE_ADDR    (0x80000000)7 ~! L3 N! X  Z9 m
#define SHAER_RAM_SIZE         (0x20000)   " b; d+ r7 n8 [. A3 L" [- F

1 ]1 s! K4 s( l, htypedef struct+ z, c/ I  S# B0 |
{) e' j: a; F3 G1 N. Q" Z# w+ G
        unsigned int a;. `: }3 X8 a+ Y7 [
        unsigned int b;/ O# n* u7 r' n* H) `+ U: S& O
        unsigned int packet_cout;
, i' ^+ W5 r6 E) @7 l* o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, v9 h5 V+ z9 n3 p8 Q5 e% O6 K

- l% x" x! o5 p* E8 J0 v- cvoid read_MSG_buffer(int *baseaddr);0 P* K" l$ l1 }( [$ v
unsigned int count_copy = 0;
8 J; }! Z/ r8 Q/ d6 E9 i' G2 T7 G) }/ u6 E
int main()
. c  n/ U- `0 p% H& q. c8 w5 S{0 C' o% O+ f% O) l) w# V* ?
        int fd;
+ E) |7 I% U( t: Z7 }2 F  W# ~        int *mem = NULL;" |) @* L' D, [

% |- j7 s1 r( d$ Z& r4 }" t        if((fd = open("/dev/mem", O_RDWR)) <0)
# Q4 b+ A4 }" L' P        {! [$ c; ?* \& H
                perror("open error");# f4 q* |" y9 b4 _4 m
                return -1;& v/ `2 E* ~0 @5 f0 J$ f: m) @
        }3 `. X: G1 D2 y( O
        ( ?: I3 t2 v7 ^% }$ N. K4 R
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, ?5 \, ~5 L9 V- Z' v' ]$ k

* I$ @7 Z0 D1 B, o8 H4 D        while(1); X2 J; g# Y# Z: B( w, S( E2 G2 Z
        {
  c, p: A9 G6 g                read_MSG_buffer(mem);
; D9 r) _: a; I( Q7 Z8 c        }                . n, c1 k# B5 U1 C
}
* c+ E; D7 B0 F+ E2 F% s
; |- }' g/ G! g( l) f' n  o1 bvoid read_MSG_buffer(int *baseaddr)" N) L+ }& ^# [" t/ b
{& B. `! @3 v. Z9 I- U$ P3 W; Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 \' F- F# p1 B" g5 C7 U% ?! R- Q
6 a" }) y5 @( X5 Q+ l, V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# _+ z8 s/ l" N  C, V
! R9 [1 O  R7 Y2 w9 e7 L
        if(pshreRAM->packet_cout != count_copy)
6 i( c' A% u+ X# G4 _6 B) t        {0 [' l; i" K$ z: [
                printf("a is %d\n", pshreRAM->a);& c0 l: Z, _6 I( i3 U$ ]
                printf("b is %d\n", pshreRAM->b);
, |2 T, P* W8 u( _: O                printf("count is %d\n", pshreRAM->packet_cout);  c; q+ y' ^: t( e* R
                count_copy = pshreRAM->packet_cout;* p/ }3 d' h1 c( c$ z
        }
" ~7 Z' X/ ?, O+ u& V        else
& w& _5 i: _3 Z& ~- I7 L% W# ~5 h        {
! w7 ?, a: S1 M$ b: @& G                printf("No effective message!\n");+ v6 ~$ n$ J. N
        }& `% P, u6 c! q. _  U  N
}
* i; t  H. E0 f% D. T5 H+ x8 [: P% y7 l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 ?4 X, _. y. @" Y* h. \8 g

7 N  M  o+ C6 |: {+ Q2 a( D2 b1 T; M, ]) ?! Z& o

6 E2 p( Z! K  X/ P6 f( [
$ ~8 ~; o0 U2 O" }




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