V307中斷搶占問題

使用RT-thread,中斷結(jié)構(gòu)如下:


void app_timer_isr(void)

{

? ? GET_INT_SP();

? ? /* enter interrupt */

? ? rt_interrupt_enter();


? ? APP_TIM->INTFR = 0;

? ? NVIC_SetPendingIRQ(TIM7_IRQn);


? ? /* leave interrupt */

? ? rt_interrupt_leave();

? ? FREE_INT_SP();

}


兩個中斷優(yōu)先級分別為6和3。

當(dāng)中斷6被優(yōu)先級3搶占時,堆棧指針變化如下:


ISR.png

高優(yōu)先級的ISR3 堆棧指針和APP的SP相同,這正常嗎,會不會造成系統(tǒng)運行錯誤?



熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

是會有問題的,所以在使用RTOS時,最好不要使用中斷嵌套。


如果是這個解釋的話,這用法也就太狗血了。RTOS是提高任務(wù)實時性的,中斷用來實時響應(yīng)特殊事件,二選一的話RTOS顯然就沒意義了。


RISC-V和ARM CORTEX結(jié)構(gòu)不同,RISC-V官方不支持中斷嵌套的。

CORTEX具有MSP和PSP兩個棧,而RISC-V只有一個棧SP。

最好不使用中斷嵌套,而不是不能使用中斷。


您好,如果APP堆棧空間夠大的話,一般不會有問題的。一般不建議用中斷嵌套,若想用中斷嵌套,可將中斷函數(shù)入口改成統(tǒng)一入口,具體可參考CH582 FreeRTOS例程的配置方式,如下圖。

CH582 EVT:http://m.findthetime.net/downloads/CH583EVT_ZIP.html?

image.png



CH58x FreeRTOS例程在啟動文件里面關(guān)閉中斷嵌套。

CH32V307的啟動文件開啟中斷嵌套。我的理解,對于RTOS來說,雙堆棧并非必須,arm上面早期的RTOS也只用了MSP,無非是任務(wù)堆棧要考慮疊加中斷堆棧用量。 RISC-V中斷除了堆棧外還有其它隱性操作嗎?為什么會出現(xiàn)禁止中斷嵌套這種用法,原因是什么?


您好,并沒有禁用中斷嵌套,由于每個任務(wù)棧都需要考慮中斷棧大小,導(dǎo)致代碼出現(xiàn)錯誤的概率大大增加,所以推薦盡量不使用中斷嵌套,而不是禁用中斷嵌套。CH582中斷嵌套在啟動文件中默認(rèn)關(guān)閉,在每次進入中斷時,在第一級中斷中更改sp為中斷棧指針后,才會打開中斷嵌套。

image.png



只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频