嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 F' T# c& Z( I' D7 l( \$ T2 W

4 D& t  v+ P1 L- {7 l( q/ MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) N  c$ I8 M/ V9 D5 q9 U" j8 X( R
#include <unistd.h># p' s3 [5 W. X, e
#include <sys/mman.h>* J' b  V$ i( j" k  b, ^% |( S. C
#include <sys/types.h>6 F9 A5 N  ]' ]( c
#include <fcntl.h>
. z- T# C1 ^) H* p3 @. n$ i2 l! c" y4 B9 l( G: S' Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 K+ g, Z, B3 e
/ T& @& [- W- J, E$ i( E9 c) y% vtypedef struct
2 `0 R& y3 n$ c7 r/ M4 R6 J1 ~{
9 ?9 }2 Q0 c/ ], Q        unsigned int a;& }' W2 N7 G' Q) t
        unsigned int b;
: _3 O2 G5 a/ O, o6 A; q        unsigned int packet_cout;
) r+ J4 t3 S4 c9 |0 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& W: \% o. G4 {/ z6 J& k' i- O9 B0 a8 W; P5 O* B6 P  b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ o+ N& B2 v; E) f* _5 ?4 O: ~! v( l
unsigned int count_copy = 0;4 w, T/ W$ u5 h. J' H
6 q0 S  ]1 ~$ ^9 w$ I1 D7 V
  i6 `8 K, E- u! b8 ?! L, D" ]
int main()
; N, e1 j# h- J6 i{, Y% d  [# D  o: U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  Y2 w0 }* P: K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* U, Q1 I( `$ _' K6 Y
4 W  j7 j5 k, V' H6 y- p        while(1)' i: z1 H9 G* I6 c
        {3 x+ g# t: j9 T) B. @
                read_MSG_buffer(pshreRAM);. V6 Q! k2 z$ h4 h
        }                3 T5 T) N; R$ k# a- Q. @) F# e3 w
}
$ S1 Y7 }$ d5 |, F; ~' L# T* ]3 [6 T5 x5 w& ~) |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 f/ f! ^; r3 V# n6 X1 l6 z
{
4 V2 Q! v# g0 [( O8 i        RX_MSG_PROTOCOL buf;# A4 `" P: U" h5 a
        
6 B- f7 K+ c. U8 z/ P0 P        buf.a = pshreRAM->a;# v1 P! x2 O( }
        buf.b = pshreRAM->b;, J# `# X' M+ [8 L) \* u8 c
        buf.packet_cout = pshreRAM->packet_cout;& {7 l1 K5 J) U1 r
        
( @& n9 L& c4 |! o, \4 o) S        if(buf.packet_cout != count_copy)) j) _9 |1 Q0 k! H) O1 `
        {1 B9 s$ |6 ^  C8 t4 H" ~) ^. |
                printf("a is %d\n", buf.a);, V# N7 M  ~( q5 Z6 @* P" C' Q
                printf("b is %d\n", buf.b);& `: U, S* i7 p1 r" M2 X; s
                printf("count is %d\n", buf.packet_cout);
) m( z, M# a7 E2 Y                count_copy = buf.packet_cout;/ ^% h8 e$ u+ k! I1 y, X
        }
' y' L& G$ u7 r        else
8 Y! k# Z3 }: n        {# L- g  `7 [6 E" M' A# Y5 X6 ?, @, d3 e
                printf("No effective message!");
3 i8 ^+ h( b0 J, Y        }, n3 t* N7 H/ B% H$ R
}! l; `9 j0 O% X2 h& Z
2 P2 {9 e/ ]1 g. w5 ^
% j: `" E; G3 O9 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 j: `+ {  o: _. E, i
使用下面代码,对内存使用了mmap函数后:
+ Y% X, u/ ]/ l7 ^/ B#include <stdio.h>5 q  _* z, @9 {) A2 P# k
#include <unistd.h>
9 h0 R4 S6 O4 D' @1 C9 c4 K: m#include <sys/mman.h>- t6 V% F  i# _
#include <sys/types.h>
2 }: j1 L- W: F+ J7 P! ?7 x#include <fcntl.h>
  H, ~3 A+ b: S7 y8 e, _7 s/ t0 X+ B+ j. Q8 p% O
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# g& i3 L$ i; A#define SHAER_RAM_SIZE         (0x20000)   6 {! @( w; Y% f3 [2 n5 k

+ F2 P) v9 d3 f) c4 g  _0 \) Jtypedef struct
; g( o* ?6 l4 d' ]$ _, J1 A& Z! W( W{, p0 G6 J5 b; Z3 T
        unsigned int a;
6 H+ M( o" W* ~- z, p        unsigned int b;
. O- A% O8 u* g# F' l# L8 M$ A# P        unsigned int packet_cout;
0 h3 ~( h, F! r# R, a. \' \1 q' U- ?}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 `3 m+ o' Z& z6 S, w+ I; _9 K4 M
; s6 `3 r: z6 O, D6 d. C% Y1 w3 Wvoid read_MSG_buffer(int *baseaddr);
# t6 f7 @) f, hunsigned int count_copy = 0;# ]6 _: f4 D+ Q) }4 o
; [) e( N* r1 w5 b
int main()
$ A' Q6 I3 b/ W7 P$ x# a9 o{
/ L! Y6 b0 `, U' |% G        int fd;
+ F2 y% y  K# I9 Z" j+ G) n3 `        int *mem = NULL;/ V# S7 ?% Z0 {; ]
% p: Z2 d: v* g- o0 `" D
        if((fd = open("/dev/mem", O_RDWR)) <0)+ e8 h4 I- w- ?$ N6 [
        {
5 z8 W' E9 j* D# D/ n2 ?                perror("open error");
( i2 s0 t: S, o                return -1;1 u/ X( X1 s7 s3 T
        }2 N/ N6 `4 K, z! Z$ F( a
        
, n( e9 h6 E: S8 h0 O: J; R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 X& Q9 c. C3 m. q* s. Z4 f

( ?, w' R' V8 j) J        while(1)
7 ]. O, G7 O, A) _2 r% o7 l# N2 Q        {
" i, Z! i1 \/ J5 Q1 F                read_MSG_buffer(mem);
& h# @; X& s% L) k2 N- g0 P        }               
) e/ B' E3 y# A0 q; [* @* y" L}! c! c8 Q# `7 V5 J" W+ Q1 t$ N
+ x5 v6 P8 }) ]( G9 v9 h
void read_MSG_buffer(int *baseaddr)
' n, t5 R) q9 D  G  ~- {7 a{" a! D8 n/ V5 r
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: j# d. ~" z! G/ P$ M8 k
* H8 y( m4 d9 l6 u, U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k  d! O$ Q; T9 D* u; T

7 M: L  |3 M( _) h" R/ w        if(pshreRAM->packet_cout != count_copy)2 z& V& b: G$ z# m5 [& V
        {
7 _3 ]! G) Z) g, x& r                printf("a is %d\n", pshreRAM->a);0 S5 r8 v9 s7 j, x, V
                printf("b is %d\n", pshreRAM->b);
$ E3 q4 }% p* t6 H1 f                printf("count is %d\n", pshreRAM->packet_cout);; G' b/ U: q6 g0 P* B
                count_copy = pshreRAM->packet_cout;) _" {- k' d1 b5 V* W4 b: }
        }
3 Z& J8 S; q6 S& F1 y        else
7 I- P* K. t) i3 Y        {! `! k  i3 a+ S/ T; N. u, f& p
                printf("No effective message!\n");
* k! g5 M' @: b9 N        }
6 [" c, q( R& K  j5 B}
1 q' _1 j* u- U1 x1 E1 F' |! w+ j- P  p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 T2 y1 h2 a9 T' i2 a
1 A5 r/ y& @* n% T3 w5 I* T0 U$ `6 O& G- ?+ s& g0 N; \' @/ s! Q
8 w8 ?2 }% g, J/ k
. O/ i3 w! p8 S* I* {! x( @





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