嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / l7 r6 e6 ^$ G1 h) z* |% C
( w; y2 x. g, B1 }) O2 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* |* u% R* u7 z
#include <unistd.h>" i  a7 A8 ]: W+ i" E% E9 t! s
#include <sys/mman.h>
, C8 V+ h3 @/ G1 o#include <sys/types.h>
+ I- T8 f# s! J# Z, ^0 l# }6 ~% a#include <fcntl.h>" @  S& t1 q+ e: z1 p6 w8 ]# z2 U
+ @# N. H- k$ n$ c! B& w  x
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 g! D9 W+ q; q8 t/ F/ ]

8 h. d+ J6 H& e9 {! b8 [typedef struct
) c0 {8 D) |+ N7 G$ E- X$ Z1 \4 d{4 B% R- x( n8 c* C& w) d
        unsigned int a;
# k; X  O5 V5 J        unsigned int b;' _# N! X: E( N: K" D7 w/ a
        unsigned int packet_cout;
' v! {9 o1 ]& M3 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 b8 _3 k5 `, p3 {; o/ w8 }( v1 p9 X7 i2 L0 K( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ ]  o# J7 Q# ~  V
unsigned int count_copy = 0;$ ?0 a% f0 @1 V

/ I* B# P% f( N1 Q% F4 A, _5 f0 j* H: _2 v7 ?) {! H' j% f" d
int main()
( W6 M7 [% z- I7 g4 a- j{; i0 @. m# j/ n1 Z$ w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! f3 {* }+ y1 v        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# C% B3 s5 D. Y, _, l9 n8 Y. c# E4 q0 f% Z% }
        while(1)
. ~  g1 @4 A4 d! ]! r  m        {1 ?; T6 q$ x8 M# S/ @
                read_MSG_buffer(pshreRAM);
- p  }4 f# {3 ?        }               
  }4 a& _) S; ?1 i$ Y9 P1 S3 Q}
3 b/ X; M* d1 d" b* r, i
! j: L) ~$ B! r5 _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ {# ?( D5 G( h6 U  m{
% B5 t6 z& W& l+ h  u        RX_MSG_PROTOCOL buf;
) O  n$ ^5 y+ j) ?$ i0 I        6 z3 _$ X, g- {$ {
        buf.a = pshreRAM->a;
0 W( D& m' U# o' s" e& [        buf.b = pshreRAM->b;; A: x8 X1 t3 d0 Y; |0 [
        buf.packet_cout = pshreRAM->packet_cout;( }# m  }/ R3 ~& `2 P" A1 T# r% a
        8 A. X" K* G: J! e' A  V+ b
        if(buf.packet_cout != count_copy), I8 @0 y5 r- Z' t# O- x6 H
        {& y7 j5 f+ F& X* y
                printf("a is %d\n", buf.a);- S0 q8 }" ?1 j0 a( d8 g- B- T
                printf("b is %d\n", buf.b);
! z! X5 ]" p/ \% i* E6 [+ R                printf("count is %d\n", buf.packet_cout);: ^+ l/ F. u( j: y3 h  ^
                count_copy = buf.packet_cout;' Y( m" t$ ~5 q% t6 \/ |; d
        }
- L6 }$ v( ^: N, J( r7 u) }        else
* ~5 i. q/ z$ x7 }        {  L" g9 c& [+ Y  `
                printf("No effective message!");+ S. X/ v) L- {, ~. `
        }  I3 |( @1 v, E6 o
}
( m, @/ I7 r5 `' m
+ _7 i8 c' B8 T( b. p, ]7 P  J9 L7 _4 x0 m/ ], Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% w; E3 d* ^; b3 o7 o) K
使用下面代码,对内存使用了mmap函数后:
& I8 B! D& ]/ ]& m#include <stdio.h>
, o1 b2 J2 G! Z; B#include <unistd.h>, x3 s) B  i3 c1 Q, r0 Q/ y! B5 x
#include <sys/mman.h>
) ~+ a# t- Q( c9 N  E#include <sys/types.h>5 {7 x6 n4 b. {1 @/ y; A
#include <fcntl.h>
$ f3 e8 N  L. ]$ q) D! }! \
- \1 X5 E! g" P+ [" R2 ~7 J" Q! G#define SHAER_RAM_BASE_ADDR    (0x80000000)
# f, X  b( j, B) d#define SHAER_RAM_SIZE         (0x20000)   ) ^+ |. ]( f5 S

& Z+ f6 p1 Q9 J! b" ktypedef struct; `1 x: P/ d/ R/ s0 w- Z
{
. @9 D0 v# A7 e. _" J" u        unsigned int a;! p' I  y5 R1 S2 i2 k! r
        unsigned int b;3 s' E2 P! k  h0 T/ q
        unsigned int packet_cout;. U( d' Q8 ~. L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) _. z- l" O+ r3 j" b0 F0 ~% [
, x4 n* Q7 d9 ?& l/ g8 f$ r
void read_MSG_buffer(int *baseaddr);
5 A: H7 ?  j1 S+ I- Dunsigned int count_copy = 0;0 d1 @$ I) n9 m$ B% n

( E* J$ ~: s  m' H! p$ c  B8 uint main()
% |3 U; N' E1 R# {2 d7 K{4 ^* m! P; r- L( l
        int fd;
4 \7 M# P, n/ j8 Y0 J* ~        int *mem = NULL;; o* Q: R( U% R, P. p8 h( g3 R
+ u2 r9 a7 B, i, p- B9 g8 @
        if((fd = open("/dev/mem", O_RDWR)) <0)! ^3 }. F9 n+ |' r
        {6 ]& e: a6 B9 O/ {. W
                perror("open error");) Q8 }: h/ H9 |( J  K3 Y
                return -1;! G2 C8 S. F  q2 t& f/ T
        }
8 `6 [; \/ s+ i3 [        
) X/ o0 G/ O7 V* O0 K' x, k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ b, ~* e0 A# O3 ^! a1 M) N  Q* D, l" R+ T) B
        while(1)
* h  j( i- y' i) E& C1 Z        {
! T  L" n, n9 K: A. T+ g8 K: A                read_MSG_buffer(mem);
; D3 P# m! I  n5 i) l6 x        }               
0 B2 {' m% R4 O% [$ A- y}0 O1 S& G, G  \# T/ U

& u* n9 F# m) X' T0 l2 nvoid read_MSG_buffer(int *baseaddr)
/ ]' D/ T- S- U5 }* I6 n2 |' P5 z$ k* i{8 Y7 Y3 {$ O$ D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" K, R! y9 M' t- o7 U1 z
% v. r! s1 h8 c3 a/ c1 A. L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! H, g2 [; ~8 A) u+ a
4 N8 a2 T. W0 G8 C2 ?        if(pshreRAM->packet_cout != count_copy)* W0 O$ w2 _( a8 B" x" G
        {6 Q: S2 ]& P$ v
                printf("a is %d\n", pshreRAM->a);# y# T) w( ?$ K7 D
                printf("b is %d\n", pshreRAM->b);. x  m  c6 L, e' V9 W2 N6 J1 G
                printf("count is %d\n", pshreRAM->packet_cout);# h$ B& p+ f& N6 `/ C9 M/ C
                count_copy = pshreRAM->packet_cout;: _% _4 l" `( T5 r9 C3 O
        }+ s: K- ]. s- A* F; v& s) D: ^9 }& R
        else/ p2 d% }: r9 E: o
        {
: w7 G, G0 h* G; ~( {1 T                printf("No effective message!\n");
/ _. M% K' J7 J3 X- z% H  O        }
2 ^  L0 f& ?+ e$ j' K9 B) y}# q0 [6 s0 Q% N

/ a6 d8 n) T7 M6 _) G& n6 R* J; `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. d) ~! A! h2 l$ t$ o+ p- w
5 C, x+ d$ C5 c, \& o, t
% o% m5 X  {. X  Q3 O8 p# D. Y  y% ^* {+ F
9 L9 R$ h+ X2 v$ K& I* y& i





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