嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 A* U6 }$ S, C# b& |

' p0 ~, z2 B+ }" V7 DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( S9 y1 M. i! Y! B6 ]( `#include <unistd.h>/ f6 x3 n! @2 j# L8 B4 Q# `
#include <sys/mman.h>
7 t3 O$ I' Q7 u#include <sys/types.h>; o, i  U% G# L2 [  I
#include <fcntl.h>8 ]6 Y* M( v+ d- B
' R0 n) E1 n, W1 ]: z' R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * Z$ W3 p3 J( N  }& y

6 B0 g4 J  [8 _! ptypedef struct
' Z& i. P& b5 @4 }; x2 y+ S/ G{) a! m& Z. [) }  U$ i( {6 h1 q
        unsigned int a;$ x( s5 L3 o$ ]; p2 \- g( S5 B- i3 E
        unsigned int b;3 ^! @- X# ]3 B# M/ H4 o1 j
        unsigned int packet_cout;
: |7 n$ R3 x4 x4 y( n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* n7 x: B; Q# P% G" S
' h! q1 t1 L9 p: C( H9 y7 J! `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  P: o0 M/ u0 L6 [2 h1 v" q; ]unsigned int count_copy = 0;
, i7 F0 i, a5 p, W6 I8 _' l' J/ o0 k

' v" i8 I* D. k: g" F. ]+ W2 Oint main()
% ]: L  H% z: O, x7 L( Q{
5 k; `* q$ b! F* U9 m        pRX_MSG_PROTOCOL pshreRAM = NULL;' \* [! N" p) o. o! I$ d, c0 v2 b9 R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ c- d# ]" F9 ~- n8 f4 z( P4 g6 d- k+ u' S! A
        while(1). c; C& x7 b3 n
        {- n+ V& o' Y8 a3 t. y# X) o9 k
                read_MSG_buffer(pshreRAM);
7 y: t3 F: {$ |( l3 h; @) y        }                : X4 W. J! i) ~, w3 B% C
}& M( p3 ^9 P1 P7 i! V- I0 o
* y) e& U% G( c. O& S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) K4 l0 W; F: d' s- ]{
4 Q5 c1 u  \1 x1 Q8 ~% g: L% y        RX_MSG_PROTOCOL buf;& Q0 e! D/ K* }6 |0 `5 [
        
- ~2 U2 C3 u4 N. i& h: m        buf.a = pshreRAM->a;
" X$ i+ n% ^5 b! o. n) ^1 O! R3 V. d        buf.b = pshreRAM->b;
! z# h6 D5 X* U        buf.packet_cout = pshreRAM->packet_cout;
  i- L9 E* B) z" E6 D        
5 g  Z4 Z/ c3 W3 s* b* @+ O# N* q2 @        if(buf.packet_cout != count_copy)- s" w, f8 Q& N' I, N8 I- J
        {+ @" [' U. C; }3 |+ d
                printf("a is %d\n", buf.a);
/ T# W. t3 u/ Y; v                printf("b is %d\n", buf.b);/ V6 V! t  d; _8 j+ C
                printf("count is %d\n", buf.packet_cout);
1 u/ m. J2 K# Y. X! U. J+ Z- s                count_copy = buf.packet_cout;
3 D2 h& c* ~6 U; {& F+ w- `! [        }
8 M+ b; s' ]9 l7 `  M0 G# J        else
$ g  s9 ?$ c+ }        {
5 m5 p2 P: {' h2 R5 T                printf("No effective message!");
# w! x& Q; w8 W        }
5 Z0 r, s  [1 r3 E}* ]: _8 i- `; S( ?

* s$ e+ {/ `' t& L; g* A" o3 n' ?) |+ Q, U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% R6 ?6 [9 y+ ?使用下面代码,对内存使用了mmap函数后:4 z) ~9 Y, N: H5 i8 a
#include <stdio.h>- n2 K" l# b) Q% A/ v
#include <unistd.h>% S/ L' P8 G9 A: H+ h6 A* K/ Y6 f
#include <sys/mman.h>
) q/ N7 T* F% t#include <sys/types.h>
. |8 \7 J# h2 _6 d% B5 Z/ h#include <fcntl.h>
: {, v( p) D, m0 p
& B. j4 W( x5 `" t2 b#define SHAER_RAM_BASE_ADDR    (0x80000000)7 |+ h( U4 r3 l( Z5 y; x) E/ @
#define SHAER_RAM_SIZE         (0x20000)   5 B( ]- ~' P- Y: X7 v: y1 K

) M; B' U) l! l$ P/ K6 Htypedef struct
. `: o' j2 C; ^3 P7 Z7 M2 \" N# ^) n{
3 E& e! x( S2 A: w& S/ P- S7 H        unsigned int a;/ |2 d( X1 q* z1 x7 h1 L
        unsigned int b;4 `& }8 `; q# z! M# u
        unsigned int packet_cout;
8 b  D/ Q8 k( j9 T% v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; u! u6 G4 o3 e+ p& }: C: n7 H6 {% L6 n: r' L% M1 e
void read_MSG_buffer(int *baseaddr);
5 M& c4 l4 l& G9 i) q* t) V2 U! y" Cunsigned int count_copy = 0;
9 S6 [' f7 q- o" b$ [8 V# ~
& R! x1 G/ b& x; ^! kint main()$ n% g, [6 z: Y! w6 g
{' l9 x/ g, a2 e5 b, S& s! W
        int fd;! j/ i! Q6 L( w1 U
        int *mem = NULL;
6 p/ D( ?/ D  Z7 l
4 P  q( B) H0 z: O9 {. f$ h4 d# Z        if((fd = open("/dev/mem", O_RDWR)) <0)
2 _4 d1 @2 D) n& W8 y        {
) V# N$ Z3 y  v                perror("open error");
) c3 b6 l- l, I7 s                return -1;
# p3 C' F( u- H/ n. P7 h( g        }8 I/ P5 |+ R' r* V' o
        , [0 l4 x# e+ K6 g& d3 W1 L1 T2 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! Y4 `7 U7 h+ S3 F* D3 P
7 t9 W# W5 d* q5 J( v9 ], z        while(1). |# \4 X8 e3 Y. W( T
        {
7 B6 y" U2 f, o  b( B- `                read_MSG_buffer(mem);2 W8 |- ~; j4 a& |
        }               
9 J- z8 ]' n% i5 Q# _+ K1 b}
. R5 x- a+ j) l+ x7 f
  h3 _1 `' Z$ |, L; wvoid read_MSG_buffer(int *baseaddr)
) }! a7 q# O( a: j7 ]& r8 x{! G+ y) T5 l( s
        pRX_MSG_PROTOCOL pshreRAM = NULL;' |" G$ f& m5 ?, f1 i* m; k
* ~: N7 U) k- |0 c1 |" h5 ], E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 L* D9 d% D+ I6 m5 R

- O( N: S& J5 Q, u( R$ _        if(pshreRAM->packet_cout != count_copy)
2 ~# v' I" D8 X  V5 R! R        {2 [; Z! }9 M; L
                printf("a is %d\n", pshreRAM->a);
# A) V/ H! D# N; A                printf("b is %d\n", pshreRAM->b);
+ O8 d. A: p6 G2 H) P$ o' f' \                printf("count is %d\n", pshreRAM->packet_cout);
% N6 D7 S% d( r5 X; B5 g: E! H' d                count_copy = pshreRAM->packet_cout;. ]: A1 l' G  ~- @: v
        }
; }% V7 F. W# `; T% B        else. `0 |) \8 ]9 B; \% t
        {
1 r2 a7 [+ m. x- B0 X) V" F' I                printf("No effective message!\n");
6 _  R. R& q' `. C1 p  }        }
: F) l$ c: s8 T$ Q" b8 m1 w) h}
& M  S5 j: ~0 Z/ q9 S# V3 i3 R& g1 X1 q" ]& O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, Y" d/ B' o+ i5 A: w5 V0 V. b1 {6 X
! T. G5 @; R; x0 Z' ^

6 ?* _) _( q/ b! ^8 d
. q. o3 O7 ]' P, Z, g7 r
  G7 D% j/ Z9 P




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