嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % l9 \/ s2 E( e# t0 U& c9 y8 B' O
3 e( p7 \! H/ u- b; d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* w9 P/ x6 J8 I' t2 ?% ^4 N$ z#include <unistd.h>
  j* W: P( {  t8 j" N3 n' E5 f4 h#include <sys/mman.h>! |5 n8 Q; h% c$ Z
#include <sys/types.h>7 j! m( H3 m: n3 b& _& f( I5 t
#include <fcntl.h>
  B) R& {" O% S
  u5 j, e( v& j1 E4 x; b#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) |" r: q2 R& |. H* Y1 Z

+ _% N! _" A0 f% S5 s  C) btypedef struct
# A6 H3 Z0 B  L8 p{) {! [% v; F  A4 u2 A- l
        unsigned int a;
: C8 L' ]5 Z  y4 A' k6 \9 q        unsigned int b;/ j9 r; e3 o6 K4 {! R
        unsigned int packet_cout;
- w0 v6 C( j# Y7 i2 y1 D6 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 @( E% o8 d/ W% [, l2 J/ V. ~1 @

, n. z) F* W& @, e, ]0 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 P/ c" p5 M1 o# x7 l, f9 m
unsigned int count_copy = 0;: s1 s# T! R+ h8 m

  F8 N5 J* K) h
  r+ m+ [/ i- ~3 X3 w8 dint main()+ C. W* i0 w, {) ?
{
1 q" u  M+ b! M+ m: k7 t        pRX_MSG_PROTOCOL pshreRAM = NULL;3 c) Y6 o1 j$ ~- U% d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# @2 j" z- J! `& r* n3 X# Y. C  p$ Q
        while(1)" |4 c/ _1 o* Q) v0 M. @3 J
        {
+ ~: ~5 E$ u) B                read_MSG_buffer(pshreRAM);
0 t6 V$ V3 _3 G. b! e; _1 S: J, G; v        }               
+ d: X8 ~) X: \" \}, g/ {7 A) [- G, p. z$ d

/ C% W! u3 I! k, ~4 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' a+ G: n6 Z! v1 v- D
{$ n0 u- P( P- }
        RX_MSG_PROTOCOL buf;5 B' Q; E, I8 R' i6 V6 H/ E0 J( p
        
2 D# J1 h) ^2 v& L9 H! m        buf.a = pshreRAM->a;
# J2 |+ L  I# H6 V7 [6 I. U        buf.b = pshreRAM->b;4 ~' i+ Z$ k7 U# F' T8 f
        buf.packet_cout = pshreRAM->packet_cout;( f9 t+ J3 _  Y2 `% L6 u& C
        $ ]+ G% ]# p5 Z* A9 e
        if(buf.packet_cout != count_copy)0 l3 \6 |, ^6 ]4 \, ?3 }  k4 `6 b; B3 g
        {
& A! d* s2 P5 I0 H                printf("a is %d\n", buf.a);
2 Z' N3 c' D/ i4 w8 H                printf("b is %d\n", buf.b);
- X1 W, G: m8 r6 x3 T                printf("count is %d\n", buf.packet_cout);: m2 U& [/ G; u: d) g# H
                count_copy = buf.packet_cout;
3 L0 f6 z% _6 f, q: G! Y" q        }( T" n! Q: T  |5 q9 g
        else
, U0 L; y: _1 V$ y' t, r8 w& k. B9 R        {
  F4 g2 Q  `+ p- |                printf("No effective message!");
3 p: D  K, g( C; m& b        }
) O4 p" Q+ `) I1 J, i# Y8 i}+ i, N3 c) ^4 V: M( Z. S6 }6 \
( A: Y; K2 Z5 q

0 a5 P: P1 E0 i& W1 D2 N但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) G* m8 m/ ~. d+ N: t: E. p, Y
使用下面代码,对内存使用了mmap函数后:# p! j. H! I; E% l6 K
#include <stdio.h>( o4 x# _# z# j3 G) K0 `' L' g
#include <unistd.h>8 Q9 n8 f+ J+ W4 x. S; j% Z2 z
#include <sys/mman.h>
( B- Q  ^$ @7 N' R#include <sys/types.h>9 Q, S/ y! k! P& C1 h
#include <fcntl.h>0 f% L. ?* Y* K/ L8 i, i
# Y) {0 {; X3 k3 m
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 x" R& ^! k" a9 ]1 ^
#define SHAER_RAM_SIZE         (0x20000)   
+ g8 H' q' H7 T9 j
2 ]5 @* W8 U8 ^0 t+ Gtypedef struct. R; L/ I, l( O* i3 T( w0 w8 i% t7 R
{
) t- G7 N: E' ~% ^0 U, s, O        unsigned int a;/ D  h& \4 K# P7 t
        unsigned int b;# v- Y3 K& ~+ J& J$ s9 T
        unsigned int packet_cout;+ O% `6 ?+ c* v* \, x: i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ r( n; d: e& L4 [/ t' z5 W$ b. W& Z- [: }
void read_MSG_buffer(int *baseaddr);# I: l+ t9 }6 u' L7 R0 h  i
unsigned int count_copy = 0;
" m$ M+ ^' A. G0 V' ]1 J; G5 \, D) e# v, d
int main()
9 X: X2 d: H- D. q. N8 j, M{7 J6 w. }" x; y3 K( H
        int fd;
; s& c8 B, p6 K; u3 z2 Y        int *mem = NULL;
( k9 a9 D, x  p' Q$ g$ T0 ^& Z8 z5 i) b( g% u
        if((fd = open("/dev/mem", O_RDWR)) <0)4 y0 P" F5 w1 {+ ]+ E
        {- q8 H$ ~. A7 Y# u6 B  ]0 g
                perror("open error");# k' G( T$ A2 Y8 r2 C
                return -1;4 d$ i8 w) k9 R$ X* R) t
        }& Z, t2 ]* x/ H- m4 b- {- }1 q: t
        # _+ X( J' A. W7 Y' v5 e. a) ^2 ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ^( J0 m. j' `8 \/ k# H. b
# D! d/ I! v3 T; I9 G% e7 @* o
        while(1)/ M/ G: x% l* h1 u' ^7 _% {8 V
        {
( \3 X# {9 Y7 r& u                read_MSG_buffer(mem);% P, n& Q$ y3 R* E; U* a
        }                / Y# J3 h& v5 S% a, q
}
# ^5 [  v, {2 W4 F& r* \; ^6 E/ p7 f% f5 d; Y  W( \5 U$ n. d
void read_MSG_buffer(int *baseaddr)
$ {6 \1 N9 Z7 ^" Q: y{
: f% V# g3 ]9 f  F( @1 p( A5 c0 }# m        pRX_MSG_PROTOCOL pshreRAM = NULL;
! G- o3 c( @6 O/ j* E: G/ l" [! `6 y0 O% P+ c, @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* K8 C6 \* o8 q2 ]# ]7 E

0 C4 i' C' i; I" C, r# z        if(pshreRAM->packet_cout != count_copy)
, P+ I9 i4 }3 M        {( B4 _( G' R& a- K
                printf("a is %d\n", pshreRAM->a);
: G* H& j# K" B9 J, r5 h+ @5 N# i                printf("b is %d\n", pshreRAM->b);
! A" X7 P3 F3 n2 H' t4 K                printf("count is %d\n", pshreRAM->packet_cout);! u+ @3 o0 _1 ~$ s( }/ q- E8 S7 L
                count_copy = pshreRAM->packet_cout;3 |/ Z- P  r6 N% c; T1 T' k
        }% f/ F0 L& P" h, |# M( X
        else" ~. U. a6 U8 y0 v' P% p6 i2 B
        {  D, H; G0 C$ \: B( i+ F8 x
                printf("No effective message!\n");4 }& R0 D; T4 |- ?
        }9 |3 _$ n. K/ i: Y) W3 _
}9 {1 |& D6 D3 R% I

. L' y5 z; Z. d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! J9 T5 }: P; ^
- d) u. f+ F' G% {3 h7 `8 [8 }, B

- c6 T' c8 \) |4 B' @, U! z" E4 ^& _5 k5 Z: I) q6 |6 f
9 {: R+ v. M/ @) B" D' W0 o





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