嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 n9 z+ K$ v- {8 Z9 m7 l1 I( k( [  a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( P. a( o4 V' t: V' N4 e# Z" D8 \
#include <unistd.h>
& ?* G0 A! b2 a% d6 c, h+ w#include <sys/mman.h>/ k5 ?! V8 E5 b" S
#include <sys/types.h>5 ~5 l+ n$ Q* y5 R2 p
#include <fcntl.h>/ V* h! N( o6 m/ z8 q& f; J2 F2 v
' p4 i. Z' j: v, b$ E9 u2 n) ]8 H
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) c1 ?) r& P: m, w
4 \# x" z4 V! X- @9 C
typedef struct; n: B. W8 g' Q
{& K* w- L* |( w' l8 u
        unsigned int a;
0 x& x# C+ K( ?. n2 u        unsigned int b;
8 t, L+ V. ~( a* u+ D        unsigned int packet_cout;2 T) @. Q- J. s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, G0 |0 L- Z( e7 @: x, _
: N' [0 Q/ a/ Z. A6 y3 ^; v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ @9 H% B# Q& o* \% b" T
unsigned int count_copy = 0;3 w: h  t* w- k! R

8 x5 Z/ H# v, v1 R$ b, L( {: b' `- x# T8 U# e- s& w
int main()7 |9 A6 R) I* H6 L/ m; b4 f
{
( U+ C: ^; S! q6 ?6 T& C  O* p        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 k& j* Y6 N( c3 a  D4 B        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 S" t8 l* u# _; ?7 o' q) \/ z
9 l: B9 h+ L  P* c
        while(1)
8 i* w! Y3 k7 k& M. x1 r$ G        {
+ a7 K9 H  E# O1 I                read_MSG_buffer(pshreRAM);  F" A+ w% X' w( T  P
        }                  C) E) ?( E3 n2 q$ k7 |
}
% r7 d  H5 ^8 v9 B& {! ~  L5 U
% k. M3 P* e6 R9 _% B* ^' @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' }3 p4 i8 a2 Q$ V
{
3 n8 C. G( e" |! T/ w6 c, d# w        RX_MSG_PROTOCOL buf;
, ?  _! U5 F3 l4 s' }+ i1 X        
, A+ s' c0 O) {5 s7 {; i/ ]        buf.a = pshreRAM->a;
8 `5 h( o! s7 N3 I+ O; O        buf.b = pshreRAM->b;
. ~% M9 w/ `/ D6 r        buf.packet_cout = pshreRAM->packet_cout;
0 i: z6 N# t- z- t; z' {  A        
, s6 Y- h  Y. U! d        if(buf.packet_cout != count_copy)
/ W+ E7 D. K2 [6 D7 [5 l9 v        {3 W, T3 F! H5 }' R6 [
                printf("a is %d\n", buf.a);( e0 I2 W; N! o  p' C0 l
                printf("b is %d\n", buf.b);( J4 m. d& |# j) j) m
                printf("count is %d\n", buf.packet_cout);
' h6 I% J+ ^2 q5 f1 g7 Q5 O4 v                count_copy = buf.packet_cout;" P& t' ]! n2 Q. P2 o
        }
( a" \. }6 [& e) d; P$ s        else- e9 {0 I( [. {) K4 W- m
        {5 C- Q/ b0 n) U7 R1 B: Z
                printf("No effective message!");% M- D, P) o9 P$ i* t0 P8 k
        }8 v9 o. ^* i- _  W7 k
}
9 S0 h' R1 ^* e0 t& j1 V9 h0 x+ ]6 s* |4 H: T$ X( B# Q6 m
, M8 o! \! F* O$ r! r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ f% l' s1 Q( U7 |. e% y
使用下面代码,对内存使用了mmap函数后:4 g% f# o! H2 ?
#include <stdio.h>& _  r0 s/ M8 x$ a( B0 \9 f
#include <unistd.h>/ l# W2 D( g2 Y) O! s
#include <sys/mman.h>
  N% v) f& K. I5 x) [( |: e: f#include <sys/types.h>; F( a0 \9 x* r. A1 B
#include <fcntl.h>
! N; ?7 a$ ?7 @/ }( N4 [
/ K" @: o0 [9 ^3 m* V+ |; n  \3 t2 m#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 |7 E% w4 D5 C3 ]6 i#define SHAER_RAM_SIZE         (0x20000)   
: ^( b$ d/ [6 P; S! c. u. [
; W) U+ `* Q, I% ^, `: o  L4 N' }typedef struct
" m8 ?( O7 _- S% z8 ?! Z+ E! m{
. \% d% t& D- s7 E+ w" |+ G        unsigned int a;9 R. A5 D6 {) w% p! D
        unsigned int b;1 t  |+ M" k  R  ?& R4 f! n
        unsigned int packet_cout;# w' p5 C5 R; ~# S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. i6 w+ z; W! z7 J& y" u7 B
  \6 C( ]6 T" C7 v% @+ J4 g
void read_MSG_buffer(int *baseaddr);
" J5 N9 W$ [' ^9 wunsigned int count_copy = 0;
2 s; A/ `/ B6 U( P* t2 }& ^4 [  N+ `( S5 Z9 ^0 u& L& Q. c) ^, `9 X' O
int main()/ A. Q* O$ d% H& D2 J
{, u8 a; E0 _$ D8 v- {. w1 z9 {2 `
        int fd;
! a: W) r5 ?* z8 d/ Z. K& `) \; S        int *mem = NULL;
% S# N6 i' E4 Q, K/ Z- f0 f! f3 u( O8 f# G8 |
        if((fd = open("/dev/mem", O_RDWR)) <0)% t* }# T5 [7 r. S, l: U+ r' e
        {8 ?) l: ~3 H1 w/ I7 ?  C3 a0 A
                perror("open error");
% s3 ?( @4 T. {: a( o: A* k                return -1;* Q. ~' x+ \$ U* k
        }- o0 W, \8 T3 S+ r/ W& f7 _
        
0 A- L3 G. C# ]1 R7 A2 p2 o, t" _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 P* e( d+ C$ z+ t* D7 c( [2 ]0 A
$ E- |6 D8 B- j5 m! e1 l
        while(1)
, |+ a2 G5 a+ ~# e" k4 r2 K; [/ ?        {. ~% c9 p% c( g/ V( O, ]
                read_MSG_buffer(mem);! u+ Z9 r  h, g1 I7 T5 Z
        }               
* V. i; t' E" @/ o: z7 @}
6 n" f5 g) g4 c# F, V% ^
, T5 q0 d6 _1 U6 D$ |void read_MSG_buffer(int *baseaddr)
5 y4 A5 o# }6 }) j7 w0 @; E6 F  }) b{
# D" [7 B! }" K( E6 A        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 [/ V! }- v: i4 p
: y3 b1 K" j$ R$ s/ a2 J) J& }& d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 {0 F% V* h0 h) H
8 z/ R. L8 L& d/ ~; w        if(pshreRAM->packet_cout != count_copy)
# o( n: v9 z, c        {
+ Q7 C; x1 @  N- B1 j* e' h# C                printf("a is %d\n", pshreRAM->a);
. m! v1 ~4 o8 m* G+ P                printf("b is %d\n", pshreRAM->b);. G( I7 m4 f- r) h; d2 j' W: R
                printf("count is %d\n", pshreRAM->packet_cout);$ c! u' i& ?/ [! Q3 z4 d) c. Y3 c* n& d
                count_copy = pshreRAM->packet_cout;
$ @# T4 F& F/ h: e5 ]% {        }6 t6 q( L9 \/ c4 B
        else/ Q7 F# d) B" g9 w4 n
        {1 _4 I. s: \: l" z
                printf("No effective message!\n");6 F; `. v, n& L+ s% }
        }1 R) ~2 B7 L& l' \) y: G- T
}
0 G+ B( _2 ~$ V& l/ O; x  V2 \! V: i2 V9 X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ Q3 Z4 L9 r0 x6 o$ {- a: g. l& o

. N# g) z- h; G9 Y$ q& D' w$ ~5 Q9 K6 N, D' {
; q1 {# r1 v* ?: B3 Z3 ]+ K% g6 `





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