嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 V5 k! H8 }! S! t4 x0 I* {
- z& n6 g4 c. }, n+ ^" W. {) E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- h1 u. _* y0 ^5 {" s  \0 ^4 U4 E
#include <unistd.h>9 [4 y% Y+ `) d, v0 z% [2 w, Z2 G
#include <sys/mman.h>
6 w1 M. c( Y3 B& J9 g9 o- x#include <sys/types.h>( G0 u6 @) j1 A- U. c; y2 h
#include <fcntl.h>
- \- }- ]6 T3 p
/ W. W. O( Y3 ~6 z/ c% k. }; b6 u#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 g4 U& E( O, I+ k, f; _: \: |% k4 i- ?4 j. m8 l
typedef struct
$ ]! u9 Y" Z; E* }+ m$ s: j# e" v, \{
* c% U$ P1 Z( X2 i$ C5 A. J& V( N        unsigned int a;% y' Y# S) }' e3 s7 \* ]; ]7 A% `4 Y
        unsigned int b;) j' U) b: I3 R
        unsigned int packet_cout;, D0 i: h# Y# |* G4 {) _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( B" f: G8 \; F1 F
- Z( `( e# {  L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 M1 o. g1 g, G8 g
unsigned int count_copy = 0;
  x7 T2 k# B' Z- w2 Q' ^$ y8 C6 O- n9 v4 E5 K  G: ]
" X+ H  T: x! k9 u9 f- F5 U2 [
int main()" ~+ r/ w. U2 O8 V- |# Z
{
5 V; H8 E- k5 `% L* q1 W        pRX_MSG_PROTOCOL pshreRAM = NULL;) M/ T' @* R& H# o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 ]" R( o; T" l, g" b" i. X
& ~# f# m5 i7 g$ w
        while(1)
0 K' S2 C" c& [- H0 Y        {; {0 h0 h6 C! u  ?6 o4 g/ J
                read_MSG_buffer(pshreRAM);
" N5 R* h$ @: D6 L+ O4 |: U8 a1 e        }               
, i; O2 @7 z# ~+ }}9 f, C5 `! H/ P: \# d
0 |  O" }1 q6 o, d8 m+ x& \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 v5 S8 O9 f# s$ m& E9 }) j3 l6 y{; ]5 d7 j& b* W* p" s
        RX_MSG_PROTOCOL buf;
1 A6 h% U: b. m/ U  `: D        
2 q6 [8 q0 |$ s        buf.a = pshreRAM->a;& f9 W# ^2 E4 J' p$ ?
        buf.b = pshreRAM->b;& M, @: E, \  R" K7 Y' B
        buf.packet_cout = pshreRAM->packet_cout;9 E: x0 P" ?  X" E6 y* I
        ; z; {* l5 w) j' v
        if(buf.packet_cout != count_copy)
" C0 w! u/ k' T" P        {; O! Q( Q0 w, q8 B6 K
                printf("a is %d\n", buf.a);
8 R6 w3 y0 M: W+ W2 i6 n                printf("b is %d\n", buf.b);# v$ d) L- x4 q5 ^
                printf("count is %d\n", buf.packet_cout);
# @' A1 y0 G: C+ T5 f' \                count_copy = buf.packet_cout;
: B9 ^8 U5 W) }* w3 d2 p        }2 j' ]0 G+ v3 R/ `, I% i' P
        else. ~0 m: [5 Q0 Z0 S: F/ w
        {" I. m$ |6 n7 e, u* |0 L" ]
                printf("No effective message!");
# \$ V8 \1 o' `1 s& B        }
' ^5 H- v( O3 x% C4 _}  T0 h2 n$ j4 ]* Y& n+ q5 d4 }' x

% y# \: _3 Z% B1 c  V% C( i9 }( S6 j9 d1 e* M) u9 C6 D. I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. ^& B' x) r( o( c使用下面代码,对内存使用了mmap函数后:
7 n) l& O' l8 |( b- L#include <stdio.h>
: |+ s4 E) l: o  X9 Y9 L#include <unistd.h>+ H! Q5 ^; B3 t. G
#include <sys/mman.h>9 f/ o9 \/ }/ ?( N( ]2 h
#include <sys/types.h>
: T; I4 n9 z$ [/ K+ x. S# ^#include <fcntl.h>+ k: M1 a; d! a5 |5 U- }
! h( {8 d, M3 ~, F' \
#define SHAER_RAM_BASE_ADDR    (0x80000000)* Y+ u& P/ [# u% ]. o
#define SHAER_RAM_SIZE         (0x20000)   
1 T. J3 V( l) g: p" E6 C( T4 z
/ G( N# H3 k0 ?typedef struct
" _. c/ j# Q* v$ s7 Q; P2 d{7 R5 b/ E) n; ^7 v* F/ D# c! i
        unsigned int a;" \. ^$ o1 x8 `" |0 c- u
        unsigned int b;) R: B0 b. u  E- b! J/ B: B
        unsigned int packet_cout;1 Z" G0 p9 Q" t" k7 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% \* o# L! r4 ~. T8 f$ z! U( x7 p, I2 Q, t% d1 o
void read_MSG_buffer(int *baseaddr);1 V8 P. U) {( y
unsigned int count_copy = 0;
% J$ n" M$ G% s* H9 R* j- o* Z
7 @! B* X, e! o/ X  pint main()
; @# f7 A6 Q" O2 {{$ \6 A" s8 o5 f4 h/ N% q
        int fd;' z4 s& H- L, _" R9 Y
        int *mem = NULL;6 x  l' U, s+ {
* o& f1 E% ?9 F" S9 P: I
        if((fd = open("/dev/mem", O_RDWR)) <0)
& {% r! E8 `* k        {
, I. Q6 H+ [' h0 g# S/ U                perror("open error");
! Y7 L0 K0 S+ o9 \5 M                return -1;
6 D: r, J+ _  O$ @  j        }4 K- N! t7 Y& \1 }& C# ^
        ' e  F4 N4 G% q. x! w
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: s9 \. d+ f# b
9 F( Y: V, C% V; N: j5 n        while(1)8 N. x" v) `8 K2 e
        {# V( {: e0 u' C8 n8 v* ]
                read_MSG_buffer(mem);
6 V- ^- H' L4 V3 L. R3 t, D. I        }                $ G" O6 ~/ |& q3 S
}
" \, ^* g" V3 K2 S
$ h, L2 C* T$ Tvoid read_MSG_buffer(int *baseaddr)
  u( r' e3 ~: W! f, I9 `  u{- R  R: g  \8 k% G1 D& z
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 I( d9 A8 u, k" H8 r( n! w: h

* d- l% t, n. j2 ]+ F9 {        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; y9 t3 A$ z( }2 |

, G% b9 K1 f6 W8 m        if(pshreRAM->packet_cout != count_copy)
! j; v( m" V( `& i2 C: A  E% C        {
9 t/ m0 V5 G/ }                printf("a is %d\n", pshreRAM->a);9 R  e6 o; @, K' S3 U6 C) K: W
                printf("b is %d\n", pshreRAM->b);
. ^* D5 I6 Y- g                printf("count is %d\n", pshreRAM->packet_cout);
7 v( b: A9 n' h, x8 L$ N: M" l                count_copy = pshreRAM->packet_cout;
. C* s/ M3 v& l3 d7 k% N% l        }: m5 c2 J8 |/ S/ K
        else3 ^2 h  Z% Y( a! Z
        {! p! Z5 C+ Q  @* J
                printf("No effective message!\n");
# G6 ]0 w2 ]: p/ \+ H9 k( a- d        }2 S9 n  u7 L2 n1 F5 f
}
% W: G6 e2 m  W; I" g4 D  t1 P8 H, {( ]( _# B/ f- M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) x) }6 S% }  n& _

" D: o! S! q* A! b" D% P3 ?' n. z/ S$ L) P+ _% C: G7 p
. ]" e% U: v2 R* y

4 g+ u9 f  g9 A  g




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