嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 U. j/ C! G) i

7 x& `& H+ O/ r2 e+ QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 g1 D, s' E/ Y" J3 N& ^8 j3 B#include <unistd.h>: l  A+ N7 H: t8 N8 `
#include <sys/mman.h>
: |: f; v3 a  d! Y6 A#include <sys/types.h>+ Y. V, \. [  S
#include <fcntl.h>- p+ `2 |5 u3 h/ M7 A7 ^: b* q+ \# E

. y2 ?& H- d0 q#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 X; F0 p, h. E* q  e  I4 m& Q% H3 ]- t( b0 }
typedef struct( N+ U/ ^8 J4 W3 }6 x% u' K$ z
{' b  }0 s& ], g  D: p# k$ U
        unsigned int a;
9 U7 o4 s* l' c. M, `        unsigned int b;4 |8 m. |/ s- h. E
        unsigned int packet_cout;( k. a- W8 S. S; _6 U+ G( t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 K# j* {6 l4 X1 ]' c/ Q7 i( \) m; v' d  J( |' h" Y' W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% v4 x% h4 R* K1 f1 C; a
unsigned int count_copy = 0;7 [5 G% N1 b2 g3 f
- S- p" U# O3 o
, C. |4 }0 c+ z- p: X
int main()& |( f7 k& P, i3 {  j
{
; l+ h9 e6 Z5 y2 M) A        pRX_MSG_PROTOCOL pshreRAM = NULL;
* R0 i: L2 f3 v3 g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! R$ U3 O# e. H  o  Z2 B$ K: m" |2 f1 ^1 ?/ x
        while(1)
& g* A% Q, y4 Z, n/ [( G. I        {
0 g! F  G# M$ d6 [7 ]( t                read_MSG_buffer(pshreRAM);7 ]9 Q. h- j# t) A; w
        }               
1 R  e* [3 R1 f, q6 H}
# k3 t! J+ I9 `- e6 y0 i
' f  B8 P# \7 J/ J) d% ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 W- C7 p% \' u2 G6 T
{
( ?8 ?" o6 I' x# V( l& D3 v        RX_MSG_PROTOCOL buf;1 Y! \( G* s" s  |3 X) ~
        
5 q/ x. r/ J8 P6 e7 ^- y        buf.a = pshreRAM->a;" h& D! F0 _, L- O
        buf.b = pshreRAM->b;
  _6 i1 M. e4 o        buf.packet_cout = pshreRAM->packet_cout;
$ v8 T& y5 ]$ R3 u' Z9 t        + H+ F* d' T: _6 `
        if(buf.packet_cout != count_copy)' w2 \; U& d; t6 U1 L
        {
# @' Z3 ~, Z. }- u  O9 G$ M                printf("a is %d\n", buf.a);5 a; v, c3 ]5 `* X+ r2 V. P
                printf("b is %d\n", buf.b);0 g5 K6 n1 ?9 K, ^; u: B& }
                printf("count is %d\n", buf.packet_cout);) \& V9 T) @3 }$ w7 a
                count_copy = buf.packet_cout;
) t  C- h9 b  h" [9 }& L        }
7 t7 W7 c. G" s5 J! G        else
5 P" M, D+ j8 Q& p        {& V9 ?8 Y, b0 E9 Q; t+ b# r- t
                printf("No effective message!");
& s3 ?- W& G2 z3 V% R9 Y        }
/ V; L$ x  E; j7 f2 X}; N8 `/ }: Q  n
- H/ }, ~2 {; ]* ?

& V( C5 B& Z  g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: O& a2 N& A8 T& L
使用下面代码,对内存使用了mmap函数后:- S8 I. i- ~6 O  P$ C: M5 W" s
#include <stdio.h>
3 s4 d0 C) E, I3 p/ A! j#include <unistd.h>! d8 |3 G4 w1 {1 E# {
#include <sys/mman.h>
+ N! r% K# E* q#include <sys/types.h>
  T: X! ?2 ^( d, _2 \#include <fcntl.h>& i  k3 c' W! m3 r3 j, @

! Q' n" ?: \* m% z+ ]#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ e! H, \* J2 B. ~#define SHAER_RAM_SIZE         (0x20000)     M8 j( ?! u( t, G- X; q- ^9 J# }3 U
/ K( S' B; x' P) A: a
typedef struct
7 H' X$ I. q  T6 L; Z{4 Z2 j5 U4 o7 x  |1 R: K
        unsigned int a;
% ?- G" i% _& j  v3 m        unsigned int b;
  e% T1 {2 l/ s7 [# _2 k        unsigned int packet_cout;; ^& C( C- d; z5 r0 T( ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* z$ h; x# d$ l$ T# ~; q+ {/ R$ I. _9 y% h$ \- r
void read_MSG_buffer(int *baseaddr);1 I; D2 S. ^1 T- {5 b! N/ ?, ?  o
unsigned int count_copy = 0;3 O- A9 s/ [  o( }5 {8 B

: P, O5 h2 r9 B- v* t7 xint main(): C, j/ ~' c3 W+ |
{( h% l* g4 X4 q* S5 V  s. z
        int fd;1 ^3 O2 m2 H2 d% [8 y/ t8 t
        int *mem = NULL;
' S) _+ D1 c4 j; c9 t1 `; J7 {  F2 u+ |$ {
        if((fd = open("/dev/mem", O_RDWR)) <0)5 w# H% N0 [6 C( {4 g' ^
        {; V* g# m6 B7 D. t
                perror("open error");
" i9 v) k: m. ]5 C! P                return -1;  x, t, c. x( |! T7 F0 z
        }
! \$ M# T( {; d        
, a! Q+ g7 H7 y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( s0 h5 l) L" l: S  }4 R9 r2 }  r3 `4 t# I+ R- K8 ]( k0 l
        while(1)
+ c3 n5 N/ _4 c- p7 i) j        {  H  F! K  N6 n6 f+ }, Z$ R
                read_MSG_buffer(mem);
. l) }& @+ A; r* ?* K        }               
; ~( C$ {$ n5 `  v; v}  T  ^2 S0 Q, p4 d

7 n# D* D0 `6 P. K8 u7 Dvoid read_MSG_buffer(int *baseaddr)
9 h5 Z. W& Y/ m8 o{
# l# t& |6 j* o, t        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 c8 j. \2 x4 H# H
! L+ J0 R4 `7 M        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& W# s3 N9 f8 a( j: c  @. J
- Y& P  {$ n% ?4 s$ J
        if(pshreRAM->packet_cout != count_copy)
+ l2 F! f! L3 \2 m/ X        {
: E4 G4 Z) L+ I; r* B                printf("a is %d\n", pshreRAM->a);
* _/ y! Q+ [  H' Q$ i! u                printf("b is %d\n", pshreRAM->b);6 W$ b7 O/ `, ~1 H# a1 z7 Y
                printf("count is %d\n", pshreRAM->packet_cout);3 p8 D+ k1 @$ I4 V3 _; l' k# @
                count_copy = pshreRAM->packet_cout;
! c& B0 y; W. A; T2 ]/ a1 ^7 e        }' n5 O' F& h1 i0 t! Z  L* w6 G
        else: H4 F4 J" d) i- q
        {
! h+ l8 I' ?- ^8 W( |                printf("No effective message!\n");
; y5 `$ W0 n$ G8 U; A* j; h, N        }6 d% x! {- ], m- Z- ~* z9 ?7 M
}
5 e6 ]- ?5 {- X- {& |( ?
  U- I7 {. c4 v, G# q: \% ~8 N. a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 d! |& A2 p7 y) E  B1 M8 L, L% v- n# L0 h0 X& H. A4 \) N
* }; ^1 V9 k' g$ L; s* k# D6 s
, B5 J. J6 E# t. v- V% _* D

: M" d# \3 ]) A




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