嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * d1 p' [4 W$ {0 d% Z0 L) S! N
" U6 e6 I9 |0 M. d8 N$ v" g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; G" P( I8 [# l2 ?# b7 h8 o
#include <unistd.h>) M/ O3 R& i3 k$ e9 L
#include <sys/mman.h>
7 ?5 L* ?& k* q# |, i! V5 q5 {$ v5 A#include <sys/types.h>4 {! U* y" O" @% V. I6 l) A
#include <fcntl.h>
3 |. B( k( B/ L( A+ S9 w( X0 `( A( T: z% E! p8 f* L  ^; V' F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! d2 x$ i/ V- u2 R! j
9 v! o5 W  t& ]: g
typedef struct
8 n5 v# W, s5 i. V1 ~1 h) z{
6 o/ v% G9 J1 h2 q: @+ n        unsigned int a;" b& E. b' ]. o2 h
        unsigned int b;
! b6 r& R) S2 ~4 |        unsigned int packet_cout;
( |) ]& }8 E, X% d  c& A6 t( z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ]/ R( V& o# A- s
3 ?3 {% u/ F6 s7 ~0 z9 H* Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. k2 N! ?6 \6 h1 K: G, B; ^/ V
unsigned int count_copy = 0;* c/ I, |- t$ J% y+ x

+ s" }; F8 Y4 x" L( L1 _( c9 J6 [7 H  i9 X2 W
int main()
$ j9 d$ ~8 P; W5 N' ~, ^; ^3 j{
, W) w% G' t2 V0 H" z) h        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ S7 y9 }! x; V        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 m+ ^. u1 i0 ?% P
9 \6 R% s6 e) ^3 L1 T        while(1)
5 Q/ K9 b, R: i4 D3 d        {
( y% C. F' ~1 ?) v& K& D. W2 {                read_MSG_buffer(pshreRAM);
9 Q$ _  n9 g) n        }                % U9 U, h, s9 ]5 m1 B) r* d
}3 f! A( ^/ J- s& n0 @- K0 s6 \8 {

  @1 `0 g+ M: d: l7 i% i1 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- ?7 t; X" G! r) I! C{6 a8 T0 M6 {4 x9 Q$ [. n5 n: b
        RX_MSG_PROTOCOL buf;
& k. e: K2 K2 E  @* B1 C) i        # ~4 h' p( _& F9 X( I
        buf.a = pshreRAM->a;' i- O4 [3 v8 B6 |& L5 a) L5 @8 @
        buf.b = pshreRAM->b;- a6 w0 D+ o( Z9 ]
        buf.packet_cout = pshreRAM->packet_cout;
! P. Q3 h  W8 Z- l) j5 R. R+ t        
0 `. J$ e& d4 B- t8 {" K# I- R3 ?4 _1 W* J        if(buf.packet_cout != count_copy)
  e/ s3 C5 G! Q        {. s% G1 V! c' z/ h
                printf("a is %d\n", buf.a);
# r& m2 ]$ f9 D7 k& X6 I7 X                printf("b is %d\n", buf.b);# K3 [. f/ q, k% X- }5 X- X3 U
                printf("count is %d\n", buf.packet_cout);( E2 X4 w7 C) I0 s# F* j: D  D& I, F
                count_copy = buf.packet_cout;
6 F9 `8 K) q& k  _! @        }
& o% s* V5 _% a) S& k8 h9 ^        else
3 _0 b9 V/ V' ^9 s+ T8 @+ l        {
( }# }$ c* J* S; Y. T" T: a                printf("No effective message!");9 j6 r0 e) H9 n( R
        }. L5 C6 Z8 `# A* t8 m) z
}
. `5 k7 y' v7 g/ y, n
; O( S" w& F/ ?9 E, Y5 G) v5 L; m  Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' M( z+ _; r# r- r" B' D+ K使用下面代码,对内存使用了mmap函数后:' C$ U# m8 w/ d: a0 z
#include <stdio.h>+ V- T2 j: g+ S/ w
#include <unistd.h>! U0 @" Q* B4 m1 W
#include <sys/mman.h>+ i" B6 `2 o# J! @6 W
#include <sys/types.h>) H# ^2 e. G) e# C/ n$ a
#include <fcntl.h>
9 }8 C2 Z( C. Y& ~  T1 Y7 o# w
! u9 \9 n- u% ]3 i#define SHAER_RAM_BASE_ADDR    (0x80000000)
& P9 C) K+ e- W( q& d- g#define SHAER_RAM_SIZE         (0x20000)   
, }5 Y9 `' P; j8 R5 ~8 U$ N6 U! Z  p( m
typedef struct
4 `" o" B) q6 y1 n% S{( B: v  G( _& X+ e  Q- n
        unsigned int a;0 u8 f" ]+ I: f* ^8 ^  z, C/ P
        unsigned int b;
3 q# f9 V% y3 T' l        unsigned int packet_cout;7 Y  J, N3 p1 O2 v; @. _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 [; ?  P; g! B. r$ w) }. ?" r5 H: K
void read_MSG_buffer(int *baseaddr);. |# p2 @( n& ^9 V8 }
unsigned int count_copy = 0;
+ e  e" j% I; G+ z; W+ `$ m" f, N  \$ H3 Y
int main()+ I  B( X* N) ?& L# e# Q% \/ E* y
{& {$ B& c/ `( I, u$ g
        int fd;
: F1 [; g7 g# y) x6 {) s        int *mem = NULL;& U: K$ W- o5 G; a& _4 T" W4 A
2 o5 U+ V" @& Q
        if((fd = open("/dev/mem", O_RDWR)) <0)% ^# j6 S+ l; Y2 t2 ]0 X
        {
$ Q2 B5 e' w( u1 n" W                perror("open error");( n/ q) w# Q1 s9 |) N9 j- i
                return -1;! a6 k. Z* o+ {1 H/ P- U
        }
6 W9 G8 k3 [0 U& H+ u- X        
; ^  G! r6 C; h( {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( q: P  {6 ?! G- X! N5 D; h2 D2 ~
% l) G# _3 a7 U        while(1)
/ o( E" T( j9 H* h7 m6 `  p        {
0 b) U% d; X' k* q8 _                read_MSG_buffer(mem);6 i* O. s  o1 e0 Y5 E
        }                + M7 ?9 ?  D6 K( w1 j  [
}7 T2 {: [  |' ]' ?6 s

2 W$ v9 u$ b. o0 ]void read_MSG_buffer(int *baseaddr): T$ U) j' U: G' W; ^7 h
{4 \3 z0 E1 i+ U" b
        pRX_MSG_PROTOCOL pshreRAM = NULL;& ~5 [- S: X& i  V
; g* I+ P. b: M& o' K/ g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 s" U3 n$ c/ A3 h& p" v  D

* w( ?$ F$ j/ @( E3 C8 J        if(pshreRAM->packet_cout != count_copy): t( n# a$ v* s" W9 g
        {
, B9 J8 J9 P) J                printf("a is %d\n", pshreRAM->a);
. D, K. ^* f# c0 \0 Z( C4 M& f- K                printf("b is %d\n", pshreRAM->b);, r; [3 J7 X: P
                printf("count is %d\n", pshreRAM->packet_cout);3 E# f, |! y; h0 Q
                count_copy = pshreRAM->packet_cout;2 m$ \1 I. _# f
        }
+ f. ~) b$ s: D% V        else
2 d2 {0 W3 `3 a+ p& O/ }. }" U        {4 z9 R. J7 i. s* S: M; L* j
                printf("No effective message!\n");: X2 r+ c7 i; E" ?; x4 G
        }
7 k2 z( C* _5 K}
+ d) x. y, }' ?# p
/ P; W  e4 P$ S  G8 h# ~) u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- ~( _- p/ T$ w4 o, B: s$ D9 G

) b: ?% }9 n/ H  f) `8 \6 J/ I6 B9 q8 p
2 P/ t2 P2 U( ], l

4 J6 S) d9 C3 k3 r6 t# h" y/ T/ n# O




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