什么是全局中斷?全局中斷使能位控制著“所有”中斷,它如果關閉的話會屏蔽其它中斷,有人經常關閉它,防止其它中斷帶來干擾,比如在使用GPIO模擬某個時序時,在GPIO傳輸數據過程中,如果被某個中斷干擾,會導致時序不準確問題,通常的做法是關閉全局中斷,數據傳輸完成后打開全局中斷,同樣在RTOS中對全局變量的保護基本上都使用了全局中斷。
;匯編代碼如下:
cpsie i ;使能全局中斷
cpsid i ;關閉全局中斷
為了方便使用,在KEIL編譯器中經常使用如下C代碼,作用一樣的。
__disable_irq();
__enable_irq();
結合一個BUG來解釋一下全局中斷帶來的問題,我們的硬件設計方案是兩個處理器UART通訊,由于設計需要傳輸比較大的數據,必須要提高通訊速率,期望通訊速率能到1.5M,可是速率提上來了,BUG也出來了,表現是兩個處理器偶爾通信異常,有數據丟失問題。研究來研究去,確定最終原因就是全局中斷惹的禍,在擦寫內部Flash中使用了開關全局中斷,由于關中斷時間較長,導致串口接收FIFO溢出,數據丟失,可是擦寫Flash又必須開關中斷保護,這可咋整,解決辦法:由于我們的通訊協議是一問一答方式,于是把擦寫Flash操作移到收到指令之后,發送應答之前,解決了這個通訊問題。
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中對全局變量的保護都是用開關總中斷,怎么沒有問題?可以注意觀察一下,在RTOS中,全局中斷關閉時間都不是太長,而且嚴禁出現長時間關中斷,嚴禁出現關中斷時間不可控,這樣會影響實時性。來說一下什么是時間不可控,其實這種情況有很多種,比如,長鏈表操作、環形緩沖區操作、循環操作等等。代碼舉例說一下。
__disable_irq();
//這里的時間不能太長,否則會有潛在風險
__enable_irq();
//例如下面代碼:
__disable_irq();
for(i=0;i< Cnt;i++)
{
//太多的循環或者不定次數循環
//這里的時間不能確定
}
__enable_irq();
-
中斷
+關注
關注
5文章
900瀏覽量
41751 -
時序
+關注
關注
5文章
392瀏覽量
37427 -
keil
+關注
關注
69文章
1214瀏覽量
167273 -
編譯器
+關注
關注
1文章
1642瀏覽量
49284 -
GPIO
+關注
關注
16文章
1216瀏覽量
52377
發布評論請先 登錄
相關推薦
評論