嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 v4 i- u& ?8 v8 X. Q1 \1 Q! y

& d5 C6 @( K. q5 @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% }; ?; V/ }; L! f
#include <unistd.h>
! t1 S8 t, z( H$ S5 p8 `( Z2 S#include <sys/mman.h>1 p  T+ n  {! v3 n- l5 t
#include <sys/types.h>- N' K* e# n4 I# q6 A: d5 @; u
#include <fcntl.h>
" z8 b. K: B, H# f& l/ D; [' b% m+ w5 P1 q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 [$ @: Q4 w: E7 a
' V9 F5 a! Q0 U( e4 b, d
typedef struct0 q2 k) d8 K- z" {
{
, W2 Y# L8 f$ k$ j; [; y/ h        unsigned int a;* [5 D: P) I  A
        unsigned int b;5 z1 S( v% I% O+ ^' t! c6 S
        unsigned int packet_cout;7 |* e$ Y/ }; R% o& M: n& v9 j1 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* P6 _3 U. k7 j0 O8 f0 P  W

" i( X% l/ v! a4 y# I; {- lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! n5 f! F' a- A9 {7 X" n0 d! _: {
unsigned int count_copy = 0;
. ?4 H% V( L/ h7 s0 Z0 H+ n
( |( f- `! n) L$ L) C. j! n: Q! r% T# x8 w! T* T) O$ ?
int main()* u, a  u* t- X/ P! Q' @8 t
{
: o( k2 r( f' Y: l  D, T2 s        pRX_MSG_PROTOCOL pshreRAM = NULL;
  j* \+ N" ~8 x! P- c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  n$ m/ R" @2 F' {/ `/ h. S

  C, o! W2 M6 P        while(1)
( J9 E1 S- y4 A8 Y9 a        {7 _" C5 a6 j: x+ `# c' [1 {% b, n
                read_MSG_buffer(pshreRAM);
5 T; S: Z* s; P        }               
! @6 D& T% l+ N1 p) a8 d( d}
0 x/ s- e. P, _7 p7 C" g: N+ K( P6 L
4 }" b/ o4 f3 e: z4 `% w; k( Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 Y2 s& W+ C+ A' U8 N+ y/ M- k
{  ?7 w5 p  ?$ P8 |1 m4 r" @  m
        RX_MSG_PROTOCOL buf;
% H2 h* p7 ?1 {* d( Q$ J# m% n        ' D- g$ X  }; o6 [
        buf.a = pshreRAM->a;- Y- G% O9 p2 G, q3 }  m1 j
        buf.b = pshreRAM->b;
* m6 w4 m5 Z+ f. b        buf.packet_cout = pshreRAM->packet_cout;
( b0 s( z4 N* `& B% E- m          q) e: L3 X+ O' \) J7 j! k4 g
        if(buf.packet_cout != count_copy)- r6 d- A- c0 m$ |# D2 V
        {- A+ A" \  G0 d: z( F7 O
                printf("a is %d\n", buf.a);
' I- F  J9 h* z6 X5 u& g" q- f* A                printf("b is %d\n", buf.b);
/ G. E% c" P' F$ M8 G% l                printf("count is %d\n", buf.packet_cout);
- d# R+ Y' Y5 \& l3 K2 d3 E0 r/ z                count_copy = buf.packet_cout;  B# @0 j  Q  N
        }
" t- l/ @, d0 [/ s        else
4 H% ~! y- T1 i) d4 e  d& B        {
4 ^2 u# R% `: i  t8 q1 |* I. d: e                printf("No effective message!");. Q0 |8 T5 U" e; }, f# m( P+ k$ S2 P
        }
. C5 y- P( z# U}9 K0 F* e3 Q/ Y! k* I
" ]$ z( r- h5 {6 I' Y& J( B

$ }. o  `0 o6 b" E  U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 j1 ]  i" O6 J/ p7 X使用下面代码,对内存使用了mmap函数后:
' q& Y7 d7 v0 r* O. k( p#include <stdio.h>. u1 o+ p. B3 v/ M
#include <unistd.h>
9 }! u8 j$ E; r' C0 F: Q#include <sys/mman.h>& x; y8 e- J2 Z; v7 X9 r
#include <sys/types.h>9 H9 J4 a$ C: K7 Q4 Q4 N# P3 s5 h2 s
#include <fcntl.h>4 k( M' @) s: I  j9 Y7 N

9 m" i: t$ a  E#define SHAER_RAM_BASE_ADDR    (0x80000000)! F  J8 u& J$ k0 o
#define SHAER_RAM_SIZE         (0x20000)   
% G4 B0 y+ \- I8 M, v
" d5 j0 h( o. {% _$ y) g- P3 W5 Mtypedef struct7 n/ j7 a- A0 E# h* w. R' P  i+ I; c
{+ T- G% C# X6 J4 o7 N* Q2 E1 t7 c" T
        unsigned int a;
# C+ L% I1 k# T        unsigned int b;
. x% F' K  _' Y& h9 C$ o% R8 e        unsigned int packet_cout;
6 e' @, t+ p- x# r  H- ?1 J% |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( M9 {1 G2 [9 c, y
' L- v( z: G6 P8 Z# R5 Uvoid read_MSG_buffer(int *baseaddr);
+ |# v7 a5 c$ i- U- v9 @- e: m6 ]unsigned int count_copy = 0;
" T% Q+ `& d/ d3 I: @" f) z9 C2 q3 ?" k% a# n8 ?
int main()
  F3 q; q' X/ |3 \{
5 F! a5 l( M# V& a+ c+ S' L% \        int fd;
% F) A4 v5 H% A  ]4 z2 Z7 p) m2 o        int *mem = NULL;
4 L6 _7 P8 c2 r0 E9 y7 Q1 S5 Y) g8 g: E% i6 H+ w$ x% b! }7 y
        if((fd = open("/dev/mem", O_RDWR)) <0)6 N+ F/ x9 P4 C$ r. e3 z7 K1 m; r2 z
        {9 P7 v' d; {. w: S" ?8 o
                perror("open error");; I; a# \& j& z4 d, s3 w
                return -1;
% n" p# ~" ^+ z, D# Z* {        }
+ a/ s8 \0 x* }! p* s3 D        
! o9 \! M* E- W4 e* x4 \/ b" U        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 A' Q) j! ?& V0 G2 \. W9 y! u
4 N1 t" }  p- R2 J: o) n
        while(1)! X0 A% K" h$ e% K
        {4 A. S4 e6 ]: {  ~2 r  |9 D
                read_MSG_buffer(mem);
6 o! e7 ^7 Z5 M" |5 P' p( g        }               
! V  N# E  {. ]$ ?: \  ]}
1 j9 [7 W- r' a: h
" ]9 F' A& P! p8 _; T% l4 avoid read_MSG_buffer(int *baseaddr)
* x0 K8 y& z/ b/ l3 {& E' J{% R1 ]6 D3 h% A! g. H! x9 [; a
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ n* |# T, ?( V( C# n

) ~) b% B: g1 I/ i5 Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' K9 n$ U6 L3 H- V9 C( K' F8 i
, i: b; b5 j/ ?3 Y; w' B
        if(pshreRAM->packet_cout != count_copy)
) b5 L, f: x# v0 `; s0 x        {
! e% v3 Q5 j' @' a# I, q                printf("a is %d\n", pshreRAM->a);1 T* b2 o/ s2 t1 r; L! V/ S6 K3 L
                printf("b is %d\n", pshreRAM->b);# B% t' a+ X4 y7 A
                printf("count is %d\n", pshreRAM->packet_cout);3 k5 g# o/ y' a0 B. ]
                count_copy = pshreRAM->packet_cout;
% ~# {! s7 c. I* i$ M4 Z6 j" F        }" j0 g7 }3 H+ @" j6 N( f3 o
        else6 h( F" c' l' ^5 d# }
        {! P, Y3 S6 @7 A) o
                printf("No effective message!\n");
! }; A$ Y( ]! C$ C7 }1 E) {6 ?. o" G        }
$ X: h" }  j) B! i}- x, J: O/ Z. S6 E) I% _8 f  h

1 G/ }0 T' o8 m- D0 r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- V9 e& T+ ]4 ?5 b2 B# I. y0 j2 y* Y/ p8 z- w5 s& ^
' N7 o, Y  s$ ^" w) f/ a& V! g
3 |8 s2 w* \. L
' y. |! [3 B: Q/ h. c0 Z9 n6 x; g





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