嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 x# I& d" _/ F: x( T, z$ f* F4 {( D. ~" v; B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; u) [4 Q, E8 X# g#include <unistd.h>
( G6 D7 r1 i' s4 Q7 Z* B1 p#include <sys/mman.h>
& t; r/ T! ?% L% y' Y* t#include <sys/types.h>- o, ]7 z; h  ?) F
#include <fcntl.h>
% Y" O8 [% A9 U! m% y1 g% U) a3 Z$ I0 k) F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- f- M6 \) d8 P2 ~& t& ]' c, R) Y( X! q( x1 O0 C1 r
typedef struct
% J3 z  G) G3 [; t, X+ e! X{
% f& a+ b4 w  S6 ]        unsigned int a;% I" x  ^. f4 b  }, O" k: X+ ]
        unsigned int b;
! A' c$ j3 [- j: ?        unsigned int packet_cout;* d( d& V; q6 W# ^, S8 m1 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; S. q6 M4 W) {. G4 P  q$ ?4 Q0 G
$ {9 r" o& R) x. o2 R4 ^' r1 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ W; C% A1 R7 D- ?$ @% kunsigned int count_copy = 0;
( ?7 @% L0 b# A/ U% F0 b5 R' p
; }5 p5 e6 }/ ~* |2 `! M
- ~- Y% y3 z* v( T! n* hint main()
; m4 t: a5 C& O2 c! V3 c6 P( F0 }{
5 ^( J6 i& x6 j6 k  x7 q        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 {1 H4 u6 f# I( r0 k7 C' g- Q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ n6 t& X" G- y' |' C9 q5 C* K: c7 |3 b+ ?% k3 }* q
        while(1)$ P# R; |5 Q( d( S9 W( J
        {& ]% [/ A7 F. e7 K2 ^
                read_MSG_buffer(pshreRAM);
/ w: T! ?1 M% B9 n' L& ~( A1 r        }                * b& o+ j, ^0 s8 t' x2 _
}, v, D* k/ p+ y) @9 o5 J
# x3 ?4 X5 H' C/ m7 \$ }& t/ |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ c5 Q* n3 M# d- \
{/ F3 l+ S0 F# h9 U! y8 w+ U
        RX_MSG_PROTOCOL buf;" ]; A9 \9 G1 r
        
/ E8 I! t7 v8 j+ @; }        buf.a = pshreRAM->a;
. w& p6 ~& o9 O, H% z5 @+ `1 C0 W; f        buf.b = pshreRAM->b;- T$ Q0 d. E8 g3 w3 ^1 L
        buf.packet_cout = pshreRAM->packet_cout;+ y# A2 N2 z9 Q) U
        
) ~* E3 h) @3 Y* ?  e        if(buf.packet_cout != count_copy)3 y3 F+ x4 Y7 |
        {
, u2 T8 l4 ?! E' h# E# U& t: U                printf("a is %d\n", buf.a);$ S0 ~, ?2 U; j0 `/ l! m9 |
                printf("b is %d\n", buf.b);2 K. c" E% j& B2 R, A. ^: P
                printf("count is %d\n", buf.packet_cout);5 o" X# Q/ B$ V2 o3 q
                count_copy = buf.packet_cout;
# ^) |% D) s3 A        }  B0 ]0 y3 _6 A+ D5 u9 S
        else
9 I  N' L! m! @+ x6 X2 a1 t5 M        {9 A# e* \# [( M& W/ [
                printf("No effective message!");
! U* {2 m" U0 |7 j/ g7 e        }" ^/ F  B$ M) J% g3 V9 _
}
0 K5 r5 B. k% _3 B$ O* l
3 Z  m& h% f3 N% V* M
( Z) Y2 }8 M/ t; h7 M- Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& h# E+ ?/ l% R" Z) ~
使用下面代码,对内存使用了mmap函数后:0 [0 W6 C' U: C  I8 d; q  |" y
#include <stdio.h>! Y& y  d% g" C$ K+ P) s7 ?- V
#include <unistd.h>, V* M8 t1 T0 z. s; q: @
#include <sys/mman.h>4 I5 A7 {, c) u' ^+ V
#include <sys/types.h>
& C! l5 a) \) ?* N, i3 |#include <fcntl.h>
) Y4 @& l$ F! Z6 D$ M% b" W6 Q" r% R  U6 h' B( s
#define SHAER_RAM_BASE_ADDR    (0x80000000)( m* e/ t; s# d* k7 d
#define SHAER_RAM_SIZE         (0x20000)   
2 D5 {2 e' p! ?$ Y2 k$ R% n9 {
. b4 K$ Z0 s& R* r3 x# ltypedef struct
# ^* r+ D* |3 b3 R{1 m/ s3 N  X, l. f/ B) s# _1 l
        unsigned int a;' N: y5 d  v2 ]- v. n8 Y
        unsigned int b;# n2 ^7 T8 [' `9 z+ G- J, P
        unsigned int packet_cout;
9 k' S7 [. {" T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! }" Y- l1 k+ }  X! B

( Y+ r" F/ f# ^& [) F  n1 vvoid read_MSG_buffer(int *baseaddr);; B# `2 @% }7 b5 p" S
unsigned int count_copy = 0;
: ~# L) c" W5 J, d+ q- {* n7 ~( ]" W7 Y6 W. q0 @( z/ U
int main()9 s2 `# }" W( ]. T8 d( [$ A/ t
{
$ e+ i, l  D2 N        int fd;4 ?5 J) S- w9 o$ @0 I( O
        int *mem = NULL;
3 J4 M3 K5 }2 ~2 t: h$ B' b+ P; J: u" S8 M6 E  D
        if((fd = open("/dev/mem", O_RDWR)) <0)
. E) r, O( ~1 x1 W* \9 h        {
0 G. t4 |+ v* H                perror("open error");5 H  C& O2 R5 ^/ I% w
                return -1;
9 a% D5 U' I/ T0 r1 o. `9 Q( h        }4 j) d8 i- s& U  I1 ]0 I" N% U
        * \4 l% t2 c  ~% D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 e# q- n" x; M
# G1 g% b* c! b
        while(1): s2 m$ U+ r* C
        {1 C3 _* e. Z: I* H0 t, `
                read_MSG_buffer(mem);7 O$ `- R: d9 W; L  `! H
        }                ) M; }6 Z9 C- ?4 @8 _% C' }( j$ Y# N
}
5 z3 x, L7 x7 j0 l
! u/ C3 Z9 [: m/ S) O' N, cvoid read_MSG_buffer(int *baseaddr)1 K: W" V. R( O' F
{
' ~. ?; f. F" c        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ p$ G& l* I/ h1 B& E6 w' n
' C/ h. F/ _* {) s3 _' k) _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& U" H8 t" s/ v% B/ I! [8 u( H0 M6 l5 M; }
        if(pshreRAM->packet_cout != count_copy)
# i% u+ a9 A4 ~# b2 Q        {
( l- w: P% e* V9 G) W1 e                printf("a is %d\n", pshreRAM->a);
- [: L2 Q1 s# u& F3 m7 M                printf("b is %d\n", pshreRAM->b);
" @9 f5 A/ i, ]2 |- L; q$ H                printf("count is %d\n", pshreRAM->packet_cout);
3 l7 F/ Q# z3 J2 m3 k9 a                count_copy = pshreRAM->packet_cout;+ g4 g# Y7 J/ i* {6 E+ w: Z4 O
        }! d: a5 M) w* `9 t1 m
        else
; u3 o  }' }7 D4 }        {  u: [) @( Z& F
                printf("No effective message!\n");
* U. U/ v- |# M+ i        }
/ |2 C( E  m: H! N3 Q& z}
6 V% T* s+ f& l, @
/ z. h( d2 n" @( e4 R4 A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& e* F" S+ Z: u( W$ Q, I( M% M( ]6 t( e$ x! P
  l5 f/ b" x4 R) a! m% [, d0 Y

0 b: |" S/ M! c5 u% V, ]& t0 Z: w1 T6 X' P" S





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