嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 O+ m0 J/ s& ?3 u
3 B* |5 ~3 @$ S) [) L. X& F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 U* F, E: @1 m: O6 [% H' w, V
#include <unistd.h>! V+ x) \4 b: ~& V( N
#include <sys/mman.h>
/ ?& {% I" I  j+ T# h: r#include <sys/types.h>
7 f/ u1 z; ?. W- M#include <fcntl.h>6 ]9 ?7 j  d/ v

8 f# c2 e+ [' b' M; ~#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. q6 v% @+ k; B
) r6 M: R- r1 ^3 v& s0 ]  v4 Ytypedef struct
! R6 x9 B; T. n; A8 n{/ k4 h6 R- o5 T; \" O" ^
        unsigned int a;% S4 y$ r5 A# F: E( @
        unsigned int b;
  o/ O3 N# n8 H  T# J. U        unsigned int packet_cout;
  P$ }9 @4 t8 o8 P& Y/ a9 p) }/ o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 f: ?5 w, D9 t- L( ^+ U( {! w
# K+ k" o1 W7 L; y1 w4 w! u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 }7 M; P: S& ?# F9 sunsigned int count_copy = 0;
. m' g* j2 ~$ j! h" j. j0 C, p- W$ I2 h& h* J! q0 t* Q9 H* ]' J

7 F; {! C1 ?3 Y; M  M; c/ ^int main()) J$ s2 S- c5 O! F( |- B6 z" R. u8 k
{
8 n# l, ~1 o* ]+ S  ]        pRX_MSG_PROTOCOL pshreRAM = NULL;' F# w6 A8 s  i9 `" |7 i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 p6 \' `+ O. f$ ?2 b( u/ q$ z# N# k

* u8 ]$ x* H0 \2 \8 j2 j        while(1)6 A* D) j" d; X$ f8 s" m
        {# R4 v$ p5 U4 @
                read_MSG_buffer(pshreRAM);# Z# u8 M5 a$ g
        }                . M* C: Z  s5 n- S$ R9 @7 F" F
}
& f7 n7 t/ T& W$ d
1 i% K% V; G6 e0 tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ e4 @, @5 Y% o, |9 V
{
, H2 L3 Q3 S) U2 V! K        RX_MSG_PROTOCOL buf;
6 n! e. G; a( G) b1 B        
( w% z' a+ q$ M6 b% C        buf.a = pshreRAM->a;. o6 _* ?: K0 I, T1 A. S
        buf.b = pshreRAM->b;3 d% D! f& a! Y) y2 m
        buf.packet_cout = pshreRAM->packet_cout;
& f# _+ T' W8 w$ c/ e: X$ B0 [+ H        6 l  O  r$ D$ u; A6 A
        if(buf.packet_cout != count_copy)
& l7 v3 [7 e* S' ^, ~4 h7 u        {: }% d. u* B# |
                printf("a is %d\n", buf.a);4 O' M: m2 T! e( J% e5 H% _) Q/ U
                printf("b is %d\n", buf.b);3 [  Q" `& X9 S4 {. h" o3 A
                printf("count is %d\n", buf.packet_cout);
, E1 B9 P( A9 ?( c( D( |$ T6 ~                count_copy = buf.packet_cout;
4 v) s- e- z# ~        }
1 i9 _  O. Z) D8 N4 {' L. D( J9 i        else: K) O; m; J/ k
        {
# l3 x1 [+ x7 B                printf("No effective message!");
. q+ \; P/ S3 I9 V+ s; Y: X: Y8 z        }
. ~: J  t9 V- F: p}! l1 f; Q/ @0 d6 {# b" ~

5 c4 P. a% m3 w3 h' S. H
) R3 M4 C+ C% Q' b( z7 G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  ^- B& T% q5 G8 u- T# A8 L! u4 N使用下面代码,对内存使用了mmap函数后:
5 L. G5 k" G' i$ |& H#include <stdio.h>
) g! N# g8 j6 P% o# H5 }& j# R+ ^" G#include <unistd.h>
$ M; z! A* d% W$ Z8 P% N8 U#include <sys/mman.h>
4 H) L4 e  c4 p#include <sys/types.h>
3 u* j, C& ]; N8 K7 b: G#include <fcntl.h>
( \& P8 o1 J! w% `9 [& _$ S" t2 r# Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)
( F3 u( ^. Z" |9 B#define SHAER_RAM_SIZE         (0x20000)   
5 M$ `3 k2 ~2 D; h; k2 l
) U; F0 K* @: utypedef struct! H7 d; f+ u  V9 j! b% ^% E
{2 A; ?4 S7 O8 t# l+ ]) C$ ]
        unsigned int a;
$ [* R+ }- b" P/ o) F        unsigned int b;
% c9 m/ `, e6 ~( P: }8 C        unsigned int packet_cout;8 T; k" r/ X3 d1 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! B' {# I3 @" z" n3 M" z$ x1 ~! M# g* S
# y+ Y4 Y7 M. I) H/ q8 `void read_MSG_buffer(int *baseaddr);6 [" m# [8 g  H1 V. f5 l# Q$ ~
unsigned int count_copy = 0;6 U% L- u3 v5 S( ^% C3 {

2 r: A4 v. k+ Q9 eint main()1 I; u/ F4 A4 u% j2 H
{
7 ^, Z  q* }7 J+ ~  m# N: O; |; {        int fd;( C! F4 U+ D6 @2 U/ x2 i5 H. a$ F, m
        int *mem = NULL;" t  r! K  S9 \7 M( X7 d# l. [
4 r/ X4 b" t$ g5 ]" B* }
        if((fd = open("/dev/mem", O_RDWR)) <0)9 h) d9 `" R8 z* i  c( m
        {9 r) x0 R( Q. b# [4 }
                perror("open error");
# z) Y. R9 j. X3 e6 `                return -1;
/ {  D: n$ L* d3 d* ]4 |. ~  o        }
2 D* z) ?2 a; I! b        
, N0 A/ O- {* {4 g6 v        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! I% I) _" u* |. p9 z2 o  f4 w/ c" m6 C3 o' m. a
        while(1)' U0 \5 o& z- v
        {
# S' |2 D% U3 P* L6 ]' c& ?; W                read_MSG_buffer(mem);1 I, Y" u1 Q, a; U0 _/ x
        }               
/ N- o- F0 _' Z9 E8 O1 |}6 y6 w8 G& ?' S' \$ L% q
% [) _3 d" g5 r" \7 M
void read_MSG_buffer(int *baseaddr)
: ?" v0 d- l2 k; m" ]' I8 V. T9 q{
1 \/ S2 l: k* o" x        pRX_MSG_PROTOCOL pshreRAM = NULL;
- f; S4 t) X" g% y& s/ M& [1 [
3 S8 o) p2 ~7 m4 h: O9 y' T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" ^* {/ T* \9 y! V; v9 {% S
/ c6 n5 @' E+ }% q        if(pshreRAM->packet_cout != count_copy)6 r4 m3 ?) |' K# j8 w8 i
        {9 b. M; w4 W7 e) V- L( H
                printf("a is %d\n", pshreRAM->a);
2 H- H' p8 S0 t5 Y+ v' y8 D                printf("b is %d\n", pshreRAM->b);; e) W  b2 ~/ f  R9 C# I4 V& I
                printf("count is %d\n", pshreRAM->packet_cout);: W  ~" F' v7 S! j
                count_copy = pshreRAM->packet_cout;
: _! N; r* i: h% d7 D3 |        }; s; j  }/ l* y: @: X
        else. h0 u  ]# n' q9 N' }6 |
        {- U, h0 S  k) X7 ~* W7 {1 m
                printf("No effective message!\n");+ H" a  S( M0 ~/ R9 h8 H$ _1 E6 Z
        }
2 a1 ^5 U5 |- ]1 Z# @' g}
: |$ R  f7 L6 e8 J" q0 E' |( b- }% a; _% [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 h+ |5 e0 ?6 Z! i6 e% e9 U0 `3 m, [
1 ~! M; _# Q# }9 k6 G. ?# R$ {( m
0 n0 g2 h/ o3 A, u
* n9 f1 G' }% M6 O) k8 y- ^
2 \; M6 `: {. @8 R





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