嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 a% L# Z  U4 y% s8 e( h( W

( ~1 u9 ?) @' s0 b0 XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& Q; t/ v, }" u( P4 b  |. H
#include <unistd.h>
9 A1 C! [# @  I$ |#include <sys/mman.h>
& v3 B# G7 ]0 o0 Q' r8 }4 h#include <sys/types.h>
0 t& p( X/ D, e; n#include <fcntl.h>3 I, z- X3 J9 ~
3 w. s3 J. d& j. Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 ~% _' j) O0 v5 x" D

2 h& }& F& e5 e, a2 b" _& E- q3 Ptypedef struct
) s7 w1 k% k; m3 P+ d9 I{+ E+ f; O1 y$ Q8 U
        unsigned int a;
0 ?) ?0 e  B: }: s+ D        unsigned int b;
' d2 w0 H/ ~8 i        unsigned int packet_cout;3 @3 t; X$ z( n; K, f( y! n) J0 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# m- Q6 X8 a' B; T8 O/ f+ N3 J; O  o$ G9 ~! ]8 V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, Z: _1 n& Q" k7 Y. [unsigned int count_copy = 0;: t! \) N  k' t% |3 \" r2 c" h
, \7 S$ R" L4 L
4 L8 k/ i: W: ?% `9 a8 ?. S5 H' s7 J$ E
int main()! b# p* m/ M- b  R& e
{& u! {. u3 Z! `+ {0 q
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 t% p& h1 b$ r" n* x' s
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ x& _- w  t& E% p" E% V- [% o

+ F8 T" }- V/ n+ I' l1 h        while(1): S- l" [8 R. f' |8 J3 a
        {! U6 Y; N4 I# c; p5 n) w0 y
                read_MSG_buffer(pshreRAM);
3 T! [! }0 m( h  ?8 P: R" g5 r        }               
- @* H7 O) ~6 S}+ ~1 u1 ^% c+ B# t, _$ W2 t
6 z; v. q2 X0 z. _& h+ J2 y& Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' N8 f- l) ~7 ^/ P$ I. p4 b. h: P$ `9 B
{
/ q5 S- p( r. P        RX_MSG_PROTOCOL buf;
4 K6 D6 U# D& v+ U  j8 F& O/ u6 p        
  e7 t) l3 M. J8 s: t+ S$ N$ G9 X        buf.a = pshreRAM->a;
  @3 D8 }7 w% c; {        buf.b = pshreRAM->b;
! \" M6 x4 l. P! _% k, d        buf.packet_cout = pshreRAM->packet_cout;* T0 [8 }+ J% ]
        6 h2 L2 m/ }3 ^1 u% z
        if(buf.packet_cout != count_copy)
& G" P5 m5 c* Q* q; a# v. D        {
- p, J. f& b: U/ a8 h. u- d: C                printf("a is %d\n", buf.a);
3 I( b( u' \0 x, f9 i4 s                printf("b is %d\n", buf.b);
& [: E; k& Q7 [. I: l                printf("count is %d\n", buf.packet_cout);0 r! \  ~3 U) m) {! |1 i1 _
                count_copy = buf.packet_cout;
: K% j; \5 e4 f2 J        }
, O! ~8 i0 @$ H: R$ t5 }        else
, ^) ]9 @) u3 \" g        {
! j9 c  b4 t$ P! F3 t                printf("No effective message!");
5 v0 C4 F9 @9 V& g* [& h        }
- M$ x/ L- @: a( W% D( V}8 X$ G, `5 g. z/ {1 B5 _4 H( E
' w6 J! j; Y, C, Z7 X0 j5 E2 r
# ]0 @; _) A* f1 ]9 `! O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 {% K+ z4 V* u6 Y; m9 M2 o
使用下面代码,对内存使用了mmap函数后:3 O8 L7 q3 Y. Q+ }, P
#include <stdio.h>) W* g9 Q2 r' {8 {( i# Y
#include <unistd.h>
- m1 S2 }1 E6 G' t#include <sys/mman.h>
! S. [- Z- v" z) c#include <sys/types.h>
+ S7 |( y# X& U#include <fcntl.h>$ l2 A! y' _+ V, I0 J# S; h

4 j3 O: H+ I+ g6 h3 x+ @#define SHAER_RAM_BASE_ADDR    (0x80000000)
" x( p7 g: F  Z, N" G- R) E#define SHAER_RAM_SIZE         (0x20000)   . h9 Z( m, S8 d. S. P4 L4 [

1 O9 H- r# d, ], z9 |& wtypedef struct
! b  j& _* w1 n/ F{
9 t+ U. n( a  q        unsigned int a;
% `7 c. L/ ~; J        unsigned int b;% M" k( D8 m  K" O: s1 m
        unsigned int packet_cout;  g% i* E2 z1 h9 O: Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ Z; U" O( X6 v' W; j8 A8 B6 d- V7 q; |+ z
void read_MSG_buffer(int *baseaddr);
% I; k* R2 |6 B' nunsigned int count_copy = 0;, E* _; {- Y2 l
9 o( W9 E5 a# x
int main()
7 {' @+ ^& j7 L) T9 I{. R' ]1 @' V" r; x7 K+ n7 N
        int fd;
9 E5 `; W8 A) p, I        int *mem = NULL;
1 |9 L$ A" |5 G2 t" e1 U; |/ ^  h6 d1 D
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 s5 P* v8 g$ U8 u/ r        {
! q. q  y. O3 t, L. D# ]" Z  w                perror("open error");
- d$ y2 f9 m2 d$ t  ?  q3 O                return -1;. r2 }" c. L6 Y+ i- v
        }7 |! T, }% i7 b3 a( k
        , s3 x" t& q4 [
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. U' I4 a; O+ F: y
, K; t( i3 P/ k9 }; [* q8 D' t$ J- c        while(1)$ d3 U" z! ^3 Q) Y- n! `
        {
1 B" x4 S+ J! Z# L0 T                read_MSG_buffer(mem);
) X3 n' X! w3 b  N, W  v$ V  W        }               
6 L* J: }( _, \4 n' b* W; U8 k4 A5 M}  G, o7 B& ^6 C" Z0 Q; S& J

) ?: U" r" D, F6 V! f4 ?  |3 ?void read_MSG_buffer(int *baseaddr)
7 s9 E! `$ h/ S# X+ Y{6 _6 J' v8 h/ G1 S7 z! I) T' P
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" B7 c! {% `" q+ e6 r/ c$ \+ W( A+ {+ C& n2 {6 A, L0 J
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, q) e- [1 Z8 M) @; P; `
$ {9 }$ S4 A; j" F/ n        if(pshreRAM->packet_cout != count_copy)
( N6 N1 B5 A; Q7 h        {
- A* }& s) a( w$ N3 U) C6 v                printf("a is %d\n", pshreRAM->a);1 {6 D: ]  D0 ^: i
                printf("b is %d\n", pshreRAM->b);
/ Q9 H* S7 e  r6 `                printf("count is %d\n", pshreRAM->packet_cout);
1 e7 {  b4 w2 D: V5 d                count_copy = pshreRAM->packet_cout;1 r- U4 ^2 ]# s3 a7 M6 F
        }7 V% S0 q8 _  r1 W+ d9 S
        else9 v3 B( L) P+ [9 F& Z
        {
; ?1 T2 m+ m; k: i# f                printf("No effective message!\n");
. U. l! o0 r+ C! {; e        }0 M5 Y8 C. q" |2 y/ l  y3 U' U$ s: o+ T
}
9 x) d/ I( h6 P* o3 p( M3 D  s1 `* d2 X, H* B4 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  x/ }0 ?1 v6 a1 E
/ P: T; w% |) W: e% {& T7 O, d& Q
$ v& T+ g4 E. i
( [( B1 r, ^7 w$ e! H' [





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