嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # `( V. v- D8 g3 B; B  d8 p

# k4 C/ P& @2 u) t0 eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ ~& u0 J" }( s" [
#include <unistd.h>
3 J1 L7 K: ?0 h0 b8 W#include <sys/mman.h>
' x# Q; h% t! w8 u6 L#include <sys/types.h>
7 x. A  _, k, C4 v  E* o#include <fcntl.h>
2 s/ }/ ~" k6 ~( H7 U7 H
$ B$ n9 `8 _9 x+ s$ |4 y1 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 k1 _; p  l' \1 ?: V/ I! z! d( t( Z+ W7 u4 T9 i
typedef struct
* F$ v' U  x' N6 f* M) `6 p9 z{
8 P0 E0 _( b& I1 [        unsigned int a;/ s6 ]( w: R4 {$ W/ N% C3 h% y+ V' S  v
        unsigned int b;3 B; r+ b. D3 {# a. ^# h
        unsigned int packet_cout;
$ J! u9 t$ W" {) q- s1 H% k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" ], @9 D+ Z7 v& y7 N

# p' ~8 w* \4 e9 U3 P/ e+ ]( {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 B$ n4 O+ P1 ?2 e6 h& `+ E% v2 c
unsigned int count_copy = 0;
2 Z, d% N% R9 o% l2 G( V! s- _8 U! U6 E' N2 ~, }6 A1 _0 w

# B1 U. b8 i  R# aint main()$ ?8 P$ b2 Z3 q5 R8 i
{
* O& V# e7 i( x, G1 H$ q+ i! N        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ q- {* c/ w7 ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: K8 R( I" P- Y+ @! k

. @* a8 ?$ P- _* E4 I4 D$ e        while(1)' @. `: k- _+ Y+ h2 V
        {0 ]% j7 X1 e5 b7 r$ E
                read_MSG_buffer(pshreRAM);: |) w) R" e2 l# `3 X2 z
        }               
( e6 F+ D6 ]. e4 F4 K}
/ h. ^2 o$ j  Y4 ?  y$ c1 A  u3 U6 a1 L% f8 g1 p: r0 q6 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 k! n- K( @; D% W) s& I
{
/ L1 N4 j$ H4 a& n5 c4 j1 D        RX_MSG_PROTOCOL buf;5 J" J! v. {3 @% V
        
' L  G% W/ ~) d, b: T        buf.a = pshreRAM->a;
  O2 _! X( w4 s* L( |+ ^$ K        buf.b = pshreRAM->b;
, _7 v  G  S6 v. R, A5 @        buf.packet_cout = pshreRAM->packet_cout;/ h5 \& E5 E5 j! H) w6 L
        6 I9 ^1 b: }- H
        if(buf.packet_cout != count_copy)7 W6 w/ b; X3 |  a2 z
        {
$ j4 x5 v. j/ v4 u                printf("a is %d\n", buf.a);
- j( [, w+ P/ F& [8 u                printf("b is %d\n", buf.b);
+ Y. ~) b" f! J4 {6 t. p) I: v                printf("count is %d\n", buf.packet_cout);
  T$ `3 K/ G* u' h! n) L  [                count_copy = buf.packet_cout;0 K9 L: B4 j* ~0 f( [8 C
        }6 o: U. s: Q- `. a% V7 l$ E/ c
        else, N7 H9 H! y; I. {" M
        {
0 N/ W+ E/ @& j9 {5 A                printf("No effective message!");
& I2 S7 V4 [5 [1 S/ B2 E. h        }) M6 X4 j% V: y+ s: w
}  _0 o( R3 g$ @! Q" v' P8 p) N# w
1 T) d1 D* t; e7 q" d8 S4 a
6 C# ~3 z( U) D9 u  w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" |& h. \; _' M6 t0 c/ i使用下面代码,对内存使用了mmap函数后:
( }4 R1 ~5 ^$ R! I( }#include <stdio.h>
% y1 Y) H( x& E3 |#include <unistd.h>6 t' N. R" u5 `- @
#include <sys/mman.h>  w2 z8 s1 a$ ^+ B
#include <sys/types.h>
7 y8 y. {  `7 r$ O. x% P) G#include <fcntl.h>7 H. d! l0 W5 E# q* B

7 {; r+ t  z! B#define SHAER_RAM_BASE_ADDR    (0x80000000)6 b( m! l( a! G) r5 A/ a( `
#define SHAER_RAM_SIZE         (0x20000)   $ g5 @3 d$ e: }) l# Y
& X8 G/ l  Q! n( _
typedef struct
1 Z& m4 x' k. s2 C{
- U6 W- q( C8 N& D2 D( ]        unsigned int a;# z! j& B6 i& j% b; t6 W" [! K
        unsigned int b;9 U8 L' g# l: I6 S
        unsigned int packet_cout;( ]3 d; Q) j- Q! F. L3 k; q# n5 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. n* i* E2 v. x" m3 ^* _( n) `+ l
8 y, k4 J3 P' e* T) X8 Nvoid read_MSG_buffer(int *baseaddr);8 \) @( S2 Z4 P1 |! J4 F
unsigned int count_copy = 0;
  ~+ t, M/ {8 Q. r. F
" a7 r( [& ?3 M+ pint main()
0 Z$ k# ~" G; \{' s4 f. }4 R1 O
        int fd;" ~% u( D& ]0 y0 f5 x' h& f
        int *mem = NULL;
5 [! ?& r8 U- u/ s2 u4 ~8 G; Q7 ?7 n, T- Z
        if((fd = open("/dev/mem", O_RDWR)) <0): X' H% e5 @9 L
        {
$ y* w7 P5 B+ B* [                perror("open error");& c7 K9 [! O8 \
                return -1;
0 d% t0 e( U( @: ]0 S' r% a3 k3 X% z        }
; f8 g( a: g0 m4 M9 t. e0 w# k        
- X, @6 j3 f8 g$ L- x) T        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. o' q  P6 e# N' ~# Z. S
2 l8 Q3 ]; J: K' D- B0 O! |
        while(1)
* s( O# F, |: v( s" |* c" b        {0 h$ `' [) A0 D) `
                read_MSG_buffer(mem);" B" V% {8 m' s
        }                ! M1 g% ^. ~$ `  S' G  @
}
8 k/ N: a- v& G2 {6 Z# ~: a4 o' R9 ~
void read_MSG_buffer(int *baseaddr)1 u& M$ r1 u" |+ Z; P
{
, `2 A. m' r( D- c2 n2 b        pRX_MSG_PROTOCOL pshreRAM = NULL;
% w* w0 g, p0 v7 h! b: z; ~/ V2 E6 b* y9 r8 }) K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) G4 s- K2 }1 L% o" d1 v# Y( e+ x: S( u4 [  q, E7 c# N$ @0 F3 ]9 z& g7 k
        if(pshreRAM->packet_cout != count_copy)
- L& H3 t* u; D" V3 [0 i" x        {: F0 t% q4 a: m0 P, n$ f# I( C0 G4 B
                printf("a is %d\n", pshreRAM->a);
  \; T; A" O4 ?2 r                printf("b is %d\n", pshreRAM->b);
' |8 I+ B3 p/ f; h' a& a                printf("count is %d\n", pshreRAM->packet_cout);
! H( R. p  q4 N# @% c                count_copy = pshreRAM->packet_cout;
; |8 `+ ]4 |8 d8 \+ n( r        }2 a+ g9 J$ D0 o* J+ u4 T1 a* s0 ^
        else
( e( A2 {0 Y- ^' r$ K; Z9 ?        {) f( x: K+ l5 d
                printf("No effective message!\n");
3 ^6 D  R6 k2 I6 O/ Q, X        }7 |: f. F8 x2 y6 y- B. p# L7 X: o
}3 j9 `  Y" q9 {
# [% `  Z8 I6 H$ P. u/ h  D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 g* q* g# |' W4 q8 P

3 s3 a$ D: a4 {$ m8 P; ?, L
' W+ d0 R* e% H
- r1 B% B3 c, p% I' l; ?' Q9 \6 a: f2 [% v9 n





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