【說在前面的話】
【正文】
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:將掩碼對應(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編譯器會用通用寄存器來保存)
uint32_t wTemp1 = s_wVPort; //!<步驟1.1 讀取s_wVPort
//! 對保存在通用寄存器中的值進行統(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,則對應(yīng)的寄存器可以定義為
#defineXXXXX_IO_REG ( *((volatile uint32_t*)XXXX_IO_REG_BASE_ADDRESS) )
考慮到這種情況,應(yīng)用中很多針對外設(shè)寄存器的連續(xù)操作都可以通過“手工窺孔優(yōu)化”來大幅度提高效率。如果可能(在保證程序邏輯正確的情況下),應(yīng)該盡可能減少volatile的使用;或者是限制其使用的范圍;萬不得已的情況下,則應(yīng)該對volatile參與的運算熱點進行“手工窺孔優(yōu)化”。