嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& [: a4 E1 `5 l0 I3 c
# l6 q4 [: W7 ?8 q2 H1 S4 COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) A* @7 E% C" h' A3 `' {
#include <unistd.h>
  b; ^0 t+ v5 g6 z) m' j; i2 J9 C#include <sys/mman.h>
$ P! G! \3 M0 s& L% N- I#include <sys/types.h>! E' \) a" ^3 W4 H, m
#include <fcntl.h>
$ N7 |7 G# j6 ]8 u* L
5 z: n+ }# J7 [! [6 b#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 \' L2 r2 S+ V1 ?6 d! D/ k
9 U. F% `9 G, f/ l- ptypedef struct6 ~& b& r: M, i9 ~7 M/ O( I3 f
{+ W1 }2 H8 P6 k' ?# J1 F
        unsigned int a;
. _  P; a# n% A        unsigned int b;) t7 E3 w: w6 b" B5 {7 p7 l! F
        unsigned int packet_cout;: b" h  V% x/ u/ t/ \6 J6 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  E7 z- S, }  Q1 O1 `8 q) p

1 k  B. N9 p5 g" |2 evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ A3 F% k0 l; [" a+ p" Nunsigned int count_copy = 0;5 m) o6 H# K- P5 o! M

6 o, W% K6 \9 A' P8 E; T1 H* J
3 A4 ]5 W( \: d% h( Rint main()
" ^. q& |9 e3 P, D{9 v$ N  |0 _- K) X
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, q1 c; O5 N3 `+ E) T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  i& A. Y. i$ o6 f  L6 {; ^# d

- Z. }' l/ t. a0 A) V0 _        while(1)
' z  U2 P% ^6 H( ~# }+ c        {( O; o+ g1 L5 _, E" S7 \
                read_MSG_buffer(pshreRAM);
( Z/ f9 Y) `$ U# T9 B% E! Z        }               
3 @$ B( l2 H- }) V% A# ?) ?" g}
5 h/ [, e1 ~: }& N0 B: G  e, f, L, }5 F# d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  L; z+ l& p$ c1 d1 i) p
{
2 A4 S; }9 _+ u) y9 T$ O        RX_MSG_PROTOCOL buf;& I& u( y6 b% X* l% a5 u
        ) o4 K; l* L, t
        buf.a = pshreRAM->a;
; P# x, J& i0 d        buf.b = pshreRAM->b;" r4 `6 L9 }; y
        buf.packet_cout = pshreRAM->packet_cout;; x( M) d5 d9 Q" w
        2 O  W3 B( |' F) U
        if(buf.packet_cout != count_copy)
5 N% F0 p2 ]1 _1 Y) C        {8 {4 X5 i- G$ a8 k+ n
                printf("a is %d\n", buf.a);
" d! }& ?! c! q, a9 q                printf("b is %d\n", buf.b);
4 q, s$ i" m, E4 l# U$ A6 s                printf("count is %d\n", buf.packet_cout);& a2 C! N* @+ |0 u
                count_copy = buf.packet_cout;
2 E, n1 F5 G" a- J6 m        }
% r5 y/ F) U. Z$ u        else
) ~1 x2 V/ c$ [3 t: W        {. \6 U! u$ a- C8 z  R
                printf("No effective message!");
! u) c1 k- p& I& m# m        }
  ^7 B7 ~, G* Y6 {, c}
/ r+ {8 A, I6 U
$ C% ~, c# u" A3 q/ ^/ l( k8 k
5 Q; r; c4 c  o  a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# c. x/ y! y) F8 j2 K0 l
使用下面代码,对内存使用了mmap函数后:% T9 t; O4 }0 M9 e4 V# G5 ~7 j
#include <stdio.h>
, S( {% r4 X$ @: C+ ?, P#include <unistd.h>
, Q0 G: ?" `  u; n" U) K#include <sys/mman.h>$ C4 g7 Y' i% o: w% H& u
#include <sys/types.h>! f! ?' n1 M$ ?) g/ H
#include <fcntl.h>
5 C6 d" l& Q& U: w4 H
+ l: `! a- |& N#define SHAER_RAM_BASE_ADDR    (0x80000000), O4 c* |& S' X, Z
#define SHAER_RAM_SIZE         (0x20000)   
! Y; X* G/ y2 b( z$ n
0 c3 P! N' X$ q; ]! Htypedef struct9 U/ \% m# o8 ?* B' S. v2 F9 \' t
{
( @7 |. b. A* E( m4 J! a2 c! ?        unsigned int a;
$ l7 P3 _) h; u& B& u* E  t8 F) c        unsigned int b;
- H" o# I+ j  A$ s- A, B        unsigned int packet_cout;5 k2 f# V6 H& ?9 m4 R5 v8 s9 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# ], ]' u4 t& }* U5 s0 m* C
, S+ e" j) A% @% d* c
void read_MSG_buffer(int *baseaddr);
9 e: [8 x# d0 Ounsigned int count_copy = 0;
0 u) m3 F+ X3 ?) f/ X3 x8 n5 k9 l4 v" I* h
int main()
+ g3 S/ I$ U  `+ @0 I* E. |{& R: f8 G/ j" y0 q% X
        int fd;
; Y6 q  A  B: Y1 U2 w: d9 m        int *mem = NULL;- s" b4 e$ W( L) ]

8 j1 U+ B7 z5 F; B) G        if((fd = open("/dev/mem", O_RDWR)) <0)
! w& ^) u0 }( q9 l% d. X6 o7 S        {
9 {, ^7 z, C7 ~5 w6 v$ N4 u                perror("open error");0 N2 G' h0 y" \! e' y
                return -1;, W) q- s3 t* {) e, j4 s
        }" C) Z# u% z; [# f8 ~
        " F1 r: m# F5 C( h
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' I; P: L0 Y! k5 B1 [, D9 ?/ N

# r- _9 @5 P, U8 \# s; ^        while(1)! k; y& f; I0 B, x1 p
        {
" H. a; K6 D9 M+ W7 N9 h" n/ e' y: Z8 {                read_MSG_buffer(mem);% C' v0 h1 t& _4 N0 S/ w* J
        }               
. ]$ |. s! f" V: }}2 u6 g5 \0 j  l+ o9 l! w3 x8 ~% v

7 }% s4 s* Y  N3 ^void read_MSG_buffer(int *baseaddr)
) ^: t( \! X4 j+ [- Z& C2 ^{
9 U) T' D% D/ \- w/ F" Z8 X        pRX_MSG_PROTOCOL pshreRAM = NULL;7 w* E# W0 d( ^8 N7 W: |% p' G
  t# n; Y  k& c- v4 i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( [# `( P2 P% j1 {6 f# k( B: t$ V: B: G) F0 Z& n( @- R, s
        if(pshreRAM->packet_cout != count_copy)! B% c) `/ O$ _' a7 }! K" [1 f
        {& N4 m( ^& Y- c9 k; L2 T) Q- }
                printf("a is %d\n", pshreRAM->a);
: p# V2 W1 I. g: w3 E( D. z2 j- G                printf("b is %d\n", pshreRAM->b);9 [8 y% Y- k' l  h- N- p
                printf("count is %d\n", pshreRAM->packet_cout);
7 Q: `1 Y) B+ Z) N! [5 [                count_copy = pshreRAM->packet_cout;
  R. t3 s, G$ r% Y) o! T* O) o        }
" g: G" X- V% @! R3 N. t        else
/ }+ Y5 j, J) D1 _        {& L% D2 O  ^9 Q0 e7 c
                printf("No effective message!\n");* J6 w) O4 }( G' E" v) i
        }
  E. S& w/ t& s! B2 _" W% [}0 k" T4 u6 N5 Y4 {- I( l

4 Q# o# L- l# f  f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  U8 E$ i- W9 p2 T1 V

" ?" r2 P+ U) p# \2 H' K  w* c. {. t$ u5 w. B

& `* J2 a0 v2 R
4 G$ e2 P. Y2 M4 j) K$ y




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