嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : Z- B1 E( g$ ^8 ?  M$ W" g6 J- A( j+ G

) m8 R' [# O2 ?( ~% eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% {% |* M( [" P8 d/ V# }#include <unistd.h>. Y& ?2 j5 X! Z1 ], A6 d! ^
#include <sys/mman.h>7 s  x* D! v0 |
#include <sys/types.h>$ D* V1 u0 \) o8 _, n0 N
#include <fcntl.h>  N2 N6 R9 J3 b7 e: w3 D5 k1 X
/ {# A6 l7 E" f; I/ {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; A) E- i# ]' c4 o6 b. _5 R
5 J9 [" D' J  y5 K4 C1 J
typedef struct0 X. J  T( H* ?. G  G9 b
{
4 j1 _( i  S; G; t        unsigned int a;
* j6 E" L6 F! H" s, ]/ Z! }        unsigned int b;6 }9 f" s* m6 H$ Q
        unsigned int packet_cout;
5 O  N( f1 {  X% R% \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 e- y) k6 S( e7 J8 Z

; T! p' U4 Z5 [' ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% B: Z5 M7 F. Y) M6 ounsigned int count_copy = 0;
$ G1 P) H; Q4 g# {' a# [  Q5 ?  e5 x# r1 ?& d, y

4 R0 V- S% Y; Y0 u6 x& Vint main()
$ n0 x4 ]0 A) N$ J3 @{+ z6 {) ]8 d- t$ {8 u4 V* v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 `6 q$ L5 X9 e$ v  m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m" @# V$ Q: d4 r. V/ K( j) ~0 n) a8 o! M3 Z' g
        while(1)
/ F2 h9 @3 Q2 m        {
5 b+ P7 Y6 Q; B$ n" m7 V                read_MSG_buffer(pshreRAM);" ^9 T3 S' G2 w2 t5 z1 m1 L& x, Q2 K$ o
        }               
9 ]( ^9 u8 f5 x7 L7 h7 A}0 V1 W  B# k/ \( V" l9 @

8 @3 [1 L& r+ h7 U, Q5 Z6 j$ P: |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 y  D; H% P$ S5 A/ ?  x{4 H6 ^/ q! |7 m5 ~6 z" a$ {3 O
        RX_MSG_PROTOCOL buf;9 b8 x/ v6 n7 X& D2 i
        # @' @9 n# t+ |; z, l
        buf.a = pshreRAM->a;
0 L# I! O, _  o$ v; a& M+ E/ |* X        buf.b = pshreRAM->b;
" H" T& ^# e+ X% d7 u( c& Z        buf.packet_cout = pshreRAM->packet_cout;
4 d6 g. d3 Y' `6 r( X        * H/ e0 y: a6 P- T9 h% \% d
        if(buf.packet_cout != count_copy)
2 ?* A2 Z; j8 Y# @3 ^        {
4 @9 R2 C+ y. o3 R$ Q                printf("a is %d\n", buf.a);
: k" ^  `/ ?- s. S' N( `                printf("b is %d\n", buf.b);; Q! T2 k* b1 \8 G( C
                printf("count is %d\n", buf.packet_cout);
  U( c  s* S( v' M                count_copy = buf.packet_cout;0 r% k1 h, d5 t6 }
        }
% r  z% R7 a& {  r! w6 H- g; F+ |; j' z        else3 @, i/ c- U& J
        {
3 m% [7 m* t- J" |* ]8 R                printf("No effective message!");$ x/ `# K: F( P! ?1 P. t
        }7 H8 M+ _3 v6 |; W0 l
}3 q# l. \7 V2 @
: G' y5 \$ g; k. p0 h& h# a
$ g3 Z0 w; }4 ~8 d+ Q8 A5 O3 s% o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- r( T' G% ^8 P- }8 O, x使用下面代码,对内存使用了mmap函数后:
0 A. _/ `9 H4 W0 W2 a0 @#include <stdio.h>
- U6 s0 g3 |4 A#include <unistd.h>& M, k4 T3 h3 Q! `& b9 F0 ^
#include <sys/mman.h>
$ d" W# P1 S; R) A& i  K- F( M#include <sys/types.h>
: p" U+ d) L( k* [#include <fcntl.h>( O  N3 U$ m& S$ n5 ~( ?5 U

' E( L& V+ d" _' n& y#define SHAER_RAM_BASE_ADDR    (0x80000000)
* b7 E0 A! x# v% M# H#define SHAER_RAM_SIZE         (0x20000)   
5 {6 c1 j8 ^) P* @* k$ b. ]/ q) y2 A1 Y
typedef struct
, S+ Z" D+ S* w! _{
8 [, }8 z% @/ F7 b0 i& }0 \        unsigned int a;
5 l: L( i# \' y* o7 K- @. y* c        unsigned int b;/ H* C* U( @( W+ c
        unsigned int packet_cout;
, z" C1 `9 M/ T8 S3 I# M' Y/ C3 g- v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 T8 b1 H& a( H$ P
" z  n$ v! e# G4 ]/ C
void read_MSG_buffer(int *baseaddr);
: i, Q  q$ M9 ~$ i! e9 p0 j$ k& \unsigned int count_copy = 0;
7 L' b5 F5 Q; n& c4 v+ M1 V4 Y
! a' t, w7 w$ m2 m0 O- g* E; D) \% u7 xint main()( a3 a4 w2 I7 \2 `, L
{: Z0 i) t& |0 U0 q% B% S: Q; l
        int fd;
9 }4 b* J) d; U; M        int *mem = NULL;
5 d- n# B1 }6 _; \8 x/ d! H, m" [5 O! u
7 j" m) A; F4 Z5 g& P        if((fd = open("/dev/mem", O_RDWR)) <0)
/ [7 R' h8 Z0 l% \7 K6 A. T( S$ |        {
, U3 N9 Z4 B, p                perror("open error");2 F/ ~% f" k: u6 Q- p5 e
                return -1;
) D! p, E# k; \        }. r' m, `2 H5 ?; ?/ B
        $ w- m; _$ s) z7 ~8 a7 T' V% g
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 d' k  ^7 N  \# |1 D7 L" k1 g( y
. |5 L( {* T, `; z0 i
        while(1)4 H- l- g6 L) E5 e- V  |
        {
+ C! R  M4 G5 n0 q0 q                read_MSG_buffer(mem);
7 |" q3 b5 o6 q9 A- t/ P# k8 D$ N        }               
: Q; B$ n5 `2 t; x, V" @& ]}4 y- R1 l7 v- i( @
4 ^0 Q, m/ A5 j- m
void read_MSG_buffer(int *baseaddr)* l: l2 }9 ^) q! g# W$ I1 C
{: l# Y. I% M) b- D
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 W! n, R1 _; N/ `
' }4 X4 y) B+ N, U; ~% d0 `5 B# Q" W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 @; u2 \/ p: Y% t+ T- K2 L

" x+ p1 k$ S  k; W! [        if(pshreRAM->packet_cout != count_copy)6 s7 [- d* d& E, Z% d
        {+ F% m) f, y* p  X2 d7 }
                printf("a is %d\n", pshreRAM->a);
! _" c- s; @2 G% D" [                printf("b is %d\n", pshreRAM->b);
) e1 U/ Z( S" I                printf("count is %d\n", pshreRAM->packet_cout);
( Y7 u7 ~( O( s& A; M* y                count_copy = pshreRAM->packet_cout;
& B8 @+ E; n7 w* H; y' |        }
$ F5 V' G5 P: q6 C  y+ U& _        else: i  u: ?- J5 N. J% a
        {1 _- D: s5 J0 N
                printf("No effective message!\n");
. C) c9 X4 s& s. p& H8 H, l        }3 ^1 S; j% n" C. i7 }9 L& e9 u
}. t8 L4 @- \2 x& E/ w/ F

( n* z% C9 e. @- X, B: W# S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. ^& s" ]5 a$ Z2 _* H6 o0 a2 u( e  D- j. a, m: O
( Z2 W  \, d! m9 Q1 U8 G  \
0 s: F% w% X* [
$ p& X. b' j& F. b0 P





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