護和恢複的需要;
3、編寫(xie) 中斷服務程序的一些基本原則:
√避免在中斷服務程序中做浮點運算:好的終端讀物程序應該遵循短小有效這一原則,在中斷服務程序中做浮點運算大大違背這一原則,同時有些處理器/編譯器就是不允許在中斷服務程序中做浮點運算;
√中斷服務程序不能有返回值:所以中斷服務程序都定義(yi) 為(wei) 返回類型為(wei) void,即:void _irq Eint0_ISR(void);
√中斷服務函數不能傳(chuan) 遞參數:故參數列表為(wei) void,即:void _irq Eint0_ISR(void);
4、Static:
一個(ge) static變量,其實就是全局變量,隻不過它有作用域,它可用於(yu) 保存變量所在函數被類此調用期間的中間狀態,比如:
int cCout()
{
Static int loop = 0;
.......
loop++;
.......
}
loop變量的值會(hui) 跟隨著函數的調用次數而遞增,函數退出後,loop的值還存在,隻是loop隻能在函數中才能被訪問(函數作用域),而loop的內(nei) 存空間也隻會(hui) 在函數第一次被調用時才會(hui) 被分配和初始化,以後每次進入函數,都不為(wei) static分配了,而直接使用上一次的值。在模塊內(nei) ,一個(ge) 被聲明為(wei) 靜態的函數隻可被這一模塊內(nei) 的其他函數調用,模塊外其它函數無權訪問,是一個(ge) 本地全局變量。
5、Constant:
將一個(ge) 變量或對象定義(yi) 成constant類型,則定義(yi) 之後不能被更新(可讀不可寫(xie) ),即在定義(yi) 或說明類型時必須給他一個(ge) 初始值。
幾種須要注意的地方:
√如果const位於(yu) 星號(*)的左側(ce) ,則const修飾指針所指向的變量,即指針指向常量;如:const int *a; 或int const *a;這兩(liang) 種情況相同(cost放在變量聲明符的位置無關(guan) ),指針指向一個(ge) 常量,此時不能對內(nei) 容進行更改,即不能有寫(xie) 操作語句*a=3;
√如果cost位於(yu) 型號的右側(ce) ,cost就是修飾指針本身,即指針本身是常量;如:int* const a;語句表示指針本身是常量,所指向內(nei) 容不是常量,即a++是錯誤的。
√如果星號左右側(ce) 都有const修飾,如:const int* const a;表示指針本身和指針指向的內(nei) 容均為(wei) 常量。
6.、Volatile:
定義(yi) 一個(ge) 易失性變量,編譯器有一種技術叫數據流分析,分析程序中的變量在哪裏被賦值、在哪裏使用、在哪裏失效,分析結果可以用於(yu) 常量合並,常量傳(chuan) 播等優(you) 化。當編譯器檢查到代碼沒有修改字段的值,就有可能在你訪問字段時提供上次訪問的緩存值,這能夠提高程序的效率,但有時這些優(you) 化會(hui) 帶來問題,不是我們(men) 程序所需要的,特點是對硬件寄存器操作的程序,這時可以用volatile關(guan) 鍵字禁止做這些優(you) 化。
使用volatile變量的場合:
√硬件寄存器通常要加volatile說明,因為(wei) 每次對它的讀寫(xie) 都可能有不同的意義(yi) ;
√在中斷服務程序中修改的供其他程序檢測用的變量需要加volatile聲明;否則編譯器可能對變量更新一次後每次都使用緩存值不再立即更新;
√多任務環境下各任務間共享的標誌應該加voatile關(guan) 鍵字:在多線程訪問某字段時,代碼希望這些訪問能夠操作到操作(讀取)到字段的最新值,同時寫(xie) 到變量的操作能立即更新;對字段加上volatile關(guan) 鍵字,那麽(me) 對該字段的任何請求(讀/寫(xie) )都會(hui) 立刻得到執行。