嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 ~' s$ Z6 D$ q: D* Q5 s

! Z+ b: }  F% N3 e4 s: kOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& ^+ j, D5 C! _5 w- V, Q#include <unistd.h>4 c. f6 [$ p% _2 C/ q( T: B
#include <sys/mman.h>$ o4 U% J2 F+ @, w+ ~
#include <sys/types.h>
3 @( n9 ~; o6 \% u4 g0 ?5 ]#include <fcntl.h>- w! h$ S4 I) J1 Z! K+ t2 T
  k9 E5 B* O5 L! u
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 ~. ?* v- k2 o/ ]
' d8 r( M' I% q; l0 jtypedef struct
- l8 B) c8 U) f{( d  g: H( H0 n; P1 B5 g
        unsigned int a;7 n  d" D) _6 z  u
        unsigned int b;. y0 {6 {; w. R# k7 M0 X& j
        unsigned int packet_cout;/ g3 Z+ k  g$ K9 j7 p! A/ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 K/ q$ N+ x( E4 Y. Q6 s  c

5 w3 d% T0 f: k; jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" g" ?& X% N6 k! Iunsigned int count_copy = 0;6 m6 ^, z! B5 s

/ I3 t- L0 j2 _" d! s
5 v  C! T  s* g) h" e5 Mint main()& R1 L3 v. `2 Q) I* j) M/ i0 K5 t9 B
{" l, w1 {5 @6 Y/ o' `0 H  v
        pRX_MSG_PROTOCOL pshreRAM = NULL;, a+ E0 d' E# ]# Y" ^  w4 U2 ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* ~3 A+ H8 X* l0 r8 d' {" s9 F
% i: M# |5 r+ g# {) ~+ D- ^6 K        while(1)2 w; |1 M. d$ j: L
        {$ ]5 S- y9 R# I. a$ D
                read_MSG_buffer(pshreRAM);
5 ?3 {. g/ B9 `1 o        }                # h+ e5 U6 Z+ g2 z( t0 P
}
; g* _8 p, ?2 k! ?2 X1 k  ?8 u( q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! V3 b2 n. v/ l4 a2 [1 P{, w% z/ ^& C7 l7 j) k9 X0 t
        RX_MSG_PROTOCOL buf;
' P* X' [+ ?" d6 r# C: {% K        
: Q7 Y) t  |6 l. R7 D- e        buf.a = pshreRAM->a;6 i( m* |7 M' G4 X5 [. z+ g
        buf.b = pshreRAM->b;# T( B4 r9 N- H2 X
        buf.packet_cout = pshreRAM->packet_cout;4 W" j" N1 q* o- t1 c
          ?* R! I8 e, \9 n2 {2 ?" `
        if(buf.packet_cout != count_copy)! i* W5 V; u5 D5 C% u+ |
        {
4 s- B. @- i0 s  |+ Z$ J                printf("a is %d\n", buf.a);/ `6 e# ~7 c( }
                printf("b is %d\n", buf.b);  A* q+ X0 _& p; @
                printf("count is %d\n", buf.packet_cout);
  i- @+ w$ k  g/ m                count_copy = buf.packet_cout;; c  N- N8 @( s
        }
5 H; P0 a1 w2 @# x        else
4 P2 `) \% p) e  h& N        {# [, }1 P) c/ ?# K5 i
                printf("No effective message!");
9 U" Y& y1 |1 [        }
7 n9 ^3 w; z* h0 T" l% t}
0 t1 i) X' Y. ~2 w0 f+ O% B
) i2 {. c8 y+ M
0 j4 L( X7 {9 v. T3 W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 V0 j. H' J# Z* R( h/ S+ G% K$ }! |使用下面代码,对内存使用了mmap函数后:- D& e1 R8 a4 g3 H, k. `2 f' i
#include <stdio.h>) [( F! x0 u& l. y' f
#include <unistd.h>
  @+ Z- ^* p+ a! n#include <sys/mman.h>" g" W/ }# ^. P, b* J6 ~
#include <sys/types.h>9 U3 M: o) J. L0 A$ o
#include <fcntl.h>
1 K. A8 X, w, ~; f, \% |
' k" l6 v6 P- W  y- B# N8 R#define SHAER_RAM_BASE_ADDR    (0x80000000)6 w* C& m& |7 x) R
#define SHAER_RAM_SIZE         (0x20000)   
5 O4 y( w' Z- z3 ]; ]: u& b: m5 G
* P+ F: l6 j) ctypedef struct. [: ~5 f9 h3 x( k  E* C; N0 t( n
{$ {% t. ~4 l2 l$ e  H
        unsigned int a;
0 z. O0 v9 @  ~% ^0 a% [" B, y        unsigned int b;+ q% u: q7 ?- s4 c* c
        unsigned int packet_cout;4 u. e* ~: O6 K6 f7 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. w" t: b: E$ J" J0 A' O2 A; t8 D
0 V5 D$ w5 a8 ~: K9 N7 q
void read_MSG_buffer(int *baseaddr);
' a; y; @) T6 ~! U9 _& Z# v/ @. Kunsigned int count_copy = 0;
- k0 P( O& K, s7 X0 P% ^* U7 m: M/ L3 s
int main(), Y6 i0 I* j) W/ @2 F. ?$ p* k* T
{
, b& t: K0 m; G3 ~        int fd;
8 L# o# N' j  A9 d        int *mem = NULL;; t: k' \! G( h

& C1 p$ H7 K6 X9 v, _        if((fd = open("/dev/mem", O_RDWR)) <0)3 x8 I' ?" z0 K0 E. o% S3 J7 W  }
        {) L) i; j) \( Q/ L4 i
                perror("open error");0 }) x6 K3 \3 {8 \' j6 C- }
                return -1;
+ t+ L! {  B) ?5 [        }/ @% s' o9 ^7 ^, A; ~0 O6 J, k% w8 A
        
- J+ s* a* P% p0 w$ L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% p2 t- Z* x! I4 n  C

' ?; Y8 a  N8 p; }# Q+ s7 n% Z$ `        while(1)
% J2 ^8 W6 D: h8 k& U5 s        {2 _  |; [* T8 A- A9 o2 D
                read_MSG_buffer(mem);5 V' h! d4 w( m' j. f$ K
        }               
" ?" j8 f* a: C& y- Z7 M}5 }9 ]& Y  L$ i9 P/ k

! d$ P, Y) ^, {- ivoid read_MSG_buffer(int *baseaddr)
& I+ k5 r. \2 Z+ ^6 {3 ^{4 U" }& X" d& C5 Q3 i
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: g+ z, e5 F# F  z- y$ }+ z: q0 Q) l' Q6 v* K  A2 O2 I3 @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# ?( `* ^+ r) \  l7 r# h" j# g

& v7 R3 Y* N3 j3 a        if(pshreRAM->packet_cout != count_copy)
+ x& c  q3 X, X4 u; X        {
- R0 `+ A9 w& `4 x, {$ b5 r! D$ T1 t                printf("a is %d\n", pshreRAM->a);
, p3 _# g: W- n$ W: N6 y, P                printf("b is %d\n", pshreRAM->b);+ N: C6 a  m: H  i! {
                printf("count is %d\n", pshreRAM->packet_cout);' U* Y+ E+ C# w1 A
                count_copy = pshreRAM->packet_cout;
  u8 Q* P/ @: [" N4 M        }+ d' G4 r( ~5 g% ]
        else
. X2 j: Z3 S; r+ V; q8 x        {5 Q! M: a( r  I$ E
                printf("No effective message!\n");: i, `$ Y/ F; `: W% Y$ q
        }3 w# g/ D+ N$ f, s
}7 p! R, k/ r; c' B# H- R# ]
0 J* _- R% f' A3 y" i1 a) j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- Z; W* A$ J+ ^3 k  {- v2 P
: }7 c/ ~$ N# U, E' A! E2 f  r4 y: n& @9 m

. }" [6 _* R, x- F3 u
1 l- k. a' I+ n5 B: Y




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