嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 D# n, B: W9 ?; T0 \, F( a/ B# {+ M: x3 e* X) N2 h8 c+ u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, I2 ^5 w6 B+ P" b0 A. n: a. v#include <unistd.h>
4 X+ p! a6 K0 l- O. o- p9 W#include <sys/mman.h>
7 b0 N- X3 ?) g7 J- Z#include <sys/types.h>
2 U; ]7 ?5 }9 L  j3 \2 i#include <fcntl.h>7 ]7 w5 h$ Y) a* @" \4 @

2 A# S' b- {: u. q" V7 g( B2 [7 V#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 X# v! _, Z% f7 m7 a
3 v  M: S6 A5 P; G+ W' C8 otypedef struct. \, Y! A" n! ^& a# v0 c
{9 `9 _6 n$ \1 s
        unsigned int a;* p8 c, O0 h  o9 J8 z2 b, N: j
        unsigned int b;, a, j2 I# i6 Z' \: v( S* Z
        unsigned int packet_cout;
, ]" d6 R2 z* r8 h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 \# g1 p* }! }- d
1 R- Y/ J3 o& U9 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 \+ Z: k7 b# t5 V, munsigned int count_copy = 0;' I) x' l( ]0 z5 r8 D. P( X: c

5 ]9 f1 a+ R+ N8 n: _
6 s, ]  e2 r6 d$ H! M1 F5 lint main()
6 Y( x5 Z7 @: O& a5 }, o% d{
( a& c" \$ i7 R- t        pRX_MSG_PROTOCOL pshreRAM = NULL;; x' [& F' f( v- z4 N4 A6 |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 T9 l: s/ z  P, ^
) ?1 f: C! F6 z$ z  R        while(1)
) p6 P& ~0 ^6 {  N. I1 U        {
, o$ K& `# i& M7 u. Z6 V: J                read_MSG_buffer(pshreRAM);
; w0 Y9 F5 k( P7 v- g* @        }               
  p7 k7 B4 R1 q8 J. k}
$ e+ k: s: C5 @: d; s% n3 X8 X4 {. I( w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 H. T. E# f' T) n* Z( ]{
# [1 r: r/ t. ^7 c0 D7 W        RX_MSG_PROTOCOL buf;
7 ]5 f7 u, ~  {8 @! j3 S        & N6 Y* ]9 r% Z. W0 P" ?
        buf.a = pshreRAM->a;
, |9 K) n- a) D        buf.b = pshreRAM->b;
" a8 {( U, V  @1 K1 g3 @        buf.packet_cout = pshreRAM->packet_cout;7 V: x7 H- _. M$ u$ k& n
        8 _! [, P% y% z3 l
        if(buf.packet_cout != count_copy)2 w: u; I. A; W  h  `4 y! A% v
        {# T$ \. e6 e! K. J
                printf("a is %d\n", buf.a);
* V- `6 q# U/ t# H, @                printf("b is %d\n", buf.b);
, c- F$ P8 w. q& W2 U5 Q6 T3 U0 t( |" Z                printf("count is %d\n", buf.packet_cout);
4 W, U' ~8 ^# W5 h6 W                count_copy = buf.packet_cout;
4 K( J# v- B5 j+ N& C) M        }
1 P* l$ C  y, B; \        else1 B, w  V6 l) l& o
        {* ?- E+ O; m% Z4 g+ ?+ a1 s4 l% T
                printf("No effective message!");
- t* o! @4 l  K9 Q+ I9 ]8 n        }) V/ W3 e9 c7 q6 m
}  h" w+ @8 w  D* u! o

8 C$ ^! b7 P& o1 _) l6 r3 [- ]6 Q, U0 [8 h9 E1 O7 Q1 q9 m) Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* u6 _' M# t! @! D- e
使用下面代码,对内存使用了mmap函数后:
9 V! ^/ c! T0 Y# w. {5 _9 d#include <stdio.h>
% T) q, d) u) g/ t; X4 }- Q+ |#include <unistd.h>& c/ z) A  @% l( P7 q
#include <sys/mman.h>5 m$ h5 v) V; X
#include <sys/types.h>
! b% {& `9 f. g#include <fcntl.h>
4 h4 }5 ~3 ]$ k9 s; f& F+ [
3 q5 \1 i9 S8 `( _: d+ q#define SHAER_RAM_BASE_ADDR    (0x80000000)
: e& I0 C1 J( r: h5 `1 f& g#define SHAER_RAM_SIZE         (0x20000)   
; p( a& ~6 w! G' G+ U* j* [3 j" A) I! \6 u
typedef struct
& s, S: `2 s2 w# Y{# M1 m# k$ E$ \+ ?* T
        unsigned int a;
0 P" K9 h$ f* h3 C2 k# R  q. L        unsigned int b;
/ `6 L+ ~) O/ [8 O- [: l( Z2 J        unsigned int packet_cout;* w! a3 W. C( @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 {3 D' @4 _1 q

! A4 C( R3 u) ]/ D/ U4 L6 ]! rvoid read_MSG_buffer(int *baseaddr);
) y5 }: L4 n$ T! o- `5 z8 bunsigned int count_copy = 0;
3 D' ], s( Y! }9 q. |2 y8 g% i
5 Z: K' i/ P3 M& L( M+ l5 |int main()- G* C: d; Y4 ?* N
{' X4 _, z. x6 b5 \5 s
        int fd;' G3 R, o. p% V) L; m
        int *mem = NULL;* I( ?  K3 J: W. M6 b, R

) u; u9 p8 }' d3 K, g3 F7 K        if((fd = open("/dev/mem", O_RDWR)) <0)
/ @* \; q, @- L$ Z+ s$ P; z        {0 T9 ^; e+ c, F9 Q0 q. U
                perror("open error");( r  q9 w; _) }# p
                return -1;$ Q5 a+ X1 w% N% f! Y
        }3 M) C. |) W+ A, G3 v  j! f. _
        / h  t! C. A5 {$ U2 T4 n- N9 |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 q3 H2 G+ m* ^

2 r/ J: G) n6 d) A        while(1)
. e7 P0 w$ w  A        {) z' O* ]  C4 w0 l5 ~% m( p; j  Z
                read_MSG_buffer(mem);" q& P8 ~- |! @8 n$ U
        }                  x' x8 G; ]: ?" S* N
}; I5 z$ }* C! d7 N7 }
. S. t* y; U  {3 a
void read_MSG_buffer(int *baseaddr)
7 u: l: E/ K/ k! c{0 Z: u$ p4 Z$ n" f
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ o) ~# x  O) u+ l$ e1 W

% I$ R7 }# Z' r5 Z* \# A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- ~8 n  A+ Z% e# L5 g# g* l3 Z9 b
  j$ P1 A, o! c8 p, f; E* C# W        if(pshreRAM->packet_cout != count_copy)
! s# D0 W3 M* y* y9 O$ N1 L9 G        {3 F+ D% d. z2 g% Y& \& }
                printf("a is %d\n", pshreRAM->a);
9 ^" [$ Q, ?4 J5 y, ?$ D2 D* W3 B                printf("b is %d\n", pshreRAM->b);
/ [2 v+ p% q; I' i. w1 z, `                printf("count is %d\n", pshreRAM->packet_cout);6 H) Y; \1 q4 a/ t" J+ F' b# n
                count_copy = pshreRAM->packet_cout;# Q  ~6 r9 R2 W6 n
        }
) K3 y' u' D# v! g6 t; F' X4 ]        else2 E( m* i1 ]4 Y: `* C) W! V/ s
        {
0 X1 c+ ]; I6 z* v3 j) b  p/ c                printf("No effective message!\n");. h% m% u0 @4 m  @3 T
        }3 i' z, ]: u% T% q1 n/ U& Y7 }
}% {( i8 U: I1 C5 E7 [# V) R
! N) ^7 H8 z+ X( w+ e) i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 V) m! T# O# h# N
/ i$ N& N5 ]5 |/ l3 q) I4 y: }7 I' Z3 M/ q, F3 M9 P2 G+ K2 ?4 Z

2 K. }0 c3 h4 \- S* x8 }
; @1 t$ c' e- H8 p" ^+ C& ?




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