嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 @7 ^9 k7 y: i

2 [( e; K* l1 cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 F* S% ]* E7 k  i#include <unistd.h>
2 ^( Z# P" h. b#include <sys/mman.h>
$ Q4 _5 ?5 H) Y#include <sys/types.h>
/ |# f* v% P6 w% c#include <fcntl.h>
0 q' e4 x7 Y* c0 f! ]2 G9 ?$ e8 u3 U) d6 R+ a; b: S0 q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 m8 }3 B% v) x3 S' c0 A$ V5 F" U' m; l0 h0 D
typedef struct3 O! G8 P( M$ p, z
{+ v' S4 G2 R6 ?4 g3 U! m
        unsigned int a;% r' g" _1 y: r
        unsigned int b;" ^5 c* @0 S4 `
        unsigned int packet_cout;
" D% I: h2 o: M- u# _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! _* |& y9 J+ Y) G. R* ~6 c
$ P- X( ]; O, m4 K/ P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: K" H8 q- s1 c3 runsigned int count_copy = 0;
" R& v- r3 H1 t3 y+ P
9 g) {2 ^" d6 E( ?0 k
* r# ]; n8 [% o. e* z' Iint main()5 i% a8 J& p- X7 y
{
" x: r, R0 m, t        pRX_MSG_PROTOCOL pshreRAM = NULL;
: @7 m' j5 u* P% N5 U# h! z+ f/ z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 M) j( ~6 c  m  W8 S
. x5 U3 J3 D3 p' J# m# k! K" \5 R        while(1)
- Y8 w4 H% t3 C, c- F; D% `- t        {0 `( G% Z6 b, i, \8 N8 T) j9 A
                read_MSG_buffer(pshreRAM);5 z( q) S) I1 d" ~- X  {9 d+ {
        }                5 K, X8 q1 I5 _% G8 M; X9 R/ t
}
' n- G: l, u9 \! U9 ~2 k1 M: U: }- Q
+ c0 H2 w: q! D3 c& k. mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 p9 y! C. u0 G: Q( Z6 ?{- ]% Q; A# f' S* C
        RX_MSG_PROTOCOL buf;7 z8 h7 z; s4 M7 }2 b( i- `
        2 N( q2 B, I3 D
        buf.a = pshreRAM->a;& Q9 y+ I0 A* B# i
        buf.b = pshreRAM->b;$ k* C; p! W9 \) v/ R) Y/ n; j
        buf.packet_cout = pshreRAM->packet_cout;& [, W  V) j. I& e8 l* x( ]
        ! {3 [0 y& \, d, Z
        if(buf.packet_cout != count_copy)
+ |8 Z1 Q6 ]. S        {) F* H, F  Q+ s3 A
                printf("a is %d\n", buf.a);
4 \, v9 W2 R2 d! q$ [! S                printf("b is %d\n", buf.b);
2 k0 V7 W4 ?+ g6 P/ l9 R                printf("count is %d\n", buf.packet_cout);
, L# h- `5 ^) Q6 m2 i/ h3 Z                count_copy = buf.packet_cout;
2 S3 J! d& O: m1 Q        }- p- c5 o' F( Z2 m! W$ f% I1 b
        else2 Z, O6 q6 G. ]
        {
; ^' u. m1 i8 E                printf("No effective message!");9 J; W( h! r+ V# h( v2 }4 U+ `
        }
: A6 e* ?$ F6 o; T0 d}
( q+ g1 c0 v1 s- s7 p* [* j$ ?8 [( l% O* M3 V
4 @/ J0 {5 l4 G% a6 x5 ~4 G
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 [" [5 T' G& ]3 ?使用下面代码,对内存使用了mmap函数后:
1 W! Q& s* ]) D3 T. q; v5 ]; I; ?0 l3 @& p#include <stdio.h>* |0 Y' o* q! _4 ^
#include <unistd.h>
) J6 _& T1 i  T4 I8 Y$ j; y! U5 M( R#include <sys/mman.h>( v. G1 R3 ~( b7 y, m( ]2 q
#include <sys/types.h># ?7 a0 V& t+ x: w! ~% n9 t2 I
#include <fcntl.h>
, z1 v7 O0 y. L2 a
6 _5 T+ P5 U* g- J#define SHAER_RAM_BASE_ADDR    (0x80000000)# j2 S9 a- X* K- G% a, l
#define SHAER_RAM_SIZE         (0x20000)   # ^. ]- U9 c5 _8 a" i8 B

. j3 E: o: F- `7 y, h4 Qtypedef struct9 L0 o; g+ W' E9 c! F2 }
{; _3 P7 @- g7 W7 K. t$ B# I
        unsigned int a;+ |  `% O% e8 q' k1 f9 p+ d
        unsigned int b;1 h- _1 @# K' R; C; M0 Y
        unsigned int packet_cout;
% N  h) Z/ A5 N0 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 n9 [4 \$ N4 m$ Q" W
2 K  i  r. Z6 }( d0 d4 Avoid read_MSG_buffer(int *baseaddr);
  ~* }" @( s* s, iunsigned int count_copy = 0;
3 M, x  r+ \- U6 a/ t
: w+ o3 T: J5 ~/ Iint main()
" o% e# K3 e; e% q' c* h4 T{' t6 F+ }$ c! A) U4 S% p5 c/ b2 w
        int fd;
! M; p8 @3 Z  `  P# X( v        int *mem = NULL;
# _' Y9 x4 \. k% ^
. g& \# B( X1 N- I. {/ l        if((fd = open("/dev/mem", O_RDWR)) <0)
1 \; @  o/ \6 T% r" T        {) r8 J1 P- P+ w' Q
                perror("open error");7 Q( e% ^* a) j+ d7 R- s; l; o& a
                return -1;; t2 R. c1 e$ t" i1 a  b& E" ?
        }; s2 I: W" Y# ^' \4 y/ W3 _
        
/ k6 T1 U6 T. z) m5 j7 X( W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 }( \4 \. a! M/ s
4 }; z, N$ L1 H/ N2 G7 h6 }
        while(1)
4 ^2 d- ]% X5 V; L% @% V& H' [        {2 }2 S- j  f& Z' G
                read_MSG_buffer(mem);3 y" z9 T% b! `9 v' O; x
        }                1 d6 f0 d5 u, m- ?4 y
}3 V* E3 P* n- D! B6 H! C
' X: H! I+ D; ]; e' I  B
void read_MSG_buffer(int *baseaddr)
: ]" F' c7 j7 |( N{
1 j5 j7 C. r( P: L        pRX_MSG_PROTOCOL pshreRAM = NULL;7 R+ z  l, W, ~% m
8 w$ e6 A: @: e; {( n  d0 j6 ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! W& I% t/ C; U8 z8 z

3 |' Y: u4 ^* |$ z* U0 a$ O        if(pshreRAM->packet_cout != count_copy)5 ~! T% z2 v! I
        {
; {. H& j3 Y+ S  X                printf("a is %d\n", pshreRAM->a);
* ^  j8 l1 [5 A* c, `+ t                printf("b is %d\n", pshreRAM->b);. e5 G3 Q- I: S2 i: m3 J
                printf("count is %d\n", pshreRAM->packet_cout);/ t+ }7 ~) [( W( @3 y! B/ Y
                count_copy = pshreRAM->packet_cout;
3 }# a6 z6 A  Q% h: N        }+ ^. A3 U& \+ p2 t+ u7 ?: H
        else
9 g  g% X; O2 r0 ~. m        {# \( @& d, H. A/ k8 A
                printf("No effective message!\n");
9 i2 A: V9 S/ M        }0 @& J2 g3 _7 n" o- f. o
}/ K1 n3 B$ Q. e# N! s# x( a
: Q4 _2 O" P3 ^9 s2 e: K5 {9 H( j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* d5 J7 i" |$ y. W
0 M7 F& G! a! ?& S2 P/ v2 P5 F+ d
/ X$ t+ ~- B3 D4 D
, u1 Z5 s0 F: P) J5 t, @





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