嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" A  }# V% O: Q' r. n7 V; b( t/ K8 Y, S$ q' \8 V$ A* }( G. Y% Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! Q7 _2 y5 T4 z5 z; s) g6 b  e
#include <unistd.h>
, w3 c6 l- N. L7 \; v#include <sys/mman.h>' a6 ?5 F9 C: h- ~3 ?% C
#include <sys/types.h>. m2 G) c/ K; @
#include <fcntl.h>! y' O! m* T7 }+ W" u
& N$ P9 Q- u% ?% E) M& N% |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% ~. V+ i" x& w! g* d. n
/ d" a" s+ M" O" J; U, l7 Ftypedef struct
' L) ^1 j0 L( k4 `{
. X2 G7 s! W8 z% s        unsigned int a;
# d# o+ ~8 v" o. ]. R1 a: A1 Y/ D0 z9 F        unsigned int b;( p# B+ Y8 _2 u# I4 S) S
        unsigned int packet_cout;" h5 M8 T2 ^. R- O: \( m* r. o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& L/ Y, R9 G& g* U  G' Q7 `" B: _) x8 d. o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, s/ e8 f9 L4 b# u1 ]; y: T" b
unsigned int count_copy = 0;
+ V$ r4 D9 M) M( o
7 B; ~! V6 F& D, t' S# V* b* F# e! x% w6 Q/ m
int main()
) _5 W1 \+ o* I{
7 N3 o7 V" }, n! A7 [+ d) h8 ?: r        pRX_MSG_PROTOCOL pshreRAM = NULL;. ~- X8 |/ t- o5 P5 D3 h% Z$ E+ K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ G/ \6 }, t1 d
$ W+ {# E5 l: W- B6 F" f4 q
        while(1)$ ^* t9 ]+ H" ~4 f, W: y' q
        {6 k& N0 H7 ]- _. v( i! [% U3 j
                read_MSG_buffer(pshreRAM);
& |8 u1 q+ S0 T4 f! |/ V        }                ; x" D8 A& S: a: R5 v5 R/ O4 K6 ~
}1 H5 p' `+ o/ U& E. t

- X6 z0 r: N- ~& B8 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
7 d* `* l3 O4 E) H- Z1 O{4 W8 g( `% }4 J! C7 O/ l# r6 M
        RX_MSG_PROTOCOL buf;2 F+ Z% h! D! }) }* s) `
        
. _2 H3 \! O* k1 F4 C) t% J% c        buf.a = pshreRAM->a;+ [8 y$ |6 S8 y  }5 _- |+ S) V
        buf.b = pshreRAM->b;
9 z$ R2 I" J; c1 v, x$ m0 [4 J        buf.packet_cout = pshreRAM->packet_cout;
; R7 R( i) {, U( f0 B4 M        
) D. L$ W' R8 l% M' e1 Y        if(buf.packet_cout != count_copy)7 T$ F# {+ l0 v( M, A  P
        {
1 T9 \8 |( x, Z* N& b8 o% Q4 M                printf("a is %d\n", buf.a);! j" j/ y( l- M2 H9 E8 U: h% w. h2 `
                printf("b is %d\n", buf.b);* k, d# I+ N' ~6 D
                printf("count is %d\n", buf.packet_cout);0 D8 I7 @# l8 l. f) c% A* t4 _
                count_copy = buf.packet_cout;* v) a& H1 {2 L5 z( ?" f( o- @
        }5 ~5 b* Y" O1 K  n  ~- ^
        else
1 e+ K+ ~5 k% V1 u$ P: ]% R. ~        {: l9 t( D' M, Y! H/ @5 B+ R
                printf("No effective message!");
) H# @9 ~7 I; P1 u8 a        }8 Z3 }# n! i  L0 y5 j! t! O( k* N" p( ]
}
% T+ a6 h6 s# M$ E9 d  v6 i  `) {% E

9 s9 \7 j  ^) H2 \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 p  D" T. Z# m+ _& k
使用下面代码,对内存使用了mmap函数后:
; ?4 ~8 U4 i8 L! o) J& X#include <stdio.h>
/ V, p+ }3 F3 s9 _% h7 Q" i#include <unistd.h>
" ^7 e" _4 e! \7 I2 o2 i& d7 [! p#include <sys/mman.h>
$ `6 |( T" f4 g: T8 M" ?#include <sys/types.h>
# \, t0 @6 h) |- e5 H#include <fcntl.h>
. }2 `( o' Q* ?+ }2 j# G$ @3 J) Q. b: g# m. w$ g# o( ?# i
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 p4 O8 ]5 m0 D( K0 {
#define SHAER_RAM_SIZE         (0x20000)   
1 R: Z4 x, T$ Q* D  F" |
  }/ W+ ?. W. w: k) d% P; |typedef struct
$ [2 n4 y6 O% n, j+ \; J. E/ o9 X: {{
7 D, w( G4 P6 t% d9 f% K1 L0 H8 D        unsigned int a;
$ Q% w' n/ {7 [        unsigned int b;% ~2 t1 Z$ X- u5 a
        unsigned int packet_cout;, {0 v/ j: n9 p7 c/ ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ^: p$ y5 m# c  d; R. L9 p3 {9 W9 G; Z9 N) F9 P5 n$ |- e
void read_MSG_buffer(int *baseaddr);5 m4 i$ m; d7 Y3 C0 u
unsigned int count_copy = 0;1 ~" p" c+ y$ w# ?1 L: i2 z

+ _& B  E% r, h  @int main()
8 x) v' o: P! u5 S! X9 y6 x{+ t, u  W7 s  ^' e6 d
        int fd;1 B4 F4 ]+ P+ \
        int *mem = NULL;
$ G: j7 f+ k! v3 f* i9 |. c! p0 s8 Q/ @+ v
        if((fd = open("/dev/mem", O_RDWR)) <0)
. U$ ^3 ?' X; {- r9 Q        {, k8 C) D1 ^% m3 L$ H( `* l2 @, [5 S8 n
                perror("open error");
1 z% R) C/ }. \, y, f7 o  }2 m                return -1;
$ a/ C* U* r5 {# F/ ^        }' h* I; ?9 X9 M% _. ]* |* J1 s" F7 }
        
# L; j) B2 H/ m  I: a        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 C8 D1 D. P+ d  A  A1 H
2 l" x5 ~& k. ~! y* q
        while(1); h! c4 n9 V: m0 l/ \/ P
        {7 h  d  x+ }* ?2 k- X) C& s) e) A
                read_MSG_buffer(mem);
) m$ b8 E: g1 ?$ c9 p        }                % |  N' i- ^2 o5 I3 P4 `
}
% O7 Y) |4 Z  \; R; f2 V" F/ m
- T! S) [: B- ~& V, d, [void read_MSG_buffer(int *baseaddr)
/ V* _# G8 p% T) i4 g: F4 R% E8 q{' M4 ?+ i# p( M. L* y7 f! C
        pRX_MSG_PROTOCOL pshreRAM = NULL;* [5 i  J; h, B9 S1 A( X

6 r* S' \7 G- S0 @" v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& I3 R( W2 ?, r9 b! c$ A# o
. r1 E. O: {, N6 k
        if(pshreRAM->packet_cout != count_copy)
0 z: y% p: U0 I! v: Q5 E        {, Y) o5 d, [& e1 N5 h  e
                printf("a is %d\n", pshreRAM->a);9 E( u; p1 ~! ?- t8 k
                printf("b is %d\n", pshreRAM->b);
5 u0 O3 o5 }: [' l( g! a                printf("count is %d\n", pshreRAM->packet_cout);
* p4 ?" y& b6 s' T                count_copy = pshreRAM->packet_cout;
8 {% ]  C6 S% k- y        }1 G, p2 T+ `; c2 n( B
        else
8 h% b# w' Q+ @/ p# f        {7 y0 j7 E1 v* j# {0 [( d$ w
                printf("No effective message!\n");; a" B; j3 G$ g
        }. g$ t' }" f5 R% K
}
, s4 {8 `" H. n! I
6 m9 o, b: b( l0 L1 ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" f1 n2 M# V, D% C* o/ m* F% _$ G- E3 Z* e6 B; N8 z

  x5 M9 r, s9 f
; ~- T5 r! m8 x  ~( X6 n0 r0 K, i' s1 |5 ?# j' N





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