第一、 nvic和cm3處理器會根據優先順序的設定來控制搶占與巢狀行為。因此,在某個異常正在響應時,所有優先順序不高於它的異常都不能搶占之,而且它自己也不能搶占自己。
第二、 有了自動入棧和出棧,就不用擔心在中斷發生巢狀時,會使暫存器的資料損毀,從而可以放心地執行服務例程。因為所有服務例程都只使用主堆疊,因此對於中斷巢狀最關鍵的就是計算主堆疊的容量。每發生一次中斷巢狀至少需要八個字,且何時巢狀,巢狀多少級不可預知。
另一方面,是相同的異常是不允許重入的。因為每個異常都有自己的優先順序,並且在異常處理期間,同級或低優先順序的異常是要阻塞的。因此對於同乙個異常,只有在上次例項的服務例程執行完畢後,方可繼續響應新的請求。
ucos對於中斷巢狀,提供了兩個函式osintenter ()和osintexit ()
2.1 osintenter ()
void osintenter (void)
}}
osintnesting表示中斷巢狀的層數,該函式在isr開始呼叫以使ucos跟蹤中斷巢狀的層數。
呼叫osintenter應注意的地方
1、該函式呼叫時,應關閉所有中斷。
2、應用程式也可以不使用該函式而直接操作osintnesting,但還是得滿足1
3、osintenter和osintexit需成對使用
4、ucos支援255級中斷巢狀
2.2 osintexit()
void osintexit (void)
if (osintnesting == 0u) }}
os_exit_critical();
}}
該函式主要是用來告知ucos中斷isr服務已經完成。當最後一級中斷isr完成後,ucos將呼叫排程器進行任務切換。其中,還有一點就是當排程器被鎖的時候是不能完成排程的。
情況1假設系統有任務a、b 優先順序b>a。任務b在等待訊號量sem,系統正在執行任務a。在任務a執行過程成發生先後發生中斷int1,int2。其中int2優先順序大於int1。在int2的isr中釋放了b任務等待的訊號量sem。
假設在int2中使用排程器進行任務切換會發生什麼呢?
在任務a發生中斷時,m3自動入棧了r0-r3、r12,sp,lr和xspr。對於其他暫存器並沒有做處理,即使在int1中使用了除上述之外的暫存器,編譯器也只能將它們壓入到msp。如果在int2的isr中進行任務排程、任務b可以執行,當再次進行任務排程排程a時問題就出現了。因為任務a的r4-r11沒有入棧。排程器根本無法正確獲得任務的pc指標,程式只可能跑飛。
情況2假設系統有任務a、b 優先順序b>a。任務b在等待訊號量sem,系統正在執行任務a。在任務a執行過程成發生先後發生中斷int2。在int2的isr中又發生了int1,當int1優先順序小於int2,int1被掛起。int2的isr中釋放了b任務等待的訊號量sem。
假設在int2中使用排程器進行任務切換會發生什麼呢?
系統回到任務b之後,int1該怎麼辦了?或者在os_sw()執行到最後bx lr後,又要去響應int1?這個值得討論。
1、中斷巢狀:中斷巢狀只能發生在中斷服務子程式中,在中斷服務子程式執行過程中, 當有更高優先順序的中斷發生且此時中斷是開啟的,則將發生中斷巢狀 。
2、中斷服務程式通知任務做事是通過事件使任務處於就緒狀態,而並非立即進行任務切換,因為它們都是調os_sched(),而函式只能在所有中斷服務程式結束執行後才進行切換任務所以任何任務切換都不能發生在isr中,而必須等到所有isr 結束執行後,在osintexit()中進行.所以任何時刻ucosii只能有乙個任務處於執行態.
uC OS ii在M3中的任務切換與任務堆疊
1.1 m3入賬序列 1.2 加上手工入棧序列 systick為嵌入到核心中,優先順序比一般中斷優先順序高。若在一般中斷的isr執行過程中,發生了systick異常,則systick會搶占該isr。若此時systick做上下文切換,在m3中將觸發用法fault 在中斷活躍時嘗試切入執行緒模式 即使在...
基於BNF正規化的M3中Schema板架語言的解析
基於bnf正規化的m3中schema板架語言的解析 by eattonton 摘要 m3系統中提供了一套完整的板架引數化建模系統,基於這套系統為設計員提供了建立船體結構的基礎。隨著m3在我國造船工業中的廣泛應用,理解m3這套引數化系統的建模系統變得很有必要。引數化建模中除了提供了介面輸入引數外,還提...
STM32 M3 M0關於開關總中斷的問題
nvic 共支援 1 至 240 個外部中斷輸入 通常外部中斷寫作 irqs 具體的數值由晶元廠商在設計晶元時決定。此外,nvic 還支援乙個 永垂不朽 的不可遮蔽中斷 nmi 輸入。nmi 的實際功能亦由晶元製造商決定。在某些情況下,nmi 無法由外部中斷源控制。在 stm32 cortex m3...