TA的每日心情 | 开心 2019-11-19 15:19 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
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 |
|