PendSV異常介紹、用於上下文切換


在這里,非常感謝《cortex-cm3權威指南》的翻譯者。

 

PendSV 的典型使用場合是在上下文切換時(在不同任務之間切換)。 例如, 一個系統中有兩個就緒的任務,上下文切換被觸發的場合可以是:

1 執行一個系統調用

2 系統滴答定時器(SYSTICK)中斷,(輪轉調度中需要)

讓我們舉個簡單的例子來輔助理解。假設有這么一個系統,里面有兩個就緒的任務,並且通過 SysTick 異常啟動上下文切換。如圖 7.15 所示。

上圖是兩個任務輪轉調度的示意圖。但若在產生 SysTick 異常時正在響應一個中斷,則SysTick 異常會搶占其 ISR。在這種情況下, OS 不得執行上下文切換,否則將使中斷請求被延遲,而且在真實系統中延遲時間還往往不可預知——任何有一丁點實時要求的系統都決不能容忍這種事。因此,在 CM3 中也是嚴禁沒商量——如果 OS 在某中斷活躍時嘗試切入線程模式,將觸犯用法 fault 異常。

為解決此問題,早期的 OS 大多會檢測當前是否有中斷在活躍中,只有沒有任何中斷需要響應時,才執行上下文切換(切換期間無法響應中斷)。然而,這種方法的弊端在於,它可以把任務切換動作拖延很久(因為如果搶占了 IRQ,則本次 SysTick 在執行后不得作上下

文切換,只能等待下一次 SysTick 異常),尤其是當某中斷源的頻率和 SysTick 異常的頻率比較接近時,會發生“共振”。

 

現在好了, PendSV 來完美解決這個問題了。PendSV 異常會自動延遲上下文切換的請求,

直到其它的 ISR 都完成了處理后才放行。為實現這個機制,需要把 PendSV 編程為最低優先級的異常。如果 OS 檢測到某 IRQ 正在活動並且被 SysTick 搶占,它將懸起一個 PendSV 異常,以便緩期執行上下文切換。如圖 7.17 所示:

 

個中事件的流水賬記錄如下:

1. 任務 A 呼叫 SVC 來請求任務切換(例如,等待某些工作完成)

2. OS 接收到請求,做好上下文切換的准備,並且 pend 一個 PendSV 異常。

3. 當 CPU 退出 SVC 后,它立即進入 PendSV,從而執行上下文切換。

4. 當 PendSV 執行完畢后,將返回到任務 B,同時進入線程模式。

5. 發生了一個中斷,並且中斷服務程序開始執行

6. 在 ISR 執行過程中,發生 SysTick 異常,並且搶占了該 ISR。

7. OS 執行必要的操作,然后 pend 起 PendSV 異常以作好上下文切換的准備。

8. 當 SysTick 退出后,回到先前被搶占的 ISR 中, ISR 繼續執行

9. ISR 執行完畢並退出后, PendSV 服務例程開始執行,並且在里面執行上下文切換

10. 當 PendSV 執行完畢后,回到任務 A,同時系統再次進入線程模式。

 

這就是PendSV切換上下文的介紹!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM