找回密码
 注册
关于网站域名变更的通知
查看: 270|回复: 1
打印 上一主题 下一主题

SOC开发中volatile限定词与编译器的优化!!!!

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-4-15 10:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    SOC开发中volatile限定词与编译器的优化!!!!

    : Q8 U5 x2 L1 x/ @5 Y4 C) k0 a* v* B$ }

    0 S6 @6 z' Q" u6 [; i/ @. s最近上手nios软核处理器,入门自然少不了流水灯,开始按照“NIOS2那些事儿”写的流水灯程序,但是然后函数是自己写的,结果所有等都是一直长亮,死活不能流水。
    5 D6 Q# I+ I- ?8 ^: }, l* ?1 X4 t3 z% F& N* e- l
    代码如下:
    : L/ k! r  L$ Y% w2 c0 v; p  T/ B
    ! x  J( i4 ^' l( ]" F5 h+ q! H. W, i" |
    / E8 T9 e: Q$ n% G

    ) d3 k* P+ X! A0 h) q2 n/*
    . b3 A2 j$ ~. Y9 G7 w4 u
    * p1 T4 ^  U' N  K' G* main.c& d$ R: i4 h9 K+ I
    ( ^. u* N# r7 Y& `0 Y  Z
    *$ A& @4 p9 `) K5 }# c! e

    + D& H9 ]' Q" Q0 Z*  Created on: 2015-4-145 f8 n5 B' k8 j
    4 `: N& G/ i* R4 ^; V1 a. f
    *      Author: meicai8 t2 T- z' U' O9 S: x7 L. z
    & t9 C  u8 S4 W
    */
    8 _2 X  ~- ~7 H  }& x% L# f$ U8 z7 c  j$ A5 k% H
    #include "../inc/sopc.h"# v( m: R5 @, m6 U( p! z& p" ]/ L

    : Q  q% n, D8 k+ @; x& p/ q/ G#include "system.h"
    6 ^5 A3 w, q) g1 O# _# G9 r
    . b6 {. |9 u/ Z; M- c3 r! @* k1 U; A/ [' G) z* b% ]5 H, R2 B

    : h; u- l0 D& W, Wvoid delay(void);; f1 T1 N$ C2 L4 A. ^

    2 e% Z  k: o  ?
    ' g/ C% B. \+ U5 N& d9 x, Q2 B& S8 a

    % ]+ S0 o+ Z% t4 g- i) [% R. Q5 C9 L9 J; f( |, U
    int main(void){
    * j- l8 D  X& j6 E! U  e/ Q6 z! P7 t; h5 L1 A
    7 S, w" Z, I* ?9 U! W, j
    + P7 s1 x4 p2 F7 [( W+ _3 n

    : y- X. ~. D2 D; w$ P# ?
    % f5 E) M- u! A        while(1){
    # [9 V9 m5 Y4 g
    4 }4 P! ^* ~& r3 r& R4 h0 W2 c4 N; Z8 Y' D3 Z7 z$ n5 T* z8 M7 i
    0 r" K. b" h3 [* F7 Q/ A
                    LED->DATA =0x01;8 }( H7 F$ H% Z0 A4 ?( f5 O' \

    6 x' \! Z! G6 c- g' {7 E+ w+ n3 K$ F9 j! ~5 i+ f" S

    0 D) \. S- `, G* d) P) _8 @                delay();4 Y- r6 D2 U+ U( m& B& g0 x
    4 K8 X( ~8 n+ n9 W5 R# c
    , D" ^6 y% j: R9 R; k
    / y$ i( k& m: L- J. e
                    LED->DATA =0x02;, t- y9 K* d7 r

    ; _$ I9 D% F% I- D  x
    / }( e6 H1 d4 L8 E8 F# n3 J1 l+ O' ~  {6 J: C4 @" O
                    delay();
    ' a: j5 p+ R2 @- P# P0 O& T/ N" M2 D( _6 A# x

    ! c% f7 A% r# O$ F2 d
    ' }3 Z6 U3 w) Y/ l# Q        }% C* j) a) t+ n, g7 r

    9 L* I& r% d" Z( K1 A$ {0 ^- H0 I4 O% J        return 0;* r  p% `9 G* A: z
    ) s% @- ?' E  h4 k$ f1 @
    }
    " \  Z2 n' {) I
    3 A" ^5 f  w& p3 ~  ]' P& W. Y1 r
      I  k5 V/ o/ x. ^; a5 K2 F) a9 b3 s* J1 c$ C( |
    void delay(void)& i8 }- ~4 M, T$ R

    2 [$ ]: A0 J" I9 S& a7 @  W2 u' L{5 u  l+ _- q5 T) s

    ; J3 m, D: N9 Q+ P        int i;
    ! s$ t" V& J8 @
    $ U9 [& X  h* t( f, g! k: b. r' {" w1 k$ |4 K5 z( @: i3 j

    . |, w$ |- }- R& c+ [/ B8 ?        for(i = 0; i < 400000; i++ );5 K8 S2 Z; J: r4 @  s/ x+ m* m
    : |/ x8 p- f' i" m3 \0 y: j& @
      _) R8 U: R' a! l* M4 d

    1 e) t& R, ~# `% U- K/ N+ }}
    4 C% Q' I+ @3 G- n+ X3 w1 S, v0 J' y' w% g8 O' J" E

    0 o8 {1 ~! u  k  l- j1 \7 k5 n: a. \4 ], X: e; @0 w4 N7 l
    ; [& @4 c; d$ m
    后来发现是delay函数中的变量 i 被编译器优化掉了,甚是郁闷,通过观察其他人的代码发现在变量声明的时候都会加上volatile,我也效仿了一下,在delay函数中声明变量 volatile int i;嘿,果然就好了。后来翻书找到了volatile的解释。如下:$ ~6 I# L# Q8 I$ A

    # ~7 Z) `' a& Q1 O7 T/ @& R  s' m* E, Zvoaltile用于强制某个实现屏蔽可能的优化。. h" ?' M: ~+ L* T/ r
    ( D+ Y( t" L# K9 I( Y8 [' \3 A

    6 a) W" v8 C* T/ u% u: a
      z8 {. e1 {9 x7 ?另外要注意的一点是,我使用的开发板上led灯灯饰阳极接电源,引脚拉低点亮,然而移位操作是用0补的,这就导致所有led灯都会一直亮。
    $ v4 L, l+ Y2 ?; p$ L8 b

    该用户从未签到

    2#
    发表于 2019-4-15 17:09 | 只看该作者
    讲的非常好 赞一个
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-8 23:03 , Processed in 0.140625 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表