嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * Y. q4 a6 z3 B; o

# z& R% k9 G) E6 p  Q4 @  B0 nOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ _. d# Q6 q6 o# s
#include <unistd.h>
/ w) |5 K5 t& D+ i( N& H#include <sys/mman.h>
+ g- P" _+ k& m' r- Z% O  n#include <sys/types.h>
5 I' g( J5 {" m* R& N4 b#include <fcntl.h>4 B* D4 h( m  p. x! V
6 C5 D3 X0 x& ]7 ~2 M
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # Q, c9 E! `  P$ c9 }6 ]. i  q

/ V, I  l7 }0 d1 L; @  ktypedef struct
( |5 r. f9 q; h{1 o8 U, T3 c  J7 v) d1 g
        unsigned int a;
8 m) r1 T( j# ^8 C" s, R& P# G( @. x! g        unsigned int b;
7 @# J7 q" w0 D) U1 O& j! W        unsigned int packet_cout;
7 f& h2 E9 v7 ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ~, J/ X* D9 x6 K# `
) ^: ^7 l) z2 V7 t! Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& r: e! j! C8 P8 A' M+ S
unsigned int count_copy = 0;# u5 b+ |; y! h) }
" {- i. A, m: ?5 }/ t8 N- \# i5 q
! p% j* g  ~# s( y8 ^# P$ T( D) H
int main()& S% g/ z9 M# I( \
{
7 J' o  a+ d+ S' S# v. ^* b4 e        pRX_MSG_PROTOCOL pshreRAM = NULL;
' z1 M) F! s( L. f* p" h- X( T. @2 V' S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* G/ y+ Q/ Q! G/ p( L5 W5 b

6 T; o' o3 k) Z* p" u        while(1)
: o2 p* }. R+ q        {
2 Z% ^' L  n3 x/ T$ Z                read_MSG_buffer(pshreRAM);+ b' }  S& A% J! s& f8 j! }
        }               
) R0 a3 y, }! B8 T' ^}( p7 S4 }9 J9 o

7 {, j2 q! O$ o7 v2 c. }$ {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), `2 g' ^% a! i" l
{
: \2 v1 {1 p$ H$ X  L        RX_MSG_PROTOCOL buf;
1 |/ h& h; l8 ^3 M        2 t% J% j! v3 Z+ N& ^0 w1 k
        buf.a = pshreRAM->a;
, D9 x( j  ?( `! g  F4 T: ?  v6 N0 e        buf.b = pshreRAM->b;" m* d2 l3 x( M
        buf.packet_cout = pshreRAM->packet_cout;
1 J8 f. p0 _8 l$ w# G- _. f        
2 Y* j  z$ x- m        if(buf.packet_cout != count_copy)
" U8 E( H/ e9 |" Y        {
: y9 f/ [4 e$ ?6 u. x# s$ G: V                printf("a is %d\n", buf.a);2 H6 G& U: k9 I
                printf("b is %d\n", buf.b);6 [& F8 ~; Y+ m9 y- `  _
                printf("count is %d\n", buf.packet_cout);7 a( X: v& }6 S% P  A. p
                count_copy = buf.packet_cout;
5 g8 k* h% w3 E1 C: {/ K' I4 \        }
7 ], D# ]" n) M+ U" T/ z        else. Y" E, Y7 y9 p* s
        {* O: W3 z# |% ?4 m1 I6 q
                printf("No effective message!");
1 c+ l3 T' Z' `" A, {% a        }2 b  ]5 x7 c% g
}: B0 O; k. K% S" V, d2 v$ `: O

3 k: U+ H: E' m) a4 Q* H8 h, m* r2 [# @: M/ K+ {
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% i- a% s6 l- Q- N5 a+ X
使用下面代码,对内存使用了mmap函数后:
( \' h* J8 z, @, x#include <stdio.h>- m3 D1 r% y6 c
#include <unistd.h>7 @  l# S3 l/ Z4 V! g/ i. \7 |
#include <sys/mman.h>
2 `1 z, n' {2 W* m#include <sys/types.h>
# O5 V" q8 d$ m# n. H: W#include <fcntl.h>
$ o1 d5 i/ b6 i4 G  F/ \7 e3 A: k; l; ?% w; R: l1 `
#define SHAER_RAM_BASE_ADDR    (0x80000000), Q. O$ j2 i3 V6 A
#define SHAER_RAM_SIZE         (0x20000)   
# \: [* h3 D4 ~2 A  N; S+ U4 U9 W. i5 y) D8 u! d
typedef struct, }, `% h3 d. [* v
{
' p; Y& ~6 I/ [        unsigned int a;
* _3 |9 l; P0 z. U7 E" o+ U; C        unsigned int b;
; I2 t1 r4 D3 m/ t: }" o) e        unsigned int packet_cout;: ?5 I& B- g4 N( C$ \6 T3 H9 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 z& T' L: z" {6 u/ a4 \  q
1 `; X# ]$ H3 N- R' Pvoid read_MSG_buffer(int *baseaddr);
8 c5 u' b  ?2 i- `% Munsigned int count_copy = 0;* v  m' V& }: F) }

/ E! V0 j; T9 bint main()2 Y$ a9 c" _* p) b2 w
{; i; ~) S8 W$ C
        int fd;
  g- o4 l. h5 q" D$ |2 c7 e+ h6 Z3 I        int *mem = NULL;
* D* R2 V/ O5 M; M* u3 _! }! K; ?; A
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 k8 E! A8 ^2 `& f1 u        {
. j* Q8 n2 h1 C6 w* ^9 g, d                perror("open error");# @: \, I- C3 d( h; z! P2 {( `0 L2 t
                return -1;/ Q- x6 N+ |0 L9 c
        }; B+ u5 F' I; o; e1 D
        5 R! W; m4 c& L( E2 u( v& R  S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ K0 j+ t( h- o6 M% Y5 h9 N6 G& d! ^0 B2 ~8 S2 M
        while(1)& N* i% r/ {' u5 G6 K* L
        {
6 d+ H$ y2 l" z6 Z  U8 A3 [                read_MSG_buffer(mem);( i- _5 W- l! L
        }               
) o7 ?- n$ ~$ m: ?5 {2 `# _}0 s7 R; B- w; k( e2 R6 K

: w8 g9 ^2 O, W: n2 u* M+ E% Y* mvoid read_MSG_buffer(int *baseaddr)# V( `/ \2 U7 ^$ T
{! S: J- T0 G. w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! ^% x) X8 s* ?( F- R5 B1 c& c3 j
$ V5 ^6 @7 I- m        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 A/ M, x0 g- C. m& v9 G, G4 v/ b( O1 `7 ^6 H
        if(pshreRAM->packet_cout != count_copy)) z2 l; o# h* o4 @, x1 \6 C
        {
( }6 U! r  b$ v$ I                printf("a is %d\n", pshreRAM->a);
% v6 V0 Z5 J3 p7 l" Q: ?# r- T1 l                printf("b is %d\n", pshreRAM->b);$ f! |+ [6 S8 E
                printf("count is %d\n", pshreRAM->packet_cout);
2 }- ^4 R- D% l# E+ P7 c4 y                count_copy = pshreRAM->packet_cout;" b! S; n- s6 W$ r
        }
3 b+ y% K* @$ y1 k! U7 Q        else% \- f0 x% Z! Q
        {1 r1 B/ ^' U' P  z3 U3 e
                printf("No effective message!\n");
9 W/ d/ `# \1 j  X" r4 y$ W        }( r8 ]: D& B: z% @# Z5 p
}
$ d( m3 F* M! f2 S: p* K
$ D( d/ [/ F8 E6 y8 z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" q% n" J$ H5 D' N
( Y" ~0 G  F" h7 E
' g! f1 T+ D$ o; M0 w% X" Q9 k
0 o8 u( T( Z( d) }# c; C
% l% M! r+ g2 a' y, A1 b: {





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