嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 k  s2 k; I' G# ~; R- @/ _& t
- o/ ~# }! a2 X/ N$ wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  j& E" Z" l8 h1 `#include <unistd.h>
. O" A$ i) e, N* u: d#include <sys/mman.h>
. A6 `- m9 j: a" e#include <sys/types.h>
$ [. d6 Q' L( V#include <fcntl.h>
/ Z) _+ E8 s# C+ a$ d/ @
9 ?( y6 w3 \% z$ R( p" f" M4 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 s4 L7 L" F! A$ ^, {0 w+ b. b1 l0 g: Z" _2 u
typedef struct# D, h0 i1 j, K/ w) r" [7 N
{" Z7 @% x7 X9 {5 m' J
        unsigned int a;6 m+ d) w  \5 t% d2 c
        unsigned int b;
; b5 n/ q% }% c* U0 k  t/ P        unsigned int packet_cout;
6 T3 {6 ^" V/ f9 Y4 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 b0 @% f$ X8 C& y

' D5 U$ P# M+ ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" t; C' r* y. T+ O, K+ {unsigned int count_copy = 0;
  z- A! j9 B0 s* O6 U/ \8 Z. E7 ^; j, _; s

/ `1 O( q% t/ q$ r8 K! Bint main()) ~0 ]; N) F; ~! f! R! F
{3 o. S1 G7 Q2 b8 O6 s# X
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# H* V- }5 @/ |: a$ M: ^5 P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ s# A+ m. F! G1 m3 G

! @+ x- u7 Y. m" J        while(1)1 N* V/ K$ y9 H+ |/ ?; a( v
        {' F+ j& h& l3 @
                read_MSG_buffer(pshreRAM);8 D2 E  e' m1 p. f: j8 k
        }                3 K) l& i4 Y4 R& d* G$ J% y, {
}
1 I7 A2 C5 [) |
) N4 M7 h- r- D# Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' C4 C- B- j3 P" D  c$ L{
* t- M' }# ]" Q& `" W( T, _+ u        RX_MSG_PROTOCOL buf;% g& t* ?2 P" z, v0 Q
        
! |( K, m& i* C* e        buf.a = pshreRAM->a;
( f' p- a) u/ }$ m        buf.b = pshreRAM->b;
# C/ y  z7 }% I        buf.packet_cout = pshreRAM->packet_cout;- O% t! R  t, u& J8 y: v
        
+ @, T: R+ [5 t8 _; u5 t% H        if(buf.packet_cout != count_copy)
' S4 H( h) k+ _7 f  g        {+ s$ I/ Q' P( ~- G8 S
                printf("a is %d\n", buf.a);5 r0 H4 M" i& k3 n# }! j; z
                printf("b is %d\n", buf.b);
/ k+ U! m  _; L+ ]/ @% r$ {                printf("count is %d\n", buf.packet_cout);
# t4 B& a& i+ Z, v4 y# \1 O                count_copy = buf.packet_cout;
( \! U; v3 H7 {: M+ v6 L9 Y/ Q% I( l        }
) c0 ^% j0 W. q4 ]        else
' r8 X2 M4 @4 j! v        {
( s$ D0 w5 l8 u. i/ z( A/ @! t                printf("No effective message!");+ }4 j, t$ w/ u6 g8 b1 a  B
        }
- L4 N7 q7 t8 J$ A; ^" j}
) Z" C2 K& Q& U7 X5 a1 A% H" E
, W7 m3 [6 i/ A
5 `3 D( z7 H$ w+ X4 T/ F* K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  A7 g. P! y3 N使用下面代码,对内存使用了mmap函数后:( b' V' _9 O( Q/ f& k% D
#include <stdio.h>2 I5 A  G$ C! K  K
#include <unistd.h>  Y9 O4 ?  r- W% x$ O
#include <sys/mman.h>: }0 Z$ |( k2 O: o- r! c: t
#include <sys/types.h>5 b- E/ d/ f( |
#include <fcntl.h>* a: x1 g# c2 m

- o! c  d) h8 s' N5 ]#define SHAER_RAM_BASE_ADDR    (0x80000000)
* d& f' t9 s7 D6 C2 a! f: B2 P! l#define SHAER_RAM_SIZE         (0x20000)   
$ ]4 u- s9 K* {- l+ x$ p- |& m2 W  F9 w( x7 w' F
typedef struct
/ {( J( J1 _  ~1 U7 |5 t8 Z# l{
: _1 T6 n1 d' w) L! ?$ s" G4 `        unsigned int a;$ f  ^+ Q9 H; x, r/ m! r
        unsigned int b;
, o/ L% `6 M7 i* {9 j0 Z+ ?        unsigned int packet_cout;
% s; y0 ]0 O2 x" x; Y& H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, G9 l0 [. \" a- G9 ?3 K) ?6 t7 Y0 v9 @. J8 _
void read_MSG_buffer(int *baseaddr);
0 }% }1 U" \/ m8 K; Bunsigned int count_copy = 0;
/ h( L% K- d5 `0 P' S5 I3 @2 A/ M& I, O
int main()2 g( ?& ?; y' z% j1 R6 j8 Z3 I1 L; D
{
2 ?* p/ C  i3 G6 A        int fd;
" m( @6 O% w: h0 E        int *mem = NULL;! X$ m+ [4 n6 [0 c4 M
" q$ ^, ^- V* f* P- o2 `
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 G3 G9 H: _4 J' e- x3 W        {
7 g  |2 k0 C- X4 l/ D/ S                perror("open error");
' t: g; q6 _) q* z& |) F- a* Q                return -1;: ^3 I# d* V) P, w. t  c5 W
        }
& c# p  [- h& }) l$ J          M  T! K5 ~7 _# Y% R9 E6 |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: {' L* C9 \' t8 h
; M: z* P9 a: I4 F1 H# P* E
        while(1)
; t% w( F% X# _: H* `0 q        {# j; X( ~& e: ]. }/ s( m
                read_MSG_buffer(mem);
# {+ [* R8 {1 |( o! D5 c        }                1 \# @. R+ C( Q: V' n
}
. i4 @/ F. q2 y3 V4 O/ b0 Y3 S" r
, m' i0 H* U0 \1 A2 R6 x  t1 Ovoid read_MSG_buffer(int *baseaddr)
: ]- B% O+ _8 c: ~8 e3 K{' }# {  ?- u& e: S1 c5 P( G
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ s2 [! v9 g5 Q7 k

! E% L9 Y* C( P2 |# i6 R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ G$ t/ W( n6 j) b
: b3 Z+ M8 M+ n* _' M, N        if(pshreRAM->packet_cout != count_copy)4 A1 n2 a- L8 S7 p, u
        {: m3 c0 t7 m8 R% _
                printf("a is %d\n", pshreRAM->a);
/ b: K/ n$ b: E1 ]2 k! D$ b                printf("b is %d\n", pshreRAM->b);
2 B! r, Z+ V' f- V; l; V                printf("count is %d\n", pshreRAM->packet_cout);
$ T+ {* s- a+ E! F: i  O: B6 j                count_copy = pshreRAM->packet_cout;8 q- C. U0 G# }# ?6 L
        }  I. W" e9 G7 }& v% [
        else
" b1 l4 V& ]" }0 P! H2 t) W- v        {1 Q, y& K" b* Y2 Y) V% N
                printf("No effective message!\n");- R3 G( ]  q- H+ e7 E4 n1 W0 V
        }/ V" |& E$ j( |0 X; K1 ]1 D
}
& _% A4 i# u- H- p: O( e8 a2 I- r/ O$ m& B1 ?  B; ]2 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 y% H2 \$ T2 b2 ~! n
. a: p. j( y! s1 O
3 p8 t. u* O8 ^
( T" E% C1 s8 e8 y. K% m, ^! n( L+ D4 a
/ {, ^7 t: I+ N  S





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