漫談C變量——優(yōu)化天敵“volatile”
【說在前面的話】
【正文】
static volatile uint32_t s_wVPort = 0;
void set_vport_u8(uint8_t chValue, uint8_t chOffset)
{
uint32_t wMask = 0xFF <<chOffset; //!<獲取正確的掩碼
s_wVPort &= ~wMask; //!<步驟1:將掩碼對(duì)應(yīng)的位置清零
s_wVPort |= ((uint32_t)chValue<<chOffset); //!<步驟2:設(shè)置新值到虛擬端口
}
void set_vport_u8(uint8_t chValue, uint8_t chOffset)
{
uint32_t wMask = 0xFF <<chOffset; //!<獲取正確的掩碼
//! s_wVPort&= ~wMask; 的等效展開
uint32_t wTemp1 = s_wVPort; //!<步驟1.1 讀取s_wVPort
wTemp1 &= ~wMask; //!<步驟1.2 改寫wTemp1
s_wVPort = wTemp1; //!<步驟1.3 將wTemp1寫回s_wVPort
//! s_wVPort |= ((uint32_t)chValue<<chOffset);的等效展開
uint32_t wTemp1 = s_wVPort; //!<步驟2.1 讀取s_wVPort
wTemp1 |= ((uint32_t)chValue<<chOffset); //!<步驟2.2 改寫wTemp1
s_wVPort = wTemp1; //!<步驟2.3 將wTemp1寫回s_wVPort
}
void set_vport_u8(uint8_t chValue, uint8_t chOffset)
{
uint32_t wMask = 0xFF <<chOffset; //!<獲取正確的掩碼
//! 將s_wVPort讀取到通用寄存器中(wTemp1編譯器會(huì)用通用寄存器來保存)
uint32_t wTemp1 = s_wVPort; //!<步驟1.1 讀取s_wVPort
//! 對(duì)保存在通用寄存器中的值進(jìn)行統(tǒng)一修改
wTemp1 &= ~wMask; //!<步驟1.2 改寫wTemp1
wTemp1 |= ((uint32_t)chValue<<chOffset); //!<步驟2.2 改寫wTemp1
//! 將修改后的值寫回s_wVPort
s_wVPort = wTemp1; //!<步驟2.3 將wTemp1寫回s_wVPort
}
//!已知某32位外設(shè)寄存器的地址為 XXXXX_IO_REG_BASE_ADDRESS,則對(duì)應(yīng)的寄存器可以定義為
#defineXXXXX_IO_REG ( *((volatile uint32_t*)XXXX_IO_REG_BASE_ADDRESS) )
考慮到這種情況,應(yīng)用中很多針對(duì)外設(shè)寄存器的連續(xù)操作都可以通過“手工窺孔優(yōu)化”來大幅度提高效率。如果可能(在保證程序邏輯正確的情況下),應(yīng)該盡可能減少volatile的使用;或者是限制其使用的范圍;萬不得已的情況下,則應(yīng)該對(duì)volatile參與的運(yùn)算熱點(diǎn)進(jìn)行“手工窺孔優(yōu)化”。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請(qǐng)聯(lián)系我們,謝謝!