什么是 PendSV
定義:可懸起異常,如果我們把它配置為最低優(yōu)先級(jí),那么如果同時(shí)有多個(gè)異常被觸發(fā),他會(huì)再其他異常執(zhí)行完畢后再執(zhí)行,而且任何異常都可以打斷它。
PendSV典型使用場(chǎng)合是上下文切換時(shí)(在不同任務(wù)之間切換)上下文切換被觸發(fā)的場(chǎng)合可以是:
(1):執(zhí)行一個(gè)系統(tǒng)調(diào)用。 比如?? ??? ??? ??? ?OSSched(); ? // 執(zhí)行任務(wù)調(diào)用。
(2):系統(tǒng)滴答定時(shí)器(SYSTICK)中斷,(輪轉(zhuǎn)調(diào)度中需要)。
讓我們舉個(gè)簡(jiǎn)單的例子來輔助理解。假設(shè)有這么一個(gè)系統(tǒng),里面有兩個(gè)就緒的任務(wù),并且通過SysTick異常啟動(dòng)上下文切換。但若在產(chǎn)生 SysTick 異常時(shí)正在響應(yīng)一個(gè)中斷,則 SysTick異常會(huì)被別的異常搶斷。在這種情況下,OS是不能執(zhí)行上下文切換的,否則將使中斷請(qǐng)求被延遲,而且在真實(shí)系統(tǒng)中延遲時(shí)間還往往不可預(yù)知——任何有一丁點(diǎn)實(shí)時(shí)要求的系統(tǒng)都決不能容忍這 種事。因此,在 CM3 中也是嚴(yán)禁沒商量——如果 OS 在某中斷活躍時(shí)嘗試切入線程模式,將觸犯用法fault異常。
為解決此,早期的OS 大多會(huì)檢測(cè)當(dāng)前是否有中斷在活躍,只要無(wú)任何中斷響應(yīng)時(shí),才執(zhí)行上下文切換。然而這種方法的弊端在于,它回使任務(wù)切換 延遲很久(因?yàn)槿绻麚寯嗔?IRQ,則本次Systick 不得進(jìn)行上下文切換)。特別是當(dāng)中斷源的頻率和Systick一致,使得上下文切換遲遲不能運(yùn)行。現(xiàn)在使用PendSV異常會(huì)自動(dòng)延遲上下文請(qǐng)求,直到別的中斷都處理完了。如果OS檢測(cè)到某IRQ正在活動(dòng)并且被Systick搶占,他將懸起一個(gè)PendSV異常,以便緩期執(zhí)行上下文切換。
使用PendSV控制上下文切換 步驟如下:
1:任務(wù)A呼叫SVC ?請(qǐng)求任務(wù)切換 (等待某些工作完成)?? ??? ?OSTaskSemPend ((OS_TICK ? )等
2:OS收到請(qǐng)求,做好上下文準(zhǔn)備并且懸起一個(gè)PendSV異常
3當(dāng)CPU進(jìn)入SVC后,它立刻進(jìn)入PendSV,從而執(zhí)行上下文切換。
4當(dāng)PendSV切換完成,將返回任務(wù)B,同時(shí)進(jìn)入線程模式
5發(fā)生了一個(gè)中斷,并且中斷服務(wù)程序開始運(yùn)行。
6 在ISR執(zhí)行過程中,發(fā)生Systick異常,并且搶占了ISR
7OS執(zhí)行并要的操作,并且懸起PendSV以做好上下文切換準(zhǔn)備
8當(dāng)Systick中斷退出,回到先前被搶斷的中斷,ISR繼續(xù)執(zhí)行
9ISR執(zhí)行完畢,執(zhí)行PendSV上下文切換
10當(dāng)PendSV執(zhí)行完畢回到任務(wù)A同時(shí)系統(tǒng)再次進(jìn)入線程模式
uCOS的PendSV的處理代碼
在UCOS/PORT? os_cpu_a.s 中
?? ??? ??? ??? ??? ?
總結(jié)
以上是生活随笔為你收集整理的什么是 PendSV的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【瞎扯】树上差分的基本思路
- 下一篇: 2021年资料员-岗位技能(资料员)考试