嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 s7 n1 E; R! H: ]" @9 d+ {; q7 g8 O2 F8 p* c8 V9 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 N; }1 f# o$ a
#include <unistd.h>5 z' G! ^) l% ]! X) p1 X- @! Q/ ^
#include <sys/mman.h>
" N' z) I6 c+ I4 B% Y7 I#include <sys/types.h>" i! d4 ]/ V" I. J% _5 o* b
#include <fcntl.h>
& f# B; _* l% f! c7 p# i9 B/ l' k  R' K& J% C
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) @0 s' R- _- o, K4 |- d

2 D! x7 q5 }7 n! i1 z# d/ ~. otypedef struct
2 B0 I( q" v" @{/ l7 Z! R7 y9 k) v
        unsigned int a;3 s: a* `5 m1 r- m2 [
        unsigned int b;
3 R2 [, X  I& L& Q        unsigned int packet_cout;: F. u1 E, j, t/ g2 T! S+ u3 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! L3 D% I4 F/ i& x
+ H% m9 K2 a7 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);, A" ~) [. D0 Z* C
unsigned int count_copy = 0;
7 Q1 E# T$ r$ r7 B8 y( ^3 y. W
7 V/ Q5 @. @9 y; G
( Y/ t  e. n) w' H* Y5 kint main()8 G8 U- D4 J* d0 o
{
1 `& o! q' A) n* G        pRX_MSG_PROTOCOL pshreRAM = NULL;3 Q! W9 U! W+ L1 N$ ^2 {4 p  ?; Q9 H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 t* ?. Z$ V% T% S% I* _& Y
7 S& h0 Y& V+ Z% O% R
        while(1)' \$ [& J. G; \" Y+ R
        {( b7 {* C+ i: _5 l7 R' ~2 U6 e
                read_MSG_buffer(pshreRAM);: [  q" s) \+ S2 i2 }- S& U
        }               
9 I& _; q( Y1 g! d}
( n& J$ {) [& `. f
. W/ |" [4 Q% h/ j  q$ {0 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- i' K: F9 M8 n- W$ P{
1 i, u! b5 f- T+ g" j% w        RX_MSG_PROTOCOL buf;/ q/ K9 n5 ]5 b+ b# }% l
        9 x. ?. T3 k" V" b2 a! k) F
        buf.a = pshreRAM->a;' y- [, l: ?5 x; b% N
        buf.b = pshreRAM->b;6 j4 m1 U* T" l) w( l
        buf.packet_cout = pshreRAM->packet_cout;
0 U- ^0 N9 K  L1 R3 ?3 k4 d6 W& S        & ]$ d1 A8 F( z! N  [& l2 [* r
        if(buf.packet_cout != count_copy)* G! H% z' w' `: N, l
        {
$ d' z" ]* i& e/ d% Q( N9 b# U" {                printf("a is %d\n", buf.a);
" V. Y% M* N: S. i$ f' |                printf("b is %d\n", buf.b);" E; C, e( N6 \" P, Z! d
                printf("count is %d\n", buf.packet_cout);
0 p* W* x# y4 n3 ]' M* x( G                count_copy = buf.packet_cout;
$ w. y0 v* N6 R        }. s5 C1 }1 Q5 z$ `0 l
        else
, Y" {# c3 b- ^( S        {
5 \& x; M6 w  D4 h! @4 S                printf("No effective message!");1 i7 o( g6 j3 J% Y6 ]
        }
5 V3 j3 `/ U5 I/ F  D4 \5 ^3 }}" h0 w8 |% K2 a5 f
- X6 W: k  R. O7 n: L+ `5 ^

1 f: I$ U& Q+ K# z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 \2 ]. L* i% N! m0 I: e" |7 v
使用下面代码,对内存使用了mmap函数后:
& U8 `3 }$ p- E1 l7 U#include <stdio.h># K. q" {- h1 p* i8 e* W1 }. r
#include <unistd.h>! T( b8 T- B$ C8 o9 U, t
#include <sys/mman.h>
9 M% y# \( ^! t$ N4 i#include <sys/types.h>
; ^: S/ Q! F% H#include <fcntl.h>6 ~4 p- U; `7 K3 e" w3 y, o1 ?! J

" K" A) a- u9 ~8 z+ f#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 z' k9 h  K& A# Z#define SHAER_RAM_SIZE         (0x20000)   
% b( `. Q5 a( P; _; M: k- j
0 ]" L3 |4 w5 T8 _typedef struct4 Y, a, L! J* v7 ^& m& p
{3 p+ j( T4 K6 k/ ?1 L9 b
        unsigned int a;8 u) Y4 r% X" P- V. _  l8 A
        unsigned int b;
3 H. \7 m% N, k" E: a% E. u        unsigned int packet_cout;# B7 j" z0 A8 H- @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, `" D& L7 m2 v, u

! G, i, H# ^7 ?4 S; J+ x5 Ovoid read_MSG_buffer(int *baseaddr);# |! A6 @) A) z& i9 B3 H5 R7 @
unsigned int count_copy = 0;
# V3 R) Z) u9 f( q4 c# _
+ Q+ \$ P% X3 c$ E. i3 E8 Jint main()$ O$ k8 r* N0 {
{$ P$ F1 {$ R/ u& X" X: B: O
        int fd;7 ~" N5 u' _7 M9 w
        int *mem = NULL;$ l4 n0 R9 N7 w: r  z

: [/ ^" u# {: V5 L8 f4 E0 O        if((fd = open("/dev/mem", O_RDWR)) <0)
2 U$ ^8 S* n0 u5 z1 O5 O2 S        {
# y5 M, G- g1 |1 a                perror("open error");
0 I% ^% P& t' d. B8 ]! H7 s                return -1;' G4 S) g4 j: e, v. M3 \2 |
        }" k& E! r" O6 L( D" a, k
        , Q) X/ t6 m2 S/ C7 H! m  A+ k
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ G% B2 N6 w# B# `# [6 ~" K
  E% k" T) ^, i7 q2 _# h
        while(1)% B: H6 M. D1 w; N6 W7 @$ E
        {
. }- j) M3 m$ z. V3 Q) f                read_MSG_buffer(mem);
" v$ V6 X2 j& A  ?) o0 |% V        }                7 x0 E5 D* L* E! C* I! {9 D
}
( m  z, \$ {, L5 D& L3 L. v" N, W. N+ c
void read_MSG_buffer(int *baseaddr)
( r8 u# i8 Z" L. N5 |( Y1 s* n{
- G0 P0 O: k9 B1 E        pRX_MSG_PROTOCOL pshreRAM = NULL;  p" D, u8 y+ R( h+ {) I+ t
1 M( E' Z( X' M# c* T
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- j9 J+ I) v$ l0 V" v. H
! m2 M( I+ A% g: X9 d) X, e5 ^! x" J        if(pshreRAM->packet_cout != count_copy)
: A* w" P; Q  z! r4 B) D        {9 [3 I8 o' f( ^1 j- |. K1 d
                printf("a is %d\n", pshreRAM->a);
1 T, ], a; a: M7 w) O: E                printf("b is %d\n", pshreRAM->b);
7 m; B6 m/ I3 F9 {# B                printf("count is %d\n", pshreRAM->packet_cout);: }' m# k/ L3 u
                count_copy = pshreRAM->packet_cout;
. m! k6 e9 T. }        }
+ Q9 `1 W$ a; n4 \# S        else- |0 p8 |% Q4 _) I. k9 j
        {; A, X; A1 X; e9 C9 R3 e
                printf("No effective message!\n");' b! m0 |5 P- i5 ]) U5 P: }6 P
        }1 e( N: {1 M$ h" T2 I+ T
}
9 e- x7 G  y/ R5 k6 Z& ^
6 a9 ~4 \" ], c5 d, e! R9 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 P; L5 n8 v  `  ?" n& H5 J! Y: f

1 f/ Z" o% J& f  t+ N$ L: O: P0 S- e0 \0 n2 a/ G
# i) I% M1 D! Q! S5 S
0 l# \/ {0 \& `& y# e: s





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