嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& ?: w+ C1 L2 K. v! c0 |  q+ k( l+ ^5 F6 B: G; ]; y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: g% n. a  i, k: t" d0 O& T$ D& V
#include <unistd.h>
- M2 W9 {# O" |' A4 {' e#include <sys/mman.h>6 i3 {4 u/ \, j1 o
#include <sys/types.h>& k4 G( @. Y3 `3 `
#include <fcntl.h>% ?- o% o! b  h7 h" H" o6 R( N

4 c; c6 M+ s$ s0 q6 O" T#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 l* a" q8 L" y$ Z8 g
- u  x" M) k0 O3 [
typedef struct
; u, y( o, ]0 \{* B7 ]( V% `% Q& m/ D% d
        unsigned int a;
7 W6 e" J% Z  |* k2 Z  c$ j9 e        unsigned int b;
. y! K* i4 V, t- _) x- E. e0 n1 n        unsigned int packet_cout;- a5 z* X, ]/ W3 c. U6 R  n0 K# J3 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w/ R- H; E* W8 o1 m# y& G- I+ P2 z3 H3 n3 r1 T, H' F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 ^* e3 s+ [4 W9 ?- u
unsigned int count_copy = 0;* z8 m. a3 |5 D5 d4 M9 r

( L( P$ t% R" q
) O1 P: G% v5 G6 I# f* h" \( e+ |int main()
  Z/ J0 D+ A6 W1 V4 h5 b; m- m{
/ l8 t  ~0 G+ l6 h+ \1 o+ [        pRX_MSG_PROTOCOL pshreRAM = NULL;' ?5 G8 {/ O8 k( K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) o' l' K/ p# c, D
1 @6 ]: I0 x7 K2 u* n# C) O        while(1)7 L4 l$ y  }0 n* F, a9 I
        {' `( `2 C% Y) a5 `* |
                read_MSG_buffer(pshreRAM);
8 D6 B( d& ?% [) n; A        }               
3 x! }& X' U+ z/ w; c}
* l6 q  @, l8 ]4 L" ]. u2 @1 b5 n* W( V) S! L  s, E  i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! j* e4 c( z4 [, ?' C
{. q0 _6 _3 `; K9 \/ O( L
        RX_MSG_PROTOCOL buf;! T4 P( Y- x4 o1 P
        # u  a/ Z& L6 v( g5 N
        buf.a = pshreRAM->a;; z3 A; u. z  O% \4 w
        buf.b = pshreRAM->b;3 C9 i. J5 {. T+ I& n  d) c
        buf.packet_cout = pshreRAM->packet_cout;9 l4 P4 m- N. s0 P5 B3 [$ w
        ! q0 [6 c% s$ Y2 d, k; V, n5 V4 [8 f9 Z
        if(buf.packet_cout != count_copy)
, s6 {8 E! h0 P        {# y1 x: `- p. N1 _, W: f7 N  k
                printf("a is %d\n", buf.a);0 B* [) C$ Z$ o. M
                printf("b is %d\n", buf.b);
' w6 a$ N6 j! f. n3 h                printf("count is %d\n", buf.packet_cout);
+ b; `- w' s: p$ Y: _5 A3 K                count_copy = buf.packet_cout;
; `# a/ ?5 T- |        }
8 d1 s' O2 ?( n/ N" G+ |' h- p# r  _        else
1 O/ t/ ~- i9 E4 x' I        {" s; t" x; j- D' h, p) K# ^  h
                printf("No effective message!");3 M6 b; k  [8 D! F  _' z6 C4 v6 C
        }6 {! Q6 g" B: O. k
}
7 Z8 o& x' {7 T, d) R0 q% ^, O( {) E& ?3 O
: V: l9 b9 I; ?8 p" a  K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ C# I( K& w. p
使用下面代码,对内存使用了mmap函数后:
% }" O2 a% k8 z6 v2 _* K#include <stdio.h>
5 X) T/ b+ [) Z1 z8 b#include <unistd.h>4 B5 x. k- O) U" A$ \* h" V
#include <sys/mman.h>
$ p% F. k, e0 e: C#include <sys/types.h>6 Z" a; r( K7 @' w
#include <fcntl.h>
, h4 \* a0 q- K  b  ~
9 W* ]" I0 a: ~4 ]- n( i#define SHAER_RAM_BASE_ADDR    (0x80000000)& r4 i! h; b) K- U9 C0 I: p
#define SHAER_RAM_SIZE         (0x20000)   
' X1 U. ^+ ?! B  g3 M' l7 J5 _' o
1 l1 N5 p" ^" ~6 R/ e8 @typedef struct' U* J; D# c& Z5 D$ J' }% @: G4 U* i1 E
{
0 |# Y' y) C2 T        unsigned int a;! L  v5 ^+ O$ h- J" c! A$ c
        unsigned int b;
$ ?! E) n/ s  r1 n        unsigned int packet_cout;) x+ V4 t$ Q5 O3 v, Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. j: A" \0 ~/ S9 a% H8 b" }7 f

( C/ O8 D( R/ S) Evoid read_MSG_buffer(int *baseaddr);
* }. F) r- A9 ?. `  Bunsigned int count_copy = 0;" c8 x6 D2 D  u1 b) D' h/ R4 R( }

: f0 K. u2 ]* h7 eint main()
3 h* U- ]/ H* D# E$ b{
1 A* H' h: c$ j2 c$ I. B) P        int fd;: u6 \1 d- ]  d7 H% o) F
        int *mem = NULL;
1 N( ?/ F1 v# h$ M0 x; P
+ w6 n# l" r" P' v5 ?" |: `        if((fd = open("/dev/mem", O_RDWR)) <0)! a4 u. R' V4 D1 @- {: k7 H
        {
7 _4 k/ n' B6 }& n" O% @                perror("open error");
% {% E5 r/ P! {6 t! m+ P& O                return -1;0 A. ~$ D$ K+ ^+ M$ y8 _) B/ I
        }
. f" X8 p! H4 K3 E6 R0 x. m        8 i3 s9 a$ |4 ~7 y) S6 \' `
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! h* B! X+ g+ Q2 l
, |# _7 E* C# i) k. `6 p9 W        while(1)
2 {3 B9 R1 D. v! f1 z        {
1 o2 ?! |6 J5 E$ n& E2 y                read_MSG_buffer(mem);
3 N6 o# F: [# h0 g2 N: `        }               
6 O: O, j5 T" m! m0 ?}
) N. m2 V$ e9 U  F; e8 S8 I5 f
4 R9 p' q( q. q8 wvoid read_MSG_buffer(int *baseaddr)
0 Z# f3 o/ R9 q, m* _( e{- h. t9 t) I, e& [
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 L2 U) j+ D; g4 y5 Q

/ r$ s9 i  k1 H- U6 y7 s/ G( z: o* }        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- b  [( ^5 M& j5 f4 |2 A: v$ V9 D  ~% C: u0 G4 P3 p
        if(pshreRAM->packet_cout != count_copy)# }3 a2 z- d5 x, ~% O
        {3 ?4 I* L; B7 C8 M' G/ Q
                printf("a is %d\n", pshreRAM->a);' Y; C* _2 e6 n" s' b3 z$ R* j
                printf("b is %d\n", pshreRAM->b);7 z  g9 i2 [* i% _) o
                printf("count is %d\n", pshreRAM->packet_cout);
+ ?( ^: C5 s; \" y! I  S3 L                count_copy = pshreRAM->packet_cout;
2 W6 m+ x) c' I7 `$ i" X9 F7 r9 n        }
& z) N6 X+ M; n        else
! I# Y: |0 d6 a        {) O1 e# j; G4 |5 b
                printf("No effective message!\n");
: r; @0 o; p  i. b, d        }1 {; O! p0 z* x, [2 o
}
: a$ }7 L; z: \2 o- C$ m
. T3 Y  g" s# j% ]+ h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" i$ Z; i2 W) o* u2 w% U/ @+ v: C
' s+ h: E% m! C- ]3 g5 b
+ x' e) |' T* [6 w4 W
" `" S& o; B- z" a, P9 w: `8 G
: u/ S9 r! K8 ~6 u0 Y0 c





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