Volatile關鍵字的應用範疇
1. 硬體暫存器,如狀態暫存器。
2. 多執行緒所共用的全域變數。
3. 中斷服務函式 (Interrupt Service Rountie,ISR)所使用的全域變數。
Volatile陷阱
想想底下範例是否有問題?
#include <stdio.h>
int square(volatile int *var)
{
return *var **var;
}
int main(void)
{
int var = 5;
printf("result: %d\n", square(&var));
return 0;
}
其問題在於square函式的平方算式,*var**var,此指令代表到var位址讀取其內容。然而,var位址可能儲存硬體暫存器,這些暫存器內容會隨時間而改變 (例如: 狀態暫存器),有可能第一次讀取的時候為4, 下一次讀取為5, 導致計算出來的值不正確。
因此,避免此錯誤發生便是在square函式宣告一local變數,看底下程式範例較為清楚:
#include <stdio.h>
int square(volatile int *var)
{
int local_var = *var;
return local_var * local_var;
}
int main(void)
{
int var = 5;
printf("result: %d\n", square(&var));
return 0;
}
【Reference】
[1] How to Use C's volatile Keyword
沒有留言:
張貼留言