嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& s* p% j" o7 t! @0 L
; w) d4 K# ^+ T5 ~' rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, x1 |$ M: N6 P3 \9 ]#include <unistd.h>* n7 i/ @" `' U& O
#include <sys/mman.h>
8 `4 a3 o/ f  u% A' @7 k#include <sys/types.h>, J# t; M5 k% ^2 w( {- ]
#include <fcntl.h>
8 M9 k& h# x/ C7 h3 Q: m( M# Q  l. R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& M" C7 v- H$ \1 [7 H
+ ^$ B; t9 g# Z0 G+ jtypedef struct. w, E/ a, T0 N( g, S; N0 D
{
1 V2 C. R# N2 d- \$ x- i1 N* Y        unsigned int a;
5 }+ y2 E5 }- r  z        unsigned int b;; p% |0 u1 G2 y% q; {; s/ a
        unsigned int packet_cout;+ \7 z0 `: l2 }; D4 y5 A& u* o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 @' i  M% l2 {2 c& v5 ?, F
$ H! d0 D1 U5 r/ |: Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! h9 T4 a  f, Z3 d+ l5 X
unsigned int count_copy = 0;
9 l" x4 ^, Z5 L* z8 k/ [# y2 n' l( x7 T+ U+ d$ N/ L5 P+ \

* t* X; t. u$ I& H8 cint main()/ p' Z8 |% j( z$ k; ?
{' N- {6 m* R$ z, B9 o
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: u& o4 H5 [6 \$ `. n        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 O* H% m3 u7 K. L

( w- [+ j8 v7 C* C, H6 ~        while(1)
* e* l' l9 o  }/ S6 w/ ]! f        {, F# G" u: e, V3 K5 y: S. O
                read_MSG_buffer(pshreRAM);
) c( y1 M# s1 y% e" v& q        }                4 b7 f$ r# }* H, [/ z5 I9 I+ \
}
- ~& s+ m4 x! U  `* ]1 j
2 F( m" ~# N# e! X4 Q  V1 Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' l: C1 J0 {. F! L
{: C- h+ ~7 z; `) {" }" y* U' p
        RX_MSG_PROTOCOL buf;
% s9 T/ M2 L8 {2 e7 |        1 z- [) D8 k; S3 ]& X2 ^
        buf.a = pshreRAM->a;  B; @3 `9 Y* J
        buf.b = pshreRAM->b;5 G- P5 K3 t0 w+ N1 K
        buf.packet_cout = pshreRAM->packet_cout;
. Y( l. o0 _/ o- L        6 A- n' U6 O/ v3 D# X5 _3 {
        if(buf.packet_cout != count_copy)
* u+ ?2 ], @2 p( |3 p% P) Y) H7 q        {
, M8 j$ A( V" L. p                printf("a is %d\n", buf.a);
7 H. i& o, l/ e: y# s% I                printf("b is %d\n", buf.b);
7 K, ?8 F7 ^" c                printf("count is %d\n", buf.packet_cout);5 a: g, g( N8 g. y- Q5 }% a
                count_copy = buf.packet_cout;
4 ~& F5 r( N( c+ L# c        }: Q: N% Z( L+ B: f: K7 J8 S
        else1 V+ ]% B/ J2 F) G# t  x
        {+ T9 _3 D1 }2 e" i& @
                printf("No effective message!");
1 x; g' s) y4 |( w        }
4 U" B: n' c, k8 G1 U}5 v3 S) j3 G) ~$ m( T
: R" S" G1 a) C! N+ D3 [0 M
" `" K( I# c1 @' p. k+ A5 I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" [/ s" H& s5 l2 o  I
使用下面代码,对内存使用了mmap函数后:  K0 r: v( }: A) v  z
#include <stdio.h>0 w. X, b+ x! T- g- x! F0 e2 J
#include <unistd.h>' Q2 j% z6 q8 L
#include <sys/mman.h>6 r" A7 H8 [' D' z7 ~, [  Z% s
#include <sys/types.h>
) T7 X, o6 w- m1 d) n, ^#include <fcntl.h>
6 \' J* a; E; {  b2 {" q3 k, d2 }8 X+ d+ a. B
#define SHAER_RAM_BASE_ADDR    (0x80000000)
: `: q5 D1 p& D, f4 b( Y# N& J#define SHAER_RAM_SIZE         (0x20000)   
, t0 W! Z( w& U2 L5 V) t  u: r4 p, b3 ]$ L6 \- R( E- H
typedef struct
& g9 a; F1 J- f, E; |0 i9 ~{
; H% B+ j8 C! W3 _. F+ Q        unsigned int a;
: ?2 q$ G% A9 m! w( F# o        unsigned int b;
6 b( x* R' h- C1 r9 b. S5 W        unsigned int packet_cout;
: z3 M4 |. v+ [) K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# H$ e. ?, f6 Z7 V( P7 s

0 P  l* S7 E3 g0 vvoid read_MSG_buffer(int *baseaddr);3 Z0 J2 k1 x( |/ Y( G' j
unsigned int count_copy = 0;
- \7 B8 z  e# \( N3 |+ G, Y4 C
5 H# }5 N, `+ v8 X0 Bint main()
$ c% r/ X5 q" o9 }{
; G" I: X* S$ S1 L# K9 y$ R5 e% d        int fd;
. P1 M2 t, B" K1 F7 c% V* l        int *mem = NULL;
& {. i2 Z2 e, q. g. L/ ^' a+ L( |) W* d. B: I
        if((fd = open("/dev/mem", O_RDWR)) <0)- x% E  o* M' {, Z4 J
        {( b9 C+ L. f9 A
                perror("open error");
+ e  H: g5 m8 P/ i) A  _4 `                return -1;
/ v- L' L+ f! V% [# s( Q7 _        }' Z" @" f/ U4 b6 v7 U, {& M1 N$ o
        
& |6 J  Z1 i5 o! _9 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" Q1 G' c& \0 t" h
+ ~4 i( I& D# |) w        while(1)0 v* ]& K: O* Y4 e' U: P5 ~
        {
2 J( M8 l% _7 `                read_MSG_buffer(mem);/ R1 b' ]+ ?2 A) F3 \/ H5 E4 v
        }                , c. x& `! j, ]1 W
}
  E+ W2 r" l: \
* [+ b. i( C, p" S2 Q; Pvoid read_MSG_buffer(int *baseaddr)6 q: {3 q7 M+ G4 K# w
{+ M+ G6 k; J; ^. l" w9 Z  H, {0 X
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 c# D5 R/ }0 M6 n8 E0 l
5 o  N2 h7 A( N! o0 A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  @- x" c* k: z8 u5 I5 W

9 o7 g+ V' B/ G' p& v  F& N        if(pshreRAM->packet_cout != count_copy)
* ?) h0 `/ L2 H' G- o9 W9 l        {
  b. E0 [8 i  @4 L$ s4 \                printf("a is %d\n", pshreRAM->a);  X( p* l& h7 D& a; ~6 S  k$ u
                printf("b is %d\n", pshreRAM->b);5 Y$ B1 t' w7 @/ b  n# y) I
                printf("count is %d\n", pshreRAM->packet_cout);
- P; Y$ h4 F$ c  b3 B0 B. s) E                count_copy = pshreRAM->packet_cout;
% n3 W0 }1 ]# R2 ?6 f* \: x3 N) R        }
$ w; k( E; }: o- g        else
/ Y0 A' E8 J3 M! L        {
1 j1 J) y/ G, C% c$ K+ `                printf("No effective message!\n");6 ^, ~: P0 \7 B* {
        }2 Z# H" p1 ^+ C3 u4 [/ Z6 O
}0 Q3 R. T3 A5 _) ^/ f' I6 ]/ l. U

, I! w0 a# o4 Q1 r& y1 c没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* m+ ^$ s- y+ v# U2 W" z* w
5 e8 I! p, u, O0 C

. t( G" @& H6 M; D, d! }0 N; U
% ?3 x0 I0 G- O8 O9 W
3 ~) J4 L) n- |2 G  W4 M




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