嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 }1 O' x) M; F/ n2 F

. {: S. @! H9 ]" m7 G# ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  \. {) \; H2 \) |0 G$ Z#include <unistd.h>& v# K4 E- q8 `, D/ e2 S
#include <sys/mman.h>- T/ w" ^8 l# @# S; M0 E$ l
#include <sys/types.h>1 Y$ ?" e0 C3 S! h2 X
#include <fcntl.h>( d/ E  V5 _6 f& d$ H+ b+ U3 g$ j
+ W+ X, C, f) ?! c6 I& y$ d
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " S2 E, \2 U+ q% }8 J  i* E* c4 K
7 c/ Q% ?% k6 R
typedef struct8 }+ y2 L- e4 W1 S1 V1 K
{
" `3 l0 t& Z7 c9 P' U3 P0 R        unsigned int a;
, Q& Q* L4 f1 X        unsigned int b;
6 q0 ~  R- t3 `2 X7 f$ z        unsigned int packet_cout;
& l- ]: i. I1 n' I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# H2 Y# n* v) H* e

* t  U+ W1 W5 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" O2 T4 D- F  z# ~unsigned int count_copy = 0;1 p* h/ r2 I! I& b& k4 s

( ]- E8 Y" |2 e: \
8 ]9 b3 k- L  M: jint main()0 W; X- A# W$ P; d) O) \6 {9 _7 g
{  {( W% H. S0 I. W& L
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 Q. V% R5 N4 z- n5 P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ e; [1 g3 c. O: L5 G& X3 S7 ?4 L( w1 ~8 A6 D6 x3 O3 D* H
        while(1)3 X# _* Y  j) z; [% W$ G4 T
        {% b& x1 N. ~+ p8 X$ k# F" H
                read_MSG_buffer(pshreRAM);! D( C: r# a  ^8 l6 W) _% C+ Z; y
        }                # e) y  W, ]1 s* N' }# G
}
0 y3 o. e- W: \* V- ]$ G! i3 E
* o; u0 |+ ^' ]9 l6 Z. ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: P: l& p; U6 ^4 C7 g2 P% ]! k{
9 K; Q5 D8 J. ?. [        RX_MSG_PROTOCOL buf;
7 @3 l7 V! I) d" {        " ]/ {$ T# g9 R8 h( N2 G
        buf.a = pshreRAM->a;: x* o" n: F  E- s1 c5 J
        buf.b = pshreRAM->b;; \3 o; Q/ P7 q2 w3 g
        buf.packet_cout = pshreRAM->packet_cout;; R( z/ }& e. I! b2 e+ S! o
        5 o; m( i" K$ s7 p) ^
        if(buf.packet_cout != count_copy)/ i$ F. K0 Q: q6 y/ p0 [0 @1 u
        {
) q) f3 W; }0 Z5 A8 Z7 d                printf("a is %d\n", buf.a);
* C/ s8 ^  V# O9 U. v* m* Y2 C  |                printf("b is %d\n", buf.b);* ]* a) ]- Y+ a
                printf("count is %d\n", buf.packet_cout);$ R& v& j# M) ]  o' `( c% R
                count_copy = buf.packet_cout;
( u, g& I# `0 b& _9 t5 v/ {" M        }0 i% J7 q! z4 |
        else4 R: h/ d9 t& P8 Y2 J
        {* S/ X) I! ~8 ?/ {; ]
                printf("No effective message!");  P+ J9 v. _& z; O9 S1 Z  U5 N
        }; d3 Y5 }- _/ k: F* u
}
* ~& S9 @5 o  \* `: E' U: o* C- l+ m2 T4 ]+ @
* y5 E% v- p: E& z: C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( f* o3 U) g  z5 X) Y/ H7 b+ |! }
使用下面代码,对内存使用了mmap函数后:
: f, S0 \  R8 t# v7 `#include <stdio.h>+ g4 _  @2 N/ H' e
#include <unistd.h>8 r( Y% e. Y3 E% o2 q" s
#include <sys/mman.h>; I5 v6 E% k8 S* H) _7 d! o5 r
#include <sys/types.h>
. e# Z3 u( E# X6 |( T# |/ |1 ]- z#include <fcntl.h>
" }1 ^" @7 D: }1 r8 g) i. L& i5 E3 ~$ ?# v
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- o$ P& k( J: `5 C" M4 D0 g#define SHAER_RAM_SIZE         (0x20000)   
( n8 ~5 ]/ s# K: j
0 o7 z$ q9 E7 @typedef struct
  _* a- Y! i; K+ n0 \/ x/ b$ I{
: ]* ~9 E( E9 ]        unsigned int a;
* U/ P: X4 e/ R6 q0 E& _        unsigned int b;1 Q8 l& L6 D3 a9 y& h
        unsigned int packet_cout;
* I& q, \  L% E! }* k. k" S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; x5 E- m6 y3 Q/ L

# \, E7 H( q1 r! H  q/ r3 W" nvoid read_MSG_buffer(int *baseaddr);" W( f  u' C% s) _8 {
unsigned int count_copy = 0;
" U1 Y$ C1 j6 F- M9 s1 z
5 Q; A* h+ r* S9 N. N0 `; ?1 Mint main()
% P0 T. g8 q; A( S4 u{+ e9 |8 [7 y1 w9 V% ~3 R
        int fd;
. f% d0 E! T3 Z) D5 _        int *mem = NULL;" x# ^! v% H+ i/ K$ {- t8 T
) ^/ D& B9 p3 C5 d
        if((fd = open("/dev/mem", O_RDWR)) <0)
* s5 V1 D, t) u0 K% k* F, N: E        {% V' e, _  B" Z
                perror("open error");
# h% @. s2 C& U5 n$ w- A                return -1;
0 ?* o+ m& F( X4 m: Z        }
/ J( a2 K2 W3 W1 @        & J# k' f+ c1 s& r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 h4 E0 M, ^' Q+ w$ ^- Y- T$ G  F3 L
        while(1)
  k; a* g* j1 r6 G; A7 p& R        {
3 \7 _5 x8 H; e                read_MSG_buffer(mem);
  h5 i2 c+ @9 K0 [# ^/ ~% }4 v        }               
3 ~6 v  c8 H4 _6 E/ ]  ~}
9 D7 O5 ^! {9 }: B: j: _/ y2 ~3 `! u# P8 @
void read_MSG_buffer(int *baseaddr)
/ `  ~. n( e' ]3 x! U7 {{
. i# f( ^  E& j; @" J        pRX_MSG_PROTOCOL pshreRAM = NULL;
! n+ r9 P  C: F/ S1 E$ ~* F5 ?$ r$ @# d$ ]6 ?6 M% i& Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. G1 `; n  L& K; [3 x2 U1 {1 J' M
! y/ x1 s* q" _; W- r$ W        if(pshreRAM->packet_cout != count_copy)
4 S1 F% Y& x' F/ I9 B# H        {9 \7 o1 A# R9 ]5 B" t) V6 T
                printf("a is %d\n", pshreRAM->a);
& }3 F+ I0 D3 A) P. Z                printf("b is %d\n", pshreRAM->b);
9 j7 P+ Y- O4 s                printf("count is %d\n", pshreRAM->packet_cout);$ a. D, O# n4 Z) Q
                count_copy = pshreRAM->packet_cout;7 m' p# @. B+ t- y
        }
6 |2 Y' N6 k( k6 a% h0 {: f' |        else
# ~" c2 g, S- S4 ^        {; X) Y; c' I4 h0 c5 t4 ~8 Q  c( e( u
                printf("No effective message!\n");
$ Y, T! H* ?. n        }0 o" m8 t8 q) }4 ?" W2 {! `2 i
}  d8 w1 i& Z2 E7 _/ G/ J2 m

9 `) L: [* ~+ @' p* x0 E' ]) @; o" c没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ h+ T; c: A  F7 }. l6 C; y+ O# a; S

8 U/ w- M2 ]; ^* k. Q+ T8 H- W9 V! g3 w* M# x  ?

+ T: `; @2 ?3 ]  \- ^/ t4 N0 a" p9 V" J/ P, n





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