嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 n" l/ @2 F! Q; J& U% I
. j* j9 M: Y2 C: q( b( D: i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 m3 z3 y/ R; s( K, B
#include <unistd.h>
# G: p7 \9 S& ^1 J: A* X" ]) Y# W#include <sys/mman.h>
0 v9 `# Y# A( P  B1 L, \$ y0 O#include <sys/types.h>) {: v7 \. D8 v  p
#include <fcntl.h>. h" l1 o! G% r2 o4 Z0 k
; U' L" X+ T  c5 L& Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 ?% a" J  t/ R* E1 E" U* m
+ {' Z2 n" c! K% i* k- N
typedef struct9 D5 z- x/ B+ A3 ]; T
{
0 F  G9 w/ t& w8 R6 k3 R        unsigned int a;- B2 b" m: |0 L: F( b* S
        unsigned int b;) K5 {. q5 D+ x% ^
        unsigned int packet_cout;. }7 ?) \* v3 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 l, J' M) O9 [% |. D2 x. G3 k, z

- \1 e/ R5 _6 ^+ v! xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. v: Z! K4 u! k# P6 X4 O, l; `7 H4 p
unsigned int count_copy = 0;
: e  W' q) m1 ]; B6 o! G* I9 z/ @5 o6 Q, g; I6 c5 j) N

- b# O9 W1 F; `) Y/ H3 xint main()! i4 P' n9 q0 @, }4 y. n
{
" e: c  i. w6 S+ r! z        pRX_MSG_PROTOCOL pshreRAM = NULL;7 z% Z* A$ P2 B8 ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* n, v& @" x! |2 A. `
$ Z  T; v7 F0 w- ]        while(1)
* _/ k+ d* N) ]! Z7 a1 _        {$ M$ x) y5 Z" O5 i9 t
                read_MSG_buffer(pshreRAM);
0 q% W* B" c5 B7 H0 q        }               
( X/ a9 i, E, h}) Y% P. O; M( E

  ~9 ?) ^: y" a. [0 s* Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) T. |% G( t  u8 r
{
% N$ h2 v2 A8 d! o+ m, @        RX_MSG_PROTOCOL buf;
% T' `% }" L4 k9 m7 x$ B        0 N' B( A2 D! \/ ?! U2 ^( r
        buf.a = pshreRAM->a;
* d5 Y- ^- t  H3 q. [" M        buf.b = pshreRAM->b;4 m! T1 u$ Z! Z
        buf.packet_cout = pshreRAM->packet_cout;
9 I1 z0 h- v/ Z* l" W$ i        9 J+ L( l& Q$ L4 q1 k" L
        if(buf.packet_cout != count_copy)
( n3 k1 \: X6 h# M" u" t0 i% H        {
# G. q/ j" @) d% `* y) F; f' O                printf("a is %d\n", buf.a);8 ~" k% L# A* U
                printf("b is %d\n", buf.b);
& |# Y! o# p3 Q# a- w8 s                printf("count is %d\n", buf.packet_cout);
. q0 v3 I  R1 C6 L5 i5 L3 s* A) C$ K- b                count_copy = buf.packet_cout;8 }  h7 A4 b6 `, v" b( D: ]
        }  _6 z  W1 R% @6 ]6 a6 u
        else
9 X8 U# w" K: g6 l        {: R5 B7 h+ B4 @+ T" C  K
                printf("No effective message!");# v: }9 T' P* r4 z! U
        }: y. K( X9 ~3 ?! h
}/ m* h' k1 K2 p7 {) A5 L: y! h5 W3 k
! @3 d0 l) Q& c" p7 _
+ z7 T$ w. }" n+ b5 s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( n4 {- \4 }& L' O+ L$ m+ K. l- O
使用下面代码,对内存使用了mmap函数后:2 }5 U/ @1 t# t# |. `
#include <stdio.h>
/ b& d/ j( y# b#include <unistd.h>
( U  S  c* M- S8 H: {5 z& D, I#include <sys/mman.h>' k+ |% g4 Q$ X9 b& B5 V: ~
#include <sys/types.h>$ q9 e# N( u' E6 k3 z* x4 i* H# G
#include <fcntl.h>
$ n; y+ i, H: Y" @" C" z5 q: i; i
* I& R1 Z: _/ B  k#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 F& a0 P" c, a' C#define SHAER_RAM_SIZE         (0x20000)   
! U1 H) b$ j* X. c2 ^; e( m. W9 @+ N4 z
typedef struct
$ }4 E+ S5 w+ V$ L) p3 i8 d{
% X- P1 j) l  s0 n% T. p! d        unsigned int a;
, a0 G7 x6 B( \  P. e5 n3 r        unsigned int b;  v3 w/ B- f: p9 o& R1 U' a) t  m
        unsigned int packet_cout;" p4 v( p, T& E3 y; i8 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ~1 d8 A% V! g. e/ q& V# z
6 x, C+ B4 n& {6 L% h1 P$ l5 A/ Zvoid read_MSG_buffer(int *baseaddr);
* j; s- E" Q& A9 yunsigned int count_copy = 0;
5 v+ P2 ]: l8 {8 K
9 B' _+ y3 Z$ s( E4 b# Cint main()
" a/ t, k! i4 [, w{
0 K% a+ l6 ~: ^  ?        int fd;" P! H3 y( T' r0 D
        int *mem = NULL;
5 r& D% ~- c) z% v# Q2 R
# M3 m- M5 F; h- n+ K        if((fd = open("/dev/mem", O_RDWR)) <0)
6 w3 ^( l% b' X& ^        {7 p% k# b+ Z; Z0 j0 S  y
                perror("open error");; U0 Q8 Y3 e5 d6 U  x) g# [
                return -1;0 r: w" P# _' e% Z$ w. {7 W
        }$ o* i( f9 n! C2 u! R
        
: l$ \9 z7 U$ n& c# C& _9 z+ ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 `" C7 M6 I- G/ j3 I3 z! _
+ C! c: x) }; d' A
        while(1)
' ?3 [& p7 G, q4 m$ r        {' d* `. i% f: t, L% M4 C
                read_MSG_buffer(mem);
; ^7 q6 n- B4 f* }! E' u/ r        }                - U: q( X* x$ Q5 w3 E3 `8 y
}
: T1 g+ |4 H% U7 g$ ~: q
  A: F5 |. B. `' p5 [1 P3 Nvoid read_MSG_buffer(int *baseaddr)) r$ O/ j/ \; N$ S, z$ C
{
; p. z* ^+ f6 W: I" z4 n+ b" ?  G/ J        pRX_MSG_PROTOCOL pshreRAM = NULL;7 h* i" Q; q0 S0 \3 t5 y

5 L$ \& F  r# d3 s. H2 A2 K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 B1 Z' `/ x3 C  w+ V. I" k( {# }" @4 d
        if(pshreRAM->packet_cout != count_copy)
: @% y' ^( G! e: i        {/ K% p! y6 G. L; m- s
                printf("a is %d\n", pshreRAM->a);
3 a: m; @* g; f/ s                printf("b is %d\n", pshreRAM->b);
/ C# G. K5 I' j0 C0 B% v( O                printf("count is %d\n", pshreRAM->packet_cout);
' w( D" u; |5 p" g4 Y5 T                count_copy = pshreRAM->packet_cout;
0 o+ Y# ~- W$ S/ v5 T% S        }
( f* ?* Z7 {9 `9 y" v; W        else; t. n3 W' \7 b4 d6 y1 ?$ c
        {
9 n" l5 v+ A& v% ~* O                printf("No effective message!\n");
9 P+ y) |  k3 d( B# f/ V# p% |        }# q8 F2 @6 M6 l: }
}
. V8 e. }! G  B* G7 z$ f+ I' f" N) L) x# m. E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ r8 Z: t5 g' K) Y
" T9 T! ?" s3 j) v$ Z3 T( Y" L3 @/ c3 k) {* ^* G! n3 C
, ]/ W" }4 |! V

. D% W) w7 x& N$ ]3 N1 i2 V# h




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