<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > MCU上的無(wú)鎖原子讀操作

MCU上的無(wú)鎖原子讀操作

作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò ) 收藏
原子讀操作是在MCU并發(fā)編程中常用的操作,簡(jiǎn)單舉個(gè)例子來(lái)闡述問(wèn)題:

我們使用RTOS或裸機狀態(tài)編程時(shí),必然需要一個(gè)全局時(shí)鐘基準,通常是在一個(gè)定時(shí)器中斷中累加實(shí)現,簡(jiǎn)化代碼如下:

static unsigned long volatile __jiffies = 0; /* 全局時(shí)鐘基準節拍累加器 */

ISR_TIMER() /* 定時(shí)中斷服務(wù)函數 */
{
++__jiffies;
/* 其它代碼...: */
}

對于其中的__jiffies變量,就是全局時(shí)間基準,程序中其它地方都會(huì )對其進(jìn)行原子讀操作來(lái)判斷時(shí)間,典型的接口實(shí)現如下:

unsigned long get_jiffies(void)
{
unsigned long tmp;

CLOCK_IRQ_DIS(); /* 關(guān)定時(shí)中斷 */
tmp = __jiffies;
CLOCK_IRQ_EN(); /* 開(kāi)定時(shí)中斷 */

return tmp;
}

請注意,其中關(guān)于對中斷的開(kāi)關(guān)是對該定時(shí)中斷中所有代碼會(huì )帶來(lái)影響。如果在RTOS中,關(guān)中斷的時(shí)間是一種重要性能指標,決定了整個(gè)系統的中斷快速響應能力。
在此假設一個(gè)最艱難的架構,8位機(AVR、51等等),其上只有8位單字節數據的讀寫(xiě)是單指令原子的,其中unsigned long型在這樣的架構下是32位8字節。

根據各位朋友提出情況,進(jìn)行說(shuō)明:

1、有朋友認為讀操作沒(méi)必要關(guān)中斷.

這個(gè)顯然不可能,當你讀了32位變量任何一個(gè)字節的時(shí)候,剩下的7個(gè)字節都可能改變。

2、認為在中斷函數建立數據拷貝

這個(gè)理由同上,無(wú)論如何復制,都難以避免讀的瞬間數據被破壞

3、建立單字節原子鎖

該體系必須支持測試清零指令,而且就算支持。如果中斷里發(fā)現鎖被占有了,那這個(gè)周期還能進(jìn)行+1操作么?無(wú)論是用變量緩存還是丟棄,所記時(shí)間都不準了。


實(shí)現如下:
unsigned long get_jiffies(void)
{
unsigned long tmp;

do {
tmp = __jiffies;
} while(tmp != __jiffies);

return tmp
}

簡(jiǎn)單得大家可能都不相信,可以滿(mǎn)足任何MCU架構完成如上對__jiffies變量的操作(必須單核),大家可以仔細想想。
無(wú)鎖單讀單寫(xiě)隊列是MCU上經(jīng)常用的,對中斷通信接口的緩沖非常方便可靠。以此為基礎,可跨平臺實(shí)現。


關(guān)鍵詞: MCU無(wú)鎖原子讀操

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>