嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * k( H! i$ s- o3 `$ p2 T. x

! u* u' T5 {& G; wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 N. D+ f% k+ K# p' `: d
#include <unistd.h>
, X" H; C3 n( i4 C  u- i4 E- j#include <sys/mman.h>
; x' p' i2 u/ h0 ~0 ], F3 `#include <sys/types.h>
! s7 d& Y$ V* F0 t4 u#include <fcntl.h>. l/ M6 V/ \4 q& k

3 n& [/ @) r) w$ |" Y. k#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 @$ o+ w3 H/ D: _. X0 [

2 G6 ?+ y, A( y5 @7 e/ Rtypedef struct
5 F/ C- A1 k! e{
, K7 u' V5 Z+ @) d2 G/ a% j        unsigned int a;+ r$ \$ D* [$ f$ n
        unsigned int b;3 B3 H* a) Z% F& C7 F
        unsigned int packet_cout;
; ?( ?9 {: q* v4 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 g: a1 ?+ m4 y7 Q  j# y% C4 V  M! w2 a' @0 X3 l# }0 E" M+ x' [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 C; x0 v2 ]0 s
unsigned int count_copy = 0;! y# s# o# U( P7 R

+ c% J5 ^& E7 N
$ k8 H4 g% F: cint main()
" ~3 T: C# u- q) R& F. Z{" E3 Y6 L7 X# h! ~9 o
        pRX_MSG_PROTOCOL pshreRAM = NULL;, q! Y' P8 B3 V" \
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% O: \, [% I  I' j0 F2 L9 d0 g
1 i! h9 s0 W5 |        while(1)( I$ D; l* T0 H$ Z) u- G
        {
, p& I( j# F' l                read_MSG_buffer(pshreRAM);; f7 B8 i0 T( @5 L
        }                " s9 C4 H1 [7 A4 W) \" E  o$ o
}
/ u5 E& L) Y9 h; d, {. z
7 ?9 g2 e! M3 D$ N( P. qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% z1 d7 O/ @7 y! i( l$ Q
{
  h7 j/ F* q8 g6 V6 _+ K        RX_MSG_PROTOCOL buf;
- M3 T2 A0 s$ {/ O. g4 O' m        
  B( @  A; }% f. h6 s4 a        buf.a = pshreRAM->a;) n8 e% A# ~$ y  f1 C( G
        buf.b = pshreRAM->b;
, r9 R3 ^/ c- e* z        buf.packet_cout = pshreRAM->packet_cout;
+ B4 Z0 N; t# U' N7 Y7 K" {        
  G+ L9 T+ T" z        if(buf.packet_cout != count_copy); I% d2 l0 r. g8 K$ u
        {
) j& q6 c- p" S+ m                printf("a is %d\n", buf.a);. u# c+ F+ g# w5 p& X/ a
                printf("b is %d\n", buf.b);
- l( U8 j4 `  P6 J# g2 N# }                printf("count is %d\n", buf.packet_cout);
4 v) L4 u/ @3 G+ S                count_copy = buf.packet_cout;6 w# d# T/ _  o& o
        }
7 ^5 Q. k6 g  A! }0 d        else
; x0 x' C5 f6 s: G8 O# }; |        {
. @& r1 w7 k  X7 u/ C5 K                printf("No effective message!");
" i$ m* F; l$ L8 x2 ?) o        }
; y- D3 y! m* q; R}9 P# N- ]) V* @; B" J# E
% Q" t- ^5 H2 \& N) m' X

+ y4 j" a* B" S0 D( j% V但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' {' y% N9 M( f& j7 Y2 X( C
使用下面代码,对内存使用了mmap函数后:, T- U; w' M) u1 T: N" j2 j2 r
#include <stdio.h>
3 }5 m% a9 _9 w+ s( t; B) N#include <unistd.h>" h6 J. _9 M& u+ g# Y0 i0 Z
#include <sys/mman.h>" [/ j1 S+ k2 w
#include <sys/types.h>8 U0 U* T( Q: v
#include <fcntl.h>
5 w$ p* L1 @* o" z- W, q- q" P" |
  j! A/ s( W6 Z1 M#define SHAER_RAM_BASE_ADDR    (0x80000000)
! D0 j2 B, ?. B. v#define SHAER_RAM_SIZE         (0x20000)   ( n3 L4 D- M! ~5 A" s

8 y# ?( Y! l3 j4 n( E) htypedef struct
' d! m# E; q% x7 P{
* x( k/ z0 w6 m        unsigned int a;( n' x7 k7 }* ]9 b9 f
        unsigned int b;, O) O) V' P$ F  k; z+ x
        unsigned int packet_cout;5 }2 C; D- o! [" ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 }9 M2 C, x! {- ~% C
9 o) t9 {1 h) C- U1 Gvoid read_MSG_buffer(int *baseaddr);, u# }! I: ?# @
unsigned int count_copy = 0;
; D! R  j6 R; s/ a$ S6 F( l+ {, }
int main()/ A2 _) h0 K* q3 N
{2 w" B. G! @6 p+ I: r+ V& ~
        int fd;
; d# \; `. }/ ?0 K7 c5 [) O        int *mem = NULL;' T2 Q8 \- R8 X6 E5 r( c: ]

$ H3 t2 Y4 k- A9 l" x0 c. i        if((fd = open("/dev/mem", O_RDWR)) <0)
- S' i7 X2 U* I5 q        {  M1 f% [+ w: X
                perror("open error");2 |8 W. x; N: P8 @& ^- f
                return -1;
) n9 F- c$ `3 ]  n. F% @) E" H        }
# }' f" D0 g, }) ~$ [# T        / k) C: s0 o) i4 W% `4 N6 j  O4 w
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, V# X7 y* g+ y  H, @4 W- X  ?( @1 A7 ^+ p' \% k" M/ D
        while(1)$ ^* ~4 F: ]$ |' P, C+ l& ~
        {) |/ ^( v: D+ x+ `; o& [
                read_MSG_buffer(mem);
7 n/ g2 }% l% g- C        }                & _& V! U: v: L2 h: @5 h
}0 A( |& \5 z( l, x, g+ Z0 i

% _9 K* n3 J# z. @, Xvoid read_MSG_buffer(int *baseaddr)
- J1 b" T( x8 {3 V' L' O# l5 X+ G{
7 c9 ?* M7 }8 v        pRX_MSG_PROTOCOL pshreRAM = NULL;
# D! n  I! r# z& n+ E
% d; n  n" j5 V: P+ j& x        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( i; j' s6 s$ n; n4 V$ M2 O; t' `  s5 \4 }* q
        if(pshreRAM->packet_cout != count_copy)* C/ ?; @' H' @' G: F
        {
, q/ q8 h0 }2 T! Q                printf("a is %d\n", pshreRAM->a);3 x0 d2 P2 U9 q
                printf("b is %d\n", pshreRAM->b);; x8 w2 ^0 ~2 Y% t* N0 p& p
                printf("count is %d\n", pshreRAM->packet_cout);
& X% I" p  z; T% A# i                count_copy = pshreRAM->packet_cout;( q& a! j2 B( a8 l4 D( U5 ]4 X
        }
+ v) v& N7 `, ~4 a* ^# s        else6 }# t9 j+ o, Q! G) o4 N
        {) h. H7 C  J% A5 h7 H
                printf("No effective message!\n");
- ]1 Q: ]- ]) T7 J! \        }
: V( X4 Q; b$ Y* |1 O5 f7 r4 a}
0 ]7 K% D5 O+ [
  G# \2 w% c; M; o: a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 q3 R' G+ D/ p3 ^& X& F0 Q0 M0 y2 A% C/ P4 C' _
/ g3 [9 V0 q6 A4 P+ ]

0 e% M# e6 [1 x% d; \5 O) v! L  I) S





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