嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' \$ r$ [' m, z) p" x, R! V
4 g$ F8 I$ ]2 J. XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 E2 c2 i9 W% P
#include <unistd.h>
* @4 \" M7 [/ K* m. z#include <sys/mman.h>
5 b% x* k+ r  _: U; F8 I5 J$ ^#include <sys/types.h>
: z; A' d" B! h1 ?8 i#include <fcntl.h>
6 F9 y! a: ?1 v3 W4 b7 t8 h- i& S6 m1 h% {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 D8 e8 a! H! Y* i6 I( b8 G, K

( `2 @% d# `/ Z' R( S7 x% _' ntypedef struct' @5 @" S, T' M8 b4 ~
{1 n' l4 z2 }4 u$ h
        unsigned int a;; |( j! y3 t" Q1 ], ~& @
        unsigned int b;
* }* B2 o1 V6 S: V, E4 ~- }1 V5 e5 y        unsigned int packet_cout;; y, o+ x+ F- t4 P# t# v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 U( j% i& Y3 _6 a6 u7 ^' O( v# I  S6 K7 \: }7 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 z6 v4 m# [" u: h4 r& ^unsigned int count_copy = 0;
8 m& L7 f- q* s3 e$ M
9 n) i/ P/ |9 A1 D& E! ~( J8 I
1 L/ S' I. W! g/ J+ v% zint main()1 t7 b9 z% r4 G" K' ^& L
{6 U& [& J; T. V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' F% {9 `) I5 x: L$ p        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& X. g7 D2 L' F& X9 z* X3 O

$ q5 t- k& m. M6 ~$ z2 m+ v        while(1)
/ \5 [. R7 S$ ?9 E' A        {
% @8 h0 t, Y+ p& [6 L0 D/ k7 C* A" m                read_MSG_buffer(pshreRAM);
& b0 C3 @! j+ y4 p: `# L7 S9 s        }               
5 O) w" n: k9 b! C4 A2 E, R* O1 I}
: o2 e% e" u7 O, b0 r1 q* @- ?9 [$ n1 m/ U2 e+ n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% O! k* T, C0 @% F  z( I2 z
{, o& Y- e2 s8 D# q( Y1 ]
        RX_MSG_PROTOCOL buf;
. O' C% F5 a, E% u. D8 ~( c$ w0 C        ; L* k# l  ?, h  \+ w! `1 u3 l. O
        buf.a = pshreRAM->a;
; V, y# w* V5 ~% x! c8 G: M5 [" n        buf.b = pshreRAM->b;: n4 L6 @1 P& ~0 K
        buf.packet_cout = pshreRAM->packet_cout;4 d/ @' I5 i& T8 n) V' M
        
" k0 F# v. c$ C6 U        if(buf.packet_cout != count_copy)! E# H& [9 P( O/ J4 E& |# G5 {3 \
        {9 ], s, M4 h9 N+ Z
                printf("a is %d\n", buf.a);
# b, t- p8 F, j1 d                printf("b is %d\n", buf.b);0 i5 Z! A! G! W* E! }2 d
                printf("count is %d\n", buf.packet_cout);9 @3 d8 X; p4 O6 i
                count_copy = buf.packet_cout;& f9 t2 r0 D8 y0 Z% v  N  H
        }
  h! I& P' M5 K! z9 F3 A        else
$ `, a4 L1 n5 E$ G9 m7 u        {8 B: r1 @6 F( H
                printf("No effective message!");0 Y. K& l6 v0 ]* O
        }
- G; a0 f. k& J1 h8 N% g" ?6 ?}8 W3 c" B, j7 \! ]$ y

# ^) G1 T, Q3 L. Q( `* @
  F& I1 ]" F! {* I7 l$ X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 p# @) j7 O$ y7 u+ Y! A4 r使用下面代码,对内存使用了mmap函数后:2 y; e6 r* I* ?0 r9 x' a2 @
#include <stdio.h>( x4 c9 p$ \% A$ i1 J2 i9 ^' f
#include <unistd.h>9 y1 h) _* T! Q8 a) h" o! u1 s
#include <sys/mman.h>
( }) t: k* X) [6 J( O#include <sys/types.h>
3 c4 J% ]5 }8 f" N+ Y* h% U0 l) c#include <fcntl.h>$ |0 w$ @$ t- [# z) ~. j

) Q6 \) _9 X" w$ g( S#define SHAER_RAM_BASE_ADDR    (0x80000000)
& i' |; T6 F2 _( j$ D#define SHAER_RAM_SIZE         (0x20000)   
& R5 j( q, M1 q) u# s; c; k# A
" [2 t) w- I5 Q5 y5 m) h) b& btypedef struct$ p& v% {$ a" ^# N; G& M) v" R
{
! Y% Q& Z0 U& X; u3 L) C        unsigned int a;3 k2 v. j2 Q2 K
        unsigned int b;: v7 @# ^' c' m% E: u
        unsigned int packet_cout;9 f$ {  |' S: V# C8 a8 ~" P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% U# i$ ^" Z( C- B
. r2 x+ F' L5 t1 R; P  Z
void read_MSG_buffer(int *baseaddr);* L3 R4 o' L* j3 X
unsigned int count_copy = 0;& Y8 }% Y7 z8 k' p4 x
' [8 ?1 ~4 x* V' k
int main()
2 _$ ^( [1 F4 }1 }. l{
. \1 @5 M% W8 t        int fd;
, K5 X' x& c/ k4 N        int *mem = NULL;% X) T$ C+ X6 O) {, J

4 I6 s, }3 L/ Q& n8 Y2 j: _7 d% q8 N$ ]        if((fd = open("/dev/mem", O_RDWR)) <0)1 _7 S" o3 G) ?
        {7 G/ J& ^1 F' J( j
                perror("open error");* x6 v5 K& C/ V) q  h5 [& }4 D& z! S% E
                return -1;
1 z9 A* t1 f, N4 W        }8 s; h. v7 j. A8 a" @3 ]
        " D/ g  J* D9 `: [& }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 m  }5 I5 X% Q7 ^) \

8 c: U' A) \# m/ g  w        while(1)
6 c5 t+ h: t& K% j' D$ @! }" H. v        {
8 V7 P, X9 w) P  y) p$ W                read_MSG_buffer(mem);8 g: W, W! x) n% H5 }8 A) G5 @1 F
        }               
; U0 [, Y7 w) u) j' B  e}+ f: L* A7 l3 h3 t4 _- ~7 R
& I' ]- c, V+ F: M* w
void read_MSG_buffer(int *baseaddr)
3 v2 a  d! G: M0 ^( h{2 |6 ^5 G8 n/ S! j9 @  \8 ?6 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 |* f  R& M& O8 l9 T1 m& O" b: g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 ~( c6 d* Y: W# y/ L* b- p/ H% l7 ]9 s7 |
        if(pshreRAM->packet_cout != count_copy)
7 N1 K* e0 \% _5 C        {
- u+ N( }" R! r; K% M- ?' c                printf("a is %d\n", pshreRAM->a);
: I5 t2 M& M' {( u# E$ B                printf("b is %d\n", pshreRAM->b);( `3 K5 _" q+ k& W5 k5 C
                printf("count is %d\n", pshreRAM->packet_cout);
  ~* @- W: ~8 y* A- e! u                count_copy = pshreRAM->packet_cout;4 p( f& K/ u& g) d  [
        }9 \0 [$ I; E. U
        else
' _6 G9 a0 J8 Z  j; F7 A        {, u  d/ F: M  O# m1 k$ p8 T
                printf("No effective message!\n");
. f' Z2 i. N4 R$ V        }
+ [0 K) @8 A6 }; V. Z* ]}0 Q. h% n0 U# B
: R0 a$ d2 I8 Y* s* D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& n6 }  N! _2 i+ i

$ D* \4 F; m/ @. V: T! T, w8 r/ E% w6 e
% ]$ w1 V* a+ m; C) J. b8 k: @0 p. W+ V* [" J: |8 s6 }* Q
+ B: x% n1 E% B' H9 H





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