什么是全局中斷?全局中斷使能位控制著“所有”中斷,它如果關(guān)閉的話會(huì)屏蔽其它中斷,有人經(jīng)常關(guān)閉它,防止其它中斷帶來(lái)干擾,比如在使用GPIO模擬某個(gè)時(shí)序時(shí),在GPIO傳輸數(shù)據(jù)過(guò)程中,如果被某個(gè)中斷干擾,會(huì)導(dǎo)致時(shí)序不準(zhǔn)確問(wèn)題,通常的做法是關(guān)閉全局中斷,數(shù)據(jù)傳輸完成后打開(kāi)全局中斷,同樣在RTOS中對(duì)全局變量的保護(hù)基本上都使用了全局中斷。
;匯編代碼如下:
cpsie i ;使能全局中斷
cpsid i ;關(guān)閉全局中斷
為了方便使用,在KEIL編譯器中經(jīng)常使用如下C代碼,作用一樣的。
__disable_irq();
__enable_irq();
結(jié)合一個(gè)BUG來(lái)解釋一下全局中斷帶來(lái)的問(wèn)題,我們的硬件設(shè)計(jì)方案是兩個(gè)處理器UART通訊,由于設(shè)計(jì)需要傳輸比較大的數(shù)據(jù),必須要提高通訊速率,期望通訊速率能到1.5M,可是速率提上來(lái)了,BUG也出來(lái)了,表現(xiàn)是兩個(gè)處理器偶爾通信異常,有數(shù)據(jù)丟失問(wèn)題。研究來(lái)研究去,確定最終原因就是全局中斷惹的禍,在擦寫內(nèi)部Flash中使用了開(kāi)關(guān)全局中斷,由于關(guān)中斷時(shí)間較長(zhǎng),導(dǎo)致串口接收FIFO溢出,數(shù)據(jù)丟失,可是擦寫Flash又必須開(kāi)關(guān)中斷保護(hù),這可咋整,解決辦法:由于我們的通訊協(xié)議是一問(wèn)一答方式,于是把擦寫Flash操作移到收到指令之后,發(fā)送應(yīng)答之前,解決了這個(gè)通訊問(wèn)題。
uint8_t FLASH_EraseSector(uint32_t sectorAddress)
{
uint8_t ret;
__disable_irq();
__disable_fault_irq();
ret = EraseSector(NULL, sectorAddress);
__enable_fault_irq();
__enable_irq();
return ret;
}
有朋友說(shuō)了,RTOS中對(duì)全局變量的保護(hù)都是用開(kāi)關(guān)總中斷,怎么沒(méi)有問(wèn)題?可以注意觀察一下,在RTOS中,全局中斷關(guān)閉時(shí)間都不是太長(zhǎng),而且嚴(yán)禁出現(xiàn)長(zhǎng)時(shí)間關(guān)中斷,嚴(yán)禁出現(xiàn)關(guān)中斷時(shí)間不可控,這樣會(huì)影響實(shí)時(shí)性。來(lái)說(shuō)一下什么是時(shí)間不可控,其實(shí)這種情況有很多種,比如,長(zhǎng)鏈表操作、環(huán)形緩沖區(qū)操作、循環(huán)操作等等。代碼舉例說(shuō)一下。
__disable_irq();
//這里的時(shí)間不能太長(zhǎng),否則會(huì)有潛在風(fēng)險(xiǎn)
__enable_irq();
//例如下面代碼:
__disable_irq();
for(i=0;i< Cnt;i++)
{
//太多的循環(huán)或者不定次數(shù)循環(huán)
//這里的時(shí)間不能確定
}
__enable_irq();
-
中斷
+關(guān)注
關(guān)注
5文章
902瀏覽量
42329 -
時(shí)序
+關(guān)注
關(guān)注
5文章
395瀏覽量
37709 -
keil
+關(guān)注
關(guān)注
69文章
1217瀏覽量
168447 -
編譯器
+關(guān)注
關(guān)注
1文章
1651瀏覽量
49707 -
GPIO
+關(guān)注
關(guān)注
16文章
1236瀏覽量
53243
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何利用STM32CubeMX生成的keil項(xiàng)目如何關(guān)閉全局中斷?
硬件操作關(guān)全局中斷
在和解nvm驅(qū)動(dòng)程序中禁用全局中斷
UCOSiii中斷管理中關(guān)閉全局中斷是什么意思?
STM32關(guān)全局中斷和開(kāi)全局中斷有多種方法
STM32 BootLoader關(guān)閉全局中斷的過(guò)程
請(qǐng)問(wèn)ch32v103如何使用全局中斷?
中斷-CH32V103如何關(guān)閉全局中斷
STM32關(guān)全局中斷的方法 STM32中斷類型
stm8中斷中不能隨意關(guān)閉或使能全局中斷

評(píng)論