由此可見(C語言volatile關鍵字詳解),編譯器優化會對自定義延時程序有影響,我們深入彙編程序去探討產生怎樣的影響!
首先是未加 volatie 使用和未使用編譯器優化彙編程序的對比:
有以下這麼一個源程序(delay.c):
#include <stdio.h>
void delay(long val);
int main(){
delay(1000000);
return 0;
}
void delay(long val){
while(val--);
}
分別選擇編譯器優化(-O2)以及編譯器不優化(默認)進行彙編,對比彙編代碼:
編譯器優化:arm-linux-gcc -O2 -S -o delay_opt1.s delay.c
編譯器不優化:arm-linux-gcc -S -o delay.s delay.c
小結:
由彙編程序我們可以看到,優化之後的 delay 函數僅僅只有函數跳轉指令,自然而然就失去粗延時的效果了。
然後我們加上 volatile 之後呢?
用這麼一個源程序(delay_volatile.c):
#include <stdio.h>
void delay(long val);
int main(){
delay(1000000);
return 0;
}
void delay(volatile long val){
while(val--);
}
分別選擇編譯器優化(-O2)以及編譯器不優化(默認)進行彙編,對比彙編代碼:
編譯器優化:arm-linux-gcc -O2 -S -o delay_opt2.s delay_volatile.c
編譯器不優化:arm-linux-gcc -S -o delay2.s delay_volatile.c
小結:
1.自定義延時函數中使用 volatile 去聲明 val 變量可以解決編譯器優化帶來的延時失效問題;
2.編譯器優化可以使代碼更加精煉,執行效率更高。