嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 ]3 F2 l% ]/ t

8 F' S2 c2 ~( ^4 K4 M7 ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% r$ P, ~. r, ^' d#include <unistd.h>  C3 P2 z" E+ C' \6 Z$ c
#include <sys/mman.h>
0 I& [+ `3 ?8 z9 G+ p4 f& Z#include <sys/types.h>. K# V) f8 ^! Q' |$ P
#include <fcntl.h>3 q: ~- c6 _% Z  X" s

; \( l* x  F' g# e' G, |8 H+ T#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  j  b* D( {$ x5 q8 p" R7 W4 f; q
( O( b: N% i) L1 O$ Rtypedef struct0 }& V) x* }0 F0 e9 ]
{
0 @4 v. {* V# V        unsigned int a;5 u! L2 A: o8 v
        unsigned int b;
6 E& K4 D8 F3 T        unsigned int packet_cout;# I0 _/ ~( q* p* {- ]& ]. L/ D5 O% d0 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ ^3 ]  X8 R: ?' M, `' d) G2 m
) z1 F) u+ ~2 I- B2 e( s$ q4 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 V/ {5 g/ L& O- @. Xunsigned int count_copy = 0;3 C& F, E9 v, b7 [1 H1 @% S
5 T. G" r6 C5 e' V* M6 N. s1 @

* V% a! {: R7 G7 sint main()1 I/ X& V7 L6 t$ S; _# O8 _
{1 V# o1 c5 P, N
        pRX_MSG_PROTOCOL pshreRAM = NULL;" N3 T2 H3 R; k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' y; H! P4 E1 _6 [9 B

$ ?* b) b3 j4 O. x        while(1)1 Q1 G# m/ s# Q' `7 v- t  t1 h3 ]7 {
        {' K8 q- I! Q+ e7 j; q* t' D: }& S2 C
                read_MSG_buffer(pshreRAM);; j, V) l- I9 E& U2 a  @
        }               
0 e  `: ~( g& @) b}) Z6 S+ c+ S" B; O3 X& k; A. L
# J* ?5 }5 }$ l3 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% m9 H! E4 P" g  q# S0 S% V, W
{8 x& t8 g+ {2 J: u2 k! T
        RX_MSG_PROTOCOL buf;
8 V( E+ k+ {- C: J: K  |        
3 P2 P, I/ J! l4 w( }5 S        buf.a = pshreRAM->a;
1 ^; z5 k1 Y+ g        buf.b = pshreRAM->b;2 D" j; d0 ~+ @! u( I
        buf.packet_cout = pshreRAM->packet_cout;+ _4 l) e# u8 M8 n/ ]# U
        6 J# m! R7 V; o4 n; X# L
        if(buf.packet_cout != count_copy)9 M! k" J' K* j/ {, ^, N5 ^9 M
        {
( G4 p8 I! y* o& W$ Z, W$ j                printf("a is %d\n", buf.a);
; h- t! a" n& R& L$ k& w0 O                printf("b is %d\n", buf.b);
! A/ j' g+ b4 T$ u" G; l                printf("count is %d\n", buf.packet_cout);
! N7 E6 G/ L% m. O                count_copy = buf.packet_cout;
" |+ F8 D; K0 M9 k        }
+ \6 [$ I$ u" T7 g1 V4 `        else
2 W3 l( I) X  z% @6 D        {
9 o, m! t  }3 t7 `* [) d                printf("No effective message!");- g6 K! I( [! `& R6 c) K
        }
) z. _0 P$ s/ Y9 O}; [# P8 r6 @' }7 S! O& k
% Z/ l% b6 t3 I5 \4 b9 f1 S
; u: n# `9 r& Y: W6 w1 |' y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ O" f2 k( _) l$ N0 p
使用下面代码,对内存使用了mmap函数后:7 o5 F5 {* X9 h" S6 X
#include <stdio.h>( I! I1 F- z5 B7 N4 D* n* p% D* q
#include <unistd.h>6 i" K1 ^* H) ]. ]3 j
#include <sys/mman.h>: X/ n( N' l5 W' i- e
#include <sys/types.h>4 Y3 k% t: v8 ^& d! K' }( r
#include <fcntl.h>
  A8 w3 A5 o2 Y6 M4 M9 E
% J2 ~- X9 e+ v) Q#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 c& d3 M& T- E9 H; b#define SHAER_RAM_SIZE         (0x20000)   
# T0 }. U: J  {6 o% Q" R1 R5 N( s4 D6 l: b- u
typedef struct
. x( X! W; f1 T% e2 H2 L1 l. b* ?  a{
! w8 ], `3 v. y0 S& S- K        unsigned int a;
. U( W) r9 f3 f' j- E# u* X. ^        unsigned int b;
7 i& j3 X! W$ o$ S( s  ]9 s4 O" Z        unsigned int packet_cout;/ i5 }' P: O$ G- F% E* v( C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! P, r/ I7 M* e) o* q: L- _% E7 }! X; T
void read_MSG_buffer(int *baseaddr);
- e$ }0 U- l: z2 aunsigned int count_copy = 0;
2 L' R% [+ e8 Z* Z# U8 M  B: ]  B% Y8 \4 X5 x6 ]* _* Y
int main()
4 _9 I1 }8 Z1 x. G5 T' ^{
3 f8 I& p. F& S4 T- B        int fd;4 e' [, Z0 \& {! Y$ v) _8 `
        int *mem = NULL;5 i, |+ |: a6 f7 }- }+ J! u
2 A( N! m$ M* `, O2 e" W
        if((fd = open("/dev/mem", O_RDWR)) <0)# ~) m6 N4 y6 {( }/ i
        {
! }( f- j8 w. E& ^4 j6 H/ V                perror("open error");
0 I/ E+ S# c* E3 N                return -1;
) I/ j+ ~% a# _3 j' j        }9 \  k  o' L3 X$ [2 d" n) R: K* t
        
* _$ r) G/ _# N- [* N4 L        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 `2 w1 O0 f$ I
- W- R/ e/ k9 ^# v. ]6 \
        while(1)
: f" b  G( a/ f4 ]8 H        {7 D) K( ~* N3 b4 H2 [5 y
                read_MSG_buffer(mem);
, A1 x6 w4 B+ s$ |: F3 u4 }  e        }                5 V2 S' ?4 W: @4 t* K6 d! B
}
, s! |% c* X' l* ~
1 v, q3 I# F0 Z( Z. jvoid read_MSG_buffer(int *baseaddr)1 X9 W1 T$ R3 v' ^5 ^" A9 j& f  C
{
0 f3 C9 b) O4 g* W        pRX_MSG_PROTOCOL pshreRAM = NULL;. r0 O+ S5 R- i

' j* Z: M, t) B" W5 b/ N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" h0 z9 z& n3 ~2 }, U5 J' z

/ r$ L% ?4 Q  c0 u9 J        if(pshreRAM->packet_cout != count_copy)
# R' z; C- W$ Y; Y/ ~        {& y1 h1 o0 E) B; v- w3 _
                printf("a is %d\n", pshreRAM->a);
- P+ F/ U7 U( v5 |                printf("b is %d\n", pshreRAM->b);
1 @& }/ F8 y; h8 [' z* M                printf("count is %d\n", pshreRAM->packet_cout);
& i2 x, i+ l' n" z9 B4 }                count_copy = pshreRAM->packet_cout;
7 z: l4 Q# K, \! K& F        }
2 _2 b: Y$ z1 _: o0 M  o! I        else
: H: h$ i+ |! c' ]        {
- |" ?$ l1 c3 N                printf("No effective message!\n");
% N  c3 J) D! \. A* E1 ~. ?2 ]6 D        }* [$ p2 f/ [8 c) C3 Y1 n6 z. S# R
}
/ I- s" t3 n, Y$ F9 N3 w& q1 ^
& ~& a: z$ |' O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ T) w( x. k9 ?  \" A: ~) @6 j' r. `( F/ t6 K
; t7 X# ]% R  [, q" W. ]* P2 q5 }

( T4 ]$ z2 g- _; q' Y% b3 t
; b( G3 `, ]. c: A4 D




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