嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 m! {1 N' p7 {5 T  S- X/ w
3 S9 M# q: j% }$ P6 V, s8 d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" P8 j/ U$ X0 V. X
#include <unistd.h>
) ]8 l6 ]( k, K: b* i) ?$ J#include <sys/mman.h>
# [7 n" q5 t* j2 F3 T#include <sys/types.h>( f+ y' D, v. l3 J+ E1 v0 l
#include <fcntl.h>0 p& {3 S5 d! x2 l

- f- x, ^1 @0 E#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 V7 `* B; q" n1 m& K, h& [3 h" C

2 s1 l: H# @9 k4 k& {typedef struct# r3 \" v2 `, U4 w
{
, s' Z+ Q/ h. b; h' x$ Q        unsigned int a;! R/ U. F6 f, S0 z- s
        unsigned int b;' o4 E* a( P/ k+ X& G' @& R
        unsigned int packet_cout;
2 b7 N$ t  ?) n! i: w, o7 `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& p- d6 l6 U: j' r2 d' A2 K

9 c, `0 X( ?7 l) _# S, nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 z) s4 r6 j' L, }
unsigned int count_copy = 0;
$ R' f) A. C7 `& ]5 p
  q/ t& ^6 V' u2 A) H& g* f! C: F6 M4 Z- F( X0 H8 B
int main()
- n: g7 ~% g, Z- j/ t1 j# D; B{
+ W( t- b: q+ O7 S" W        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 t- O7 l* w9 K5 y6 h; Q- e3 C        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ Q+ E( ?% X+ m6 k/ ?

8 h. @  r+ P; j; ~        while(1)0 v5 e% ?$ ?! J
        {- W4 M% k* V% }2 O. `, x6 B
                read_MSG_buffer(pshreRAM);9 K* ?6 \3 a- o; p5 G# w; v
        }                / C9 ~" F4 |7 L1 |
}
9 F* A. [! E1 Z* {3 h' S
% ]/ _* z1 V5 C9 V% A: bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 O9 p3 m: [1 F2 z$ X0 e/ u{! P/ w8 _1 ~  D2 X$ S$ y
        RX_MSG_PROTOCOL buf;3 _) L% X5 x1 ?+ `4 N: _
        % Q: N) x* t: g* X9 h
        buf.a = pshreRAM->a;1 a! L% \. h  Z1 h8 d4 T
        buf.b = pshreRAM->b;
2 ^0 U1 k+ N( r2 X! D        buf.packet_cout = pshreRAM->packet_cout;5 P7 t2 u" F/ K
          A) P6 V8 T1 @2 i
        if(buf.packet_cout != count_copy)- D: P" b) D2 j. A* `( B* h  a- k8 f
        {. @; O$ I6 t; n$ H% E) X5 J3 B0 t
                printf("a is %d\n", buf.a);& d. u/ O3 ]; Q
                printf("b is %d\n", buf.b);. d. V9 J8 h$ j8 Z) Q: I3 X
                printf("count is %d\n", buf.packet_cout);) J% K: ^) I( Q. }
                count_copy = buf.packet_cout;
1 z* d9 C3 W( _! x/ n1 y: y        }
' u- Z  z2 k/ w7 Q- w& [4 f        else7 _7 v! ~/ k6 k5 s6 B
        {/ ?7 `  Q" {2 Z; y$ I* @5 O8 J
                printf("No effective message!");
& a; t- M' D* N8 C        }
* D2 O6 v: n' Z6 y. a+ V}" }, L5 T5 y: l( H, ?+ @/ j4 g
4 p/ {  V% w' y

% C3 H- L4 o" A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# `3 i! ?0 c# W  g使用下面代码,对内存使用了mmap函数后:
: I: m2 K: B8 [, g! M; h#include <stdio.h>3 i: C# ^- n4 l  Z. n" }
#include <unistd.h>
1 T4 J, I0 f9 r9 S& H% {9 O#include <sys/mman.h>( s* z" E! l! K0 x+ A% x1 ?+ p" b
#include <sys/types.h>
1 x: S# `' C6 |1 H- Y% k! S#include <fcntl.h>4 A) T' D6 y4 l' Y) d. D" w" s+ C) q
. s% X% x  l2 A* p
#define SHAER_RAM_BASE_ADDR    (0x80000000)- o0 m2 W; T& {) Q
#define SHAER_RAM_SIZE         (0x20000)   
5 [! E# k. H4 e8 [
6 B4 x$ P/ J0 x, c3 h5 gtypedef struct* n& s* Y0 x9 ]/ e5 @3 [' Z
{
; m2 p4 ]& y) u# }& z" Y$ U' o        unsigned int a;! y1 y. K: _- b8 i) p% K+ |
        unsigned int b;9 I; f4 R7 D' _, u: ~
        unsigned int packet_cout;# o0 p7 g  f( U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: @" T) Y) \1 f2 y% U5 t2 x; B' Z+ L; E/ a1 ]2 ]
void read_MSG_buffer(int *baseaddr);
2 L4 a# S, V8 Hunsigned int count_copy = 0;
6 b& r+ g: g0 M* w7 {8 |2 r- d- k5 x% a0 h
int main()
1 I& k& |( g9 J, `* `& b{( Z+ g) x$ v1 D* G" W
        int fd;
( S6 ?% [- p9 B1 M        int *mem = NULL;
1 t2 w3 @% Q- P9 ]8 `' H& F9 u) ?8 M; P5 z) z2 G& p5 e& A% _
        if((fd = open("/dev/mem", O_RDWR)) <0)5 |, r2 ?3 x; k+ s0 U; U
        {
* Y1 R3 x4 j' I( e1 I! w( W9 m( n                perror("open error");
1 z$ a& `4 N3 f5 i7 T+ S: E                return -1;( s( m4 j1 l7 y: E& W0 |2 k
        }2 W% ?) s" F+ Q* E
        
& U: m" {& J. `# l4 K8 P        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  U  e) L: ]; L. o' \: ^
% e$ |' F8 n" \3 p& V        while(1)5 k+ p& t' T+ a+ p) L2 I2 q
        {
" L. J0 L' n' ^7 ]                read_MSG_buffer(mem);
+ T, ?1 t* G% h+ G6 f8 y/ u0 j2 g, M        }                1 Y: O, n- @- X
}
9 a0 a$ ?/ q- O0 l1 t" b5 W9 R8 @$ D/ y9 [3 m9 L0 L; j2 q
void read_MSG_buffer(int *baseaddr)
- I/ _! i3 O8 A8 p& g{5 F, F8 F7 d! O8 v- {$ F8 ?% b. ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& `: B2 ~  I$ @( j3 |
2 I% t4 k: g5 [. h        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 |" J! t6 h7 N' F9 p3 ]3 V0 w; `
6 J8 |2 r9 Y; K6 k( n        if(pshreRAM->packet_cout != count_copy)
1 v* J) Z2 j/ h- _) Q        {7 A, q, H8 v3 G- A! ]5 X
                printf("a is %d\n", pshreRAM->a);
) T/ a5 w/ t' X: e                printf("b is %d\n", pshreRAM->b);5 Z" d, q+ R/ X3 }/ x2 }! M
                printf("count is %d\n", pshreRAM->packet_cout);& v) Z0 D! w' @, O7 d
                count_copy = pshreRAM->packet_cout;  s6 g* d" _$ j
        }6 P; o$ h" Q. \1 B
        else
( C7 e: j5 V0 B' F+ B        {, d! [( W9 Z% n* v% x5 B
                printf("No effective message!\n");
' X+ [2 ~- W! O  j4 d        }
. N" V4 y- q5 M. `" y0 ?+ b}
6 M- R' [% P( S8 U; J3 m- O1 w+ N7 [6 e& u. A2 p4 @+ J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. O' U5 J& u* ^" }

6 A' t( d2 A1 W
0 W! l6 q2 F) o4 u+ W( a. u7 c7 I, ^8 `9 `# F: n9 g. @
4 t* F  a4 w- ?  {+ E( E# a





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