嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 B' ?% ^! e4 S- D& m7 H0 z

5 h5 {# Y6 Z, U* [4 s3 Y$ ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 s1 K* l) e) `$ ?  R#include <unistd.h>
9 t1 H- [: s  C& h5 A6 _: e#include <sys/mman.h>, `5 u2 h& ?( w5 [
#include <sys/types.h>) l% K# s5 ]) K: Q$ H( o' _
#include <fcntl.h>6 Z0 \; g5 r% o1 J1 M3 o/ p

- N" G7 R" Y; ~#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, w0 y! D  L$ T% F* W+ T$ @( z( B1 N0 ^5 r( f
typedef struct
3 T& n# r% T! l! E- H  N{
+ ?* ?7 `  H; G- k& A7 H2 z% y. p        unsigned int a;
/ u7 _9 g- a1 Z; D* Z8 _/ c8 ^        unsigned int b;$ Y/ i: c! ^; L  [# \
        unsigned int packet_cout;
" W' \% v4 i7 ^- |# A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% r4 q* p# Y8 d) e, F4 D$ p& c+ C* I) c8 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 J2 `/ S, O) V6 @& b! C
unsigned int count_copy = 0;
" K1 c; K. t  J0 O- ?8 k3 U% s" p$ G

+ q) H1 W  q: m8 f* Q9 kint main()
1 [9 U0 c. y' P( u: g5 I9 d! @{
8 T8 K2 }4 z' n) o  V        pRX_MSG_PROTOCOL pshreRAM = NULL;
# o0 t0 Z! |  l* P3 L' [+ L" \* A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 Q( A: l8 v* q6 m
. S, v3 b% A: g# y, W* s' R5 r        while(1)  y) V. E, S: i, K4 r" r  @
        {7 n6 B: W2 I- w" Q9 `# H+ p" h1 s& `8 A# ?
                read_MSG_buffer(pshreRAM);
# h8 b; J; W# S2 ]        }                4 s' w+ g3 H( B# B4 f! z  b
}( G& r$ N9 |! X1 O  @$ H- U

  X* f: u0 g& C7 T' {5 p* ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ _& ?; l4 x0 v; X) j
{. h2 y/ m5 q% X
        RX_MSG_PROTOCOL buf;9 k/ f' J  d3 S
        7 w7 T( M, _0 @
        buf.a = pshreRAM->a;
6 S, Z2 B* d- X9 r- t        buf.b = pshreRAM->b;/ P) t7 A5 @# P3 G3 a: [) H+ ?" B8 k
        buf.packet_cout = pshreRAM->packet_cout;
% p" }/ m( q1 Z: z9 [+ g  j/ y        
: E$ ?3 \7 e7 K7 X% X5 h6 F' H        if(buf.packet_cout != count_copy)0 F: C5 ^$ v2 p$ s7 n
        {
# C$ e7 x% l! r- i; A0 w* [                printf("a is %d\n", buf.a);
7 [, D2 m% [+ `* q9 I6 M9 y1 k                printf("b is %d\n", buf.b);  n/ p: D4 C7 @( w7 G
                printf("count is %d\n", buf.packet_cout);" ?: X  i3 e2 i. L
                count_copy = buf.packet_cout;& X/ N. }" }1 Z2 V0 M
        }
" Y0 M' W/ x3 U6 d  r        else
3 a1 F: W0 Y: l6 `! Y& f. ]        {
/ W' y! J" n+ R" O+ A% w                printf("No effective message!");* i8 {4 X( [2 r
        }* `8 P5 m, k  A$ Q) t
}
' u! F0 A0 }& e( q% T5 ~- v4 g) _+ X% T1 v

4 d: p1 T8 K$ p* Y" Q, m+ V1 E+ o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 U7 {6 h& ?& f) Z3 ^使用下面代码,对内存使用了mmap函数后:
* i; r1 B0 p& l0 n* p, n#include <stdio.h>
- w. h+ e. B7 N9 x- a; x#include <unistd.h># @2 U! Q  C3 r5 d& t
#include <sys/mman.h># m  z) i' T3 f
#include <sys/types.h>/ L, c1 {. c* i1 Q
#include <fcntl.h>) G: z  V/ b3 a
1 N2 b& T  w  S. I
#define SHAER_RAM_BASE_ADDR    (0x80000000)- w0 x" p; J5 L& @1 a
#define SHAER_RAM_SIZE         (0x20000)   / I# J- @+ n+ x5 v  x

8 T8 ^  Z. P! f8 Q' ]typedef struct
, i- ~) h( ^0 w! Z{; f7 u1 {9 v% X. e+ k" X. b
        unsigned int a;/ E9 J8 k5 Y( ~) e, e
        unsigned int b;1 P" `' s- u5 [, ?/ v- p2 Z
        unsigned int packet_cout;
/ p. e5 O, P; A4 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! `& s& f: i8 B' @& o: H: Y: T9 b( y
void read_MSG_buffer(int *baseaddr);0 r. k" V  \% h0 B( q) V" c
unsigned int count_copy = 0;
$ N  ^9 a3 ]2 Z% J+ x" b
6 x1 j2 R$ w0 j6 N% g2 Qint main()
, X3 ~! o, Z( h" P: H0 Z9 Y( m{' o( C! m# i" D( U
        int fd;. B9 l( \' G2 r5 {& U& h2 U5 ?
        int *mem = NULL;& P/ p- D# E, |/ b
( M/ i* [# V* c5 ~
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 `) g/ e* o. H$ s. [" u        {* Z2 Y1 {7 k# B) I4 q
                perror("open error");* i, r5 _9 r8 [7 x6 b3 H
                return -1;
+ l: h( |8 }7 V% G2 o5 {0 H5 K        }
5 C5 A" O  t  U/ g& B. B        
  C* w3 ^: ?% ]: x- u; S        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! z6 D* l1 y5 t4 \
- ?6 a2 o) V' _( {7 o
        while(1)2 g5 N5 |' d1 D' q: ]
        {- l/ f  G. L, P4 m* _/ q
                read_MSG_buffer(mem);
/ \1 I- q" R9 i        }               
, M" h9 z$ U$ V0 J' k4 k# a}* [5 n0 Z4 a, d( i) x: G6 D

% @" n. c5 d' f. D$ G) ]void read_MSG_buffer(int *baseaddr)9 ]0 `  X& ~0 o" a
{' F$ V8 f. r. Z) ?4 Z+ O, k  Q& Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;2 c8 |9 W  l* J: m

( s# Q6 ^; ?3 m' W( b0 S        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 ~. Q7 |8 |5 C
4 [1 O! q0 y% |
        if(pshreRAM->packet_cout != count_copy)
; c3 H( j5 V9 a" ]        {
: r. t" q' G% Y$ t                printf("a is %d\n", pshreRAM->a);
% Q+ l% I4 W1 a- Y                printf("b is %d\n", pshreRAM->b);5 z% i3 c9 Z2 r. g6 b  c! v
                printf("count is %d\n", pshreRAM->packet_cout);
: z! [. T4 u# c- }                count_copy = pshreRAM->packet_cout;
3 k- h3 ~7 o2 D5 _3 O5 M6 S6 N        }
) W* ?/ g. a# i- b0 i& i, ^        else- v" v  h% W+ q# O) s( ^) B
        {! b" _2 X. c- X+ G, O6 `
                printf("No effective message!\n");
+ q0 @: Y+ Z. A8 r1 K        }8 p! {# n! f! S2 W7 W+ W
}' l4 j1 W  ^3 [5 L; \; [

; N; d. r. ]0 F! {" r7 V; Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ K' j/ M! D  M

% I& |! p+ f1 m3 s& ^1 i8 Y/ r9 R3 O. ~! m' Y
1 U# s# }+ q  |7 x7 Y  r7 Z

% E3 k2 o1 L1 L  r- \




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