什么是全局中斷?全局中斷使能位控制著“所有”中斷,它如果關(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è)計方案是兩個處理器UART通訊,由于設(shè)計需要傳輸比較大的數(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)中斷時間不可控,這樣會影響實時性。來說一下什么是時間不可控,其實這種情況有很多種,比如,長鏈表操作、環(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文章
895瀏覽量
41395 -
時序
+關(guān)注
關(guān)注
5文章
386瀏覽量
37281 -
keil
+關(guān)注
關(guān)注
68文章
1212瀏覽量
166688 -
編譯器
+關(guān)注
關(guān)注
1文章
1618瀏覽量
49052 -
GPIO
+關(guān)注
關(guān)注
16文章
1196瀏覽量
51919
發(fā)布評論請先 登錄
相關(guān)推薦
評論