嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; D( m. I; R! ^3 E8 J2 Y! m, X8 T: R' ?# I* O: [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% D  I  r8 ?7 S; M' u" \( S
#include <unistd.h>0 b8 y5 ~+ H+ J" s2 ~. s' c
#include <sys/mman.h>" r* ?9 V; c0 @
#include <sys/types.h>
' _3 I- \5 E/ }0 b, }% p# b, B* f% Z#include <fcntl.h>: n* _" |: b; h% F& f  E. e# _0 h9 ^

( ]: R2 v( w$ `" [. X/ [#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  A! T* r8 ~" w0 l: i3 w  o! I3 o% X+ l( g) s; N0 B0 S! Y
typedef struct
7 r; f- c4 F) b) J{. b. p7 R8 `. A) V
        unsigned int a;
. I  S' V" ?- t' g        unsigned int b;
  b* s+ q0 \, O2 E# _        unsigned int packet_cout;* ~7 _. U! ]$ D( g( W6 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* J$ i" F4 T' K& e: X: |2 }) U0 L6 j
, a! L% Q  G* d- [; h( g0 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 |  Q& S( |) x0 e; ^2 m9 ^unsigned int count_copy = 0;
$ M" o( Y( i5 l8 Y5 @- C' m9 u/ O2 H

% D* B/ H% M0 o$ Y$ _6 {% `. q  @7 Sint main()
* d1 |: g$ H+ K{
0 P6 V1 d+ A0 [1 H        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ j2 y& d2 h6 }' d4 W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ M& A/ S5 s  ]
4 S* k9 g4 B' p8 R+ {. i. y
        while(1): D  l4 E. H4 v+ L
        {
; {3 b8 I; ?2 @) q4 P# }                read_MSG_buffer(pshreRAM);/ s& o: B6 Q0 B
        }                ! @& m- S( b: @) }, P1 G
}
# p! s9 S! h5 ?5 `1 q! Y4 ~, D5 J/ t4 Y! x. z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- S- l. _$ _' x0 E% G{. e8 c3 U* @" w" ~
        RX_MSG_PROTOCOL buf;& k( x) N* V- ]2 U$ y
        ; l8 g" y; o9 b/ u; i
        buf.a = pshreRAM->a;
3 m7 K4 o5 u1 N        buf.b = pshreRAM->b;
4 S% k( g2 s+ g        buf.packet_cout = pshreRAM->packet_cout;
( `( [& k- @0 [! |1 H6 I4 f( G        
9 p* V8 _5 a+ k  z/ ]        if(buf.packet_cout != count_copy)
9 Y2 s2 e! ~8 {, i; J3 D        {, r  U2 o# O6 q# d7 G5 @
                printf("a is %d\n", buf.a);) \9 H5 v; n! ]5 c" p* G
                printf("b is %d\n", buf.b);- i1 I( w( I' o! T: B9 [$ ?
                printf("count is %d\n", buf.packet_cout);
" S2 _+ B, ^: A6 Q- k% x                count_copy = buf.packet_cout;- I6 o! L$ Q" U6 w
        }
% `1 k( o" b" c& u# e( i        else; g0 g8 S5 X/ p* ]
        {
8 K# Y: w1 _( ~' `, G6 F! N' J- r* B) i                printf("No effective message!");
# }; T  e" T1 C2 r, v8 M0 _- L        }6 Z5 E+ `6 M7 o/ o2 w3 @
}
9 H! i$ \, R- D2 u% J0 ?! [- `) `' T5 \, ?
9 K6 H; o" V1 `5 Q6 j  \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 O' ^% l5 t; |# T7 B7 V
使用下面代码,对内存使用了mmap函数后:# {/ _* b- X& X  H: a
#include <stdio.h>
& r+ T1 u3 M" I. I, X2 m#include <unistd.h>4 G! x# t& n- u6 o7 p  L9 q
#include <sys/mman.h>: P& ~9 Z; F2 a1 o* R1 L
#include <sys/types.h>
1 z' ^; x1 u7 v! y$ f4 K1 ^#include <fcntl.h>
; k) |' H$ O: L3 a. h8 t) s" A: x* k
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 h( I$ T- `- Z3 e
#define SHAER_RAM_SIZE         (0x20000)   
6 {1 r5 E- ]  t, G% Y+ h6 r1 T7 t2 I. ~4 Y5 W3 k
typedef struct: j0 Z6 O' R1 \/ T( q
{
& Z* d7 U/ x# s- Y        unsigned int a;: ?: }& F0 }; ]9 A" A
        unsigned int b;3 H. ?) T- p' e
        unsigned int packet_cout;: J! [2 U" ~' A: r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 ]6 B) C2 v% H& @% N
; c9 L- k, ]& @7 T
void read_MSG_buffer(int *baseaddr);; D" g' [" h- E* v0 v2 ?% j
unsigned int count_copy = 0;. Q2 w8 R6 ~! \1 l$ `2 m) I" S9 d

/ k5 Y' n! v' j( Kint main()
# m( W$ Z1 ]7 v' Q7 V2 B8 G{
0 n9 q8 P1 \" P% S/ Q$ w0 z" \; j        int fd;
! m& M* Y4 F0 ]+ u9 G5 p        int *mem = NULL;2 d+ K! m9 C4 h

- z: r) X, P" G) H) o# W, m        if((fd = open("/dev/mem", O_RDWR)) <0)8 R& s6 q# {$ r# }4 {; p
        {
! h( k  A4 U# G$ x* i                perror("open error");
& s* A# J# j3 a% C                return -1;6 i6 \# \8 J% G  h
        }; g+ q% O8 |- O3 B6 b9 R2 \, l
        9 |& z- k1 R, A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& \8 b: L  K* E/ @7 b, S+ s
1 Y( s. u* w* e  \  ]        while(1)
1 }  S0 Q) C) v! c  I        {
, w1 k6 O: p1 K9 P0 a, {) w                read_MSG_buffer(mem);
2 R5 t4 m( q8 U, S9 X        }               
) q9 v" A" i4 O9 N# \6 b}. i* g, V8 q& d' r" I$ T
* P6 `4 K4 X) q/ u. H! s
void read_MSG_buffer(int *baseaddr)1 d/ g' s( O- d
{
, H! Z0 S/ H% g        pRX_MSG_PROTOCOL pshreRAM = NULL;
. r3 J) Z4 f' s! [% [( ^% d1 n9 X3 v( Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" x% F9 P% }5 L; P% X  L0 M; y# J4 t9 o" j8 q, I
        if(pshreRAM->packet_cout != count_copy)4 D, p, v1 b8 E3 `3 s- \
        {
( ]0 f- W& r1 s8 }1 z6 j% O                printf("a is %d\n", pshreRAM->a);
( c  u: w+ s& m; h* m                printf("b is %d\n", pshreRAM->b);: J9 l( d, l7 h5 t
                printf("count is %d\n", pshreRAM->packet_cout);$ u, ]% ?% v4 s
                count_copy = pshreRAM->packet_cout;
4 X; W# R( h( d1 E; z7 G! h& y        }
6 ~9 P3 W" O3 ?. G        else
1 t. m0 c9 ?5 a* |5 D' h  D. F        {
* }  g' Z' C/ n/ ]9 F. E                printf("No effective message!\n");) D; K6 Y9 c1 x$ K
        }3 m9 j1 O; x6 R6 g4 Y  _9 ~
}& a- C' _: v* W/ W

6 ]. W3 O3 Z/ ~6 @/ b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 C$ W! B$ j# S) p

2 i3 T9 W/ x3 M9 V5 o
+ r- A! D5 Z, l) T% N9 i7 q. P: i4 S8 x$ M* y

* T5 \/ u9 Y4 |1 O; x




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