嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 _2 s; z4 n& K% R( t0 h: P! a
5 l* k5 S- c0 X! }+ n5 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ b( V1 e4 [+ W+ q  A! O1 ^( M+ o
#include <unistd.h>1 V5 j: |* j" [6 Y
#include <sys/mman.h>
7 d; f. }; [4 k6 J; T* |* \  @#include <sys/types.h>  C5 P/ B7 a+ w* a- X. k
#include <fcntl.h>
% o3 H7 R& n: s8 N4 D" f( c- Y! p8 z1 W( A5 q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 d  g  w$ D1 U! ]) C2 X( N& t" U; o, R; k5 T. H3 t7 B3 v' P
typedef struct
& J8 G% S; X& I, z* S% @3 n{9 W3 n2 x9 u6 T( ~$ T) Q9 f
        unsigned int a;8 t+ j* X( t$ O
        unsigned int b;
& R+ Y3 {5 O7 C& C. R3 ^% t        unsigned int packet_cout;1 `4 i6 a( b8 B/ l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# q" o+ N7 L" i% M* Q. U" p
  u3 t: q+ ]; n3 _( z  u8 ^! W6 T4 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 {6 m; I8 m! x' a9 a; Lunsigned int count_copy = 0;
/ z# B) H$ D" _% f. g3 K7 M$ u# V- Z, k5 y2 y

8 k$ r/ ?0 C/ @" d, U: G" Sint main(): G5 o) V& `# V9 V" G2 `
{
% Z# ?1 G7 a. Q8 i0 M' N2 ^9 ?9 q        pRX_MSG_PROTOCOL pshreRAM = NULL;8 m3 ]; I# p1 v4 y5 d3 y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  N3 l' k. p5 v% s! v9 s6 i" g7 a4 C
        while(1)
" _+ t2 U  V% L+ u2 @  {( x        {
" L& G. {0 L3 o0 l& `  k4 P2 N                read_MSG_buffer(pshreRAM);
& u  J3 `1 ]0 I- n+ i) s' |        }               
+ s5 V+ B* D" o1 ~( ]}
, z: M9 `7 A1 v: O
- p, J/ k7 d* C( a- V3 s, Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 [7 L) t/ ~  F% i; O7 ?% S  M. E, y
{
6 j5 T; X$ B" Z  [7 P2 r* Y$ u' A5 i' ^6 n        RX_MSG_PROTOCOL buf;# K! K) e, l1 W6 Q: W/ |
        
3 C, `* u0 N/ Z( P  ~1 e% l        buf.a = pshreRAM->a;
3 e# U) O1 n4 B. Y5 \/ M        buf.b = pshreRAM->b;+ i6 R( E3 J: K$ c9 U' K2 ?4 a
        buf.packet_cout = pshreRAM->packet_cout;) L: I& q7 K- l0 Z" \4 D
        + a. l7 c5 I' Q! R; L
        if(buf.packet_cout != count_copy), x' L/ _+ }& F
        {
! i) f4 n8 [% n3 K                printf("a is %d\n", buf.a);
) J7 Q: Z  k/ u  Z, b8 A# G2 X$ S- @                printf("b is %d\n", buf.b);
- \+ I$ F2 m, Q- J1 h* }; s                printf("count is %d\n", buf.packet_cout);
1 Q3 n; \2 o: N                count_copy = buf.packet_cout;
1 _/ |8 D8 L& v        }
, A# l" h7 t8 G: H# Z1 |- s; g( m+ q        else( Q8 m8 `: o% i7 Z% g
        {3 f" A6 S8 k  l3 V4 q
                printf("No effective message!");3 p* H& [8 u6 o$ o* j
        }
2 }3 `7 R2 d" k+ z# a( p  [}
+ j. w9 R5 v- |/ U7 |  E/ C/ |/ G; Z( q. H+ v

9 y. ?* l. @: B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 k) I% w: A' g! l5 _使用下面代码,对内存使用了mmap函数后:4 k$ I8 g3 d' g% }# H2 U- ]0 S
#include <stdio.h>9 [! J. ^! V0 o2 F
#include <unistd.h>. G  {& \! q% [" Z& P+ q7 A
#include <sys/mman.h>
, b6 X7 b9 m" L/ Q#include <sys/types.h>; m( [' A. b2 `7 V8 h
#include <fcntl.h>
/ M7 i4 y- z" U/ f7 ~4 V
/ E3 b$ w+ c0 k+ y+ w' [#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 M) ?9 j. ^" h/ j! x#define SHAER_RAM_SIZE         (0x20000)   
7 _2 c, K/ F! D) a2 H0 L
! L8 {3 H- B* atypedef struct/ c' z' k# I- Q$ E: a8 K
{
$ ~/ Z, x% T$ f% E& \+ m# k7 _2 E1 d        unsigned int a;
  H% m( U9 M8 r% |0 X  O; |        unsigned int b;, R1 E& [' i0 d/ Y
        unsigned int packet_cout;- O) j6 r; u8 y9 x; _; S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- x) @  i( _, L
; N5 Y* C4 I: r! i& U0 {" Uvoid read_MSG_buffer(int *baseaddr);
. R4 \9 z/ o" b1 U3 a( z# ?! c/ G0 lunsigned int count_copy = 0;5 p- u9 U# Z) V! O& |- r

3 q0 b! y/ _: t; S& Sint main()0 _+ r7 G1 W4 s* W) Y' X
{* u; {. Z# n; {3 j) L0 l
        int fd;
% [. J/ p& B% ]: P7 o        int *mem = NULL;
. d5 Y; s. q- D' r& N
+ F3 ?) a, E8 s: X! _, w        if((fd = open("/dev/mem", O_RDWR)) <0)
# s5 u7 _% M  l+ U& O2 O6 D        {
- ~, x4 C$ ^( r  L                perror("open error");
% @8 ?0 d1 k6 w- D$ c' U, \                return -1;
% X9 @- a; b; x4 q8 o" T- f& ?        }9 j% g+ U. y9 J. }
        
8 L' G* \6 w$ O9 Z9 C; T5 x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 _& c1 H1 b  F; A% M% Y+ C% z8 y+ }, \1 R1 l9 S
        while(1)1 E* `/ H- c, g! I
        {1 D/ O/ n. A; x. I+ I1 U% a& d
                read_MSG_buffer(mem);
) [: n8 H+ P' j. E1 W        }               
& t/ S) D: z& z9 q$ \7 c}( M' `# K& z8 P; o! P6 Y* |

- C8 y# z* @- W$ J9 H) e- cvoid read_MSG_buffer(int *baseaddr)
  j2 R+ X0 B" `! p+ r0 o0 b3 _! U" _{/ |) ?+ {! \+ u/ w1 J) L* ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% q( S8 H/ K; ?. n- ^% t
* i' e* a5 Z; D        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" [7 p/ B: ^, I+ g3 m8 V9 @

6 i# M9 }* h6 x: p* Q7 a        if(pshreRAM->packet_cout != count_copy)
6 k/ V  q( P2 l0 G  h) a! j8 @        {
- Q- E% Y" _  G8 q! ]! j, o6 r7 o                printf("a is %d\n", pshreRAM->a);6 `2 x% Z9 a7 J6 F. c
                printf("b is %d\n", pshreRAM->b);) A- `+ P6 L% @9 q% h# u2 O
                printf("count is %d\n", pshreRAM->packet_cout);
1 N9 x+ w  c9 N8 y- p& Y                count_copy = pshreRAM->packet_cout;
: O6 L! @$ ]: M* F* i0 q* u  _        }' o1 }- D2 `; |' y
        else
; b* V. a7 Q/ u  d  u/ r3 `; R        {: k5 v; _6 w5 H
                printf("No effective message!\n");9 E' H# a9 u$ a: J; s
        }5 `0 _4 R6 m7 |7 Y3 z# S. S/ @* m
}, C( O8 O& S$ t9 J' O# v+ D

) _; J3 s  k* i* O1 c9 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ k6 |* \- ~; `4 c9 j
, `+ X( E7 J: f) j
/ [, N/ [8 _1 t/ r

, D2 ^  v5 Y4 r4 b4 D; h* K* v% }9 ]! E





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