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