RTOS系列文章(2):PendSV功能,为什么需要PendSV
背景
大多數嵌入式RTOS在Cortex-M3/M4上的移植都需要PendSV,比如uCOS、RT-Thread、FreeRTOS等,本文就對PendSV的功能作用,以及為什么需要PendSV進行詳細的分析。
PendSV是什么?
我們先引用《Cortex-M3權威指南》對PendSV的介紹:
PendSV(可懸起的系統(tǒng)調用),它是一種CPU系統(tǒng)級別的異常,它可以像普通外設中斷一樣被懸起,而不會像SVC服務那樣,因為沒有及時響應處理,而觸發(fā)Fault。
個人理解PendSV的英文全稱應該是:Pend System Service Call,簡稱PendSV.
所以PendSV的最大特點就是,它是系統(tǒng)級別的異常,但它又天生支持【緩期執(zhí)行】。
PendSV使用場景
由于PendSV的特點就是支持【緩期執(zhí)行】,所以嵌入式OS可以利用它這個特點,進行任務調度過程的上下文切換。而為什么要使用【緩期執(zhí)行】的特點來進行上下文切換呢?簡單的說就是任何嵌入式RTOS,都需要盡量不打斷外設中斷。
我們來舉例說明,假如一個系統(tǒng)中有2個就緒的任務,上下文切換被切換的場合有:
沒有外部中斷,OS直接切換任務
假如我們在Systick中斷服務程序中,啟動上下文切換,流程圖如下:
上圖中,似乎一切都正常,任務調度很流暢,但現(xiàn)實總是很骨感的,不可能這么簡單,假如在產生異常時,CPU正在響應另一個中斷ISR1,而SysTick的優(yōu)先級又大于ISR1,在這種情況下,SysTick就會搶占ISR1,獲取CPU使用權,但是在SysTick中不能進行上下文切換,因為這將導致中斷ISR1被延遲,這在實時要求的系統(tǒng)中是不能容忍的,但是這個說辭只是為了方便理解,更重要的是:
在Cortex-M3中,如果OS在某個中斷活躍時,搶占了該中斷,而且又發(fā)生了任務調度,并執(zhí)行了任務,切換到了線程運行模式,將直接觸發(fā)Fault異常。
SysTick優(yōu)先級高于外部中斷,OS搶占IRQ進行任務調度觸發(fā)Fault
如下圖所示:
為了解決這個問題,早起的OS大多會檢測當前是否有中斷在活躍中,只有在無任何中斷需要響應時,才進行上下文切換,切換期間無法響應中斷。
這個時候,可能會有人想,既然有上面的原因限制,我能不能將SysTick的優(yōu)先級設置為最低,然后在SysTick中進行上下文切換,然后任務調度呢? 答案是:可以。這一點在Cortex-M3權威指南中沒有解釋,反而影響了很多讀者對于PendSV的理解。按照上面的思路,我們分析一下整體流程:
Systick中斷優(yōu)先級低與IRQ,任務調度流程
在上圖中我們可以看到,當OS的Systick中斷級別低于外部中斷時,確實不會觸發(fā)Fault,但是這帶來了一個問題:
一般OS在調度任務時,會關閉中斷,也就是進入臨界區(qū),而OS任務調度是要耗時的,這就會出現(xiàn)一種情況:
在任務調度期間,如果新的外部IRQ發(fā)生,CPU將不能夠快速響應處理。
將SysTick的優(yōu)先級調低,避免了觸發(fā)Fault的問題,但是會影響外部中斷IRQ的處理速度,那有沒有進一步優(yōu)化的方法呢?答案就是PenSV。因為PendSV有【緩期執(zhí)行】的特點,所以可以將上圖中的OS拆分,分成2段:
Systick、PendSV優(yōu)先級低,只在PendSV中進行上線文切換,任務調度
上述的流程就是目前常見的嵌入式RTOS的任務調度流程,uC/OS和FreeRTOS都會將Systick和PendSV的優(yōu)先級設置為最低。
到這里,可能會有人又有疑問,這樣做是不是也有缺點:
答案:確實存在這些問題,但是這些問題影響面已經很小了。我們能不能將SysTick的優(yōu)先級設置成最高,將PendSV的優(yōu)先級設置為低,就能完美的解決上述問題,我們不妨分析下這種情況:
這樣似乎解決了問題,但是又帶來了一個問題,因為SysTick的優(yōu)先級最高,而且又是周期性的觸發(fā),會導致經常搶占外部IRQ,這就會導致外部IRQ響應變慢,這在一些對實時性要求高的,比如按鍵、斷電中斷等待,是不能接受的,你肯定不希望你的按鍵掃描體驗卡頓。
所以,沒有十全十美的解決方案,關鍵是要看我們更關注什么?對于CPU來說,嵌入式OS也是一個程序,跟普通的裸機程序是一樣的,無非就是復雜一些,涉及到了手動切換堆棧、PC等高級操作而已,OS的優(yōu)先級天生就沒有外部中斷的優(yōu)先級高。
小結
總結
以上是生活随笔為你收集整理的RTOS系列文章(2):PendSV功能,为什么需要PendSV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉往事之治疗微信病
- 下一篇: 本地购物车实现