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

評論