嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) h+ ]6 t4 l+ o8 r* {. m: @3 Y; e7 B% T' T# M3 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 b$ U8 Q; Y* ?0 J3 P( G
#include <unistd.h>% a: e6 C! L8 _, x) o8 @6 v
#include <sys/mman.h>
" C, C5 S8 |3 T: r5 [0 o' E4 N( c#include <sys/types.h>
$ c8 `+ ^6 X0 k9 M9 {! a- _" c#include <fcntl.h>! A- r5 p+ S, ]1 s4 y- M& a

% m7 `* w$ Z5 a  Q#define SHAER_RAM_BASE_ADDR    (0x80000000)     C# O. h8 a. Q& U

: P1 I/ r  B3 v: ]4 [0 x/ |typedef struct
# t" [5 }7 J* W$ Q{
- Q0 k6 ?( k( m! @6 n        unsigned int a;& |% C/ C: u8 Y- Q1 d# |) R9 ^8 T5 n
        unsigned int b;6 C: {( c: D- r$ z$ @
        unsigned int packet_cout;
4 L$ |0 o# o0 Z+ {3 D/ ?. D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ?3 N8 q: U: M& G
& o/ p+ u# p' G5 @, r* z3 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# y1 l7 Z5 }! V( V+ h- Aunsigned int count_copy = 0;  u- E9 N4 e: U: @$ A
0 @: L: `% b. m  l% u9 e. l

2 D" D; E) m$ Y, q0 dint main()2 P) \4 t& ?9 w% k
{
2 I0 D4 V, i" ^4 T8 j% I3 `/ u        pRX_MSG_PROTOCOL pshreRAM = NULL;
% x( {4 a6 [6 z" D( C" |        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# i* Q5 L+ r1 c7 \5 F
) O! P9 ]  V! f% E. n        while(1)6 W( `" E4 h0 k* O
        {$ G% b/ O  p6 z. I) N7 v2 m
                read_MSG_buffer(pshreRAM);& L  l  t  ?+ Q1 T0 E, A# c
        }                ( \2 s* c  q: o. f  G2 x6 O
}$ S* W; k& @* N) x5 o* R0 `' m
2 ?8 ?# h+ A$ W6 r+ i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ O" t2 H" p: F8 k2 B' z/ X{4 |  r8 _6 u5 ^  B) c
        RX_MSG_PROTOCOL buf;
6 E. o* x' ^* W" Y        
& U: D- ]0 Y0 A$ W; x  |/ N, i9 f        buf.a = pshreRAM->a;
4 H# C1 R" _0 e1 v% Y& S1 U* p        buf.b = pshreRAM->b;
; y% t" j, k, K0 s3 W0 W5 ]        buf.packet_cout = pshreRAM->packet_cout;1 p. c+ j& H& A# O. }1 r# Y
        
1 Y8 i; T( m/ ]$ `3 u2 d        if(buf.packet_cout != count_copy)
9 c. h8 ?( d7 w7 c  J        {
( P, l8 h2 P8 d% h% C+ ~. l6 W                printf("a is %d\n", buf.a);  \- M' }% D2 A  x& i2 E
                printf("b is %d\n", buf.b);
% D6 E* m1 x' V$ r1 _# A                printf("count is %d\n", buf.packet_cout);
4 ]$ S" Y& d7 D# z                count_copy = buf.packet_cout;
/ o' n  B  A/ u+ Q. \: a7 b% s: K        }" t* i; P5 d% Y  \, V5 y: v) G
        else
* U& t+ [' R6 O3 X) J" J        {  b5 v& \6 ^5 {" F! I: [
                printf("No effective message!");+ N' E/ O* S) Q5 w
        }6 C+ e2 B% T. V6 O' L9 ^: v
}" G7 O, h4 u* }3 E7 Z$ i7 |4 b

  `9 U: q! E- _6 {/ R! y. X0 {/ h" m+ G, I# y7 U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% C7 a( G* s% @3 n$ _) u; n
使用下面代码,对内存使用了mmap函数后:6 n8 e( X- A- ~: T* ?
#include <stdio.h>
8 b4 }) R+ M5 N#include <unistd.h>
# A- _) u% q6 u5 ?1 K4 r2 s#include <sys/mman.h>
8 F$ I1 r3 h2 ]! v7 f#include <sys/types.h>  h' [  {! |, l
#include <fcntl.h>
3 J$ j# }" f" ]  ~; Z. s
& h6 J9 _6 [* E8 d) M( y#define SHAER_RAM_BASE_ADDR    (0x80000000)
, m; Q' i9 }) V% v#define SHAER_RAM_SIZE         (0x20000)   
" L6 M' ?+ O) q% L2 D. \7 @
6 V% g2 p4 V3 v+ c' ?typedef struct2 [, S  V% h  n5 ]0 m  P) F
{% y8 X: `/ l' S  v9 _! n$ v8 B
        unsigned int a;
0 M0 z5 _; m& o* [) ~        unsigned int b;' e. T' M8 {0 r! I+ R( M
        unsigned int packet_cout;
3 t) G' M8 l, l, ~! H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! p/ M& i, O" Q' L

% [  n, e" D% s% w" ?$ L. Ovoid read_MSG_buffer(int *baseaddr);
! d& S0 o- w% v) [. ?2 e. Qunsigned int count_copy = 0;
& ~$ s$ x9 d8 U5 l# v9 u5 A
7 I% X) {& J! P7 \8 [7 D% Xint main()% a. `7 @$ Y& m! i* b
{; R6 n0 m; n; I% v9 C2 }. b1 |
        int fd;7 I6 L0 L: c* l
        int *mem = NULL;  A1 F6 R6 x$ j

1 f9 C9 S6 r" t1 d        if((fd = open("/dev/mem", O_RDWR)) <0)
1 u  U7 D4 K* b* b& S  `6 ~        {. o, ^: o2 X$ l5 H& k/ a
                perror("open error");
& W% w3 E1 E+ ^+ D; z  v                return -1;
& o+ r8 {$ Y9 n6 C$ C! {8 D        }7 L/ k( p! A1 T. C( C: V
        
$ x7 Y2 e: n2 X4 r- }( c0 Q9 X        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 n2 ^- s/ [- j6 I# n  B, e. F9 v
        while(1)
& n" M  \) s, ^, o" \7 P        {( {' `: U0 k% a5 A0 w& P6 G# X
                read_MSG_buffer(mem);
# [  y8 r( x( A+ h, s, C        }                5 I: ~$ ~+ O/ F. [* G
}) @% g8 C9 s8 `- O

+ C0 X. [0 b$ I2 X# R6 xvoid read_MSG_buffer(int *baseaddr)
8 z+ o5 Q1 x4 M( x: j+ Q{/ Y, O6 {" O6 I& P/ h9 A  t5 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;( W. D; t, ~& V0 `' D

0 v4 `0 [$ Z& d' P8 N( Y# |3 b        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 [$ l, G- e# Q; O& Z
! i* E8 p+ k2 Q+ m5 V        if(pshreRAM->packet_cout != count_copy)) m1 Q1 U& X( D5 q% H
        {
" z' @& W: H! O  k4 B( c0 q9 ~5 t                printf("a is %d\n", pshreRAM->a);# P6 ^2 v. `9 ]  j$ _; F
                printf("b is %d\n", pshreRAM->b);
) c8 u' _" A: {; Q7 \                printf("count is %d\n", pshreRAM->packet_cout);
7 u, f3 W# j& n2 N) v- h- e                count_copy = pshreRAM->packet_cout;/ Z& ?, {( Y0 N2 A6 E; e* \6 L" [
        }
- d5 m3 R: F7 c& n" B: N  }        else+ T) t$ j4 Y7 h# o! n; b0 z
        {" ^6 i; P  F7 N& K2 z9 V/ ]; n0 ^
                printf("No effective message!\n");" T% O( v# J% K+ O$ i
        }
. p: w. X) c$ C5 ^1 x}5 g/ @$ L" G; ^# j' E

# W. Q5 |% e. T: V4 u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) i4 ~2 q& l( p/ C! m- F% W- ?& F
6 |/ Y% H, n; M- `% U1 N; b: }
+ f% f2 |/ w; {6 I  M# C( o. o( R: k  v- O

1 Q7 ~$ x9 I. f* H7 k& P; ?0 h: }7 i




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