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