在 FreeRTOS 的啟動過程中,SVC(Supervisor Call) 和 PendSV(Pendable Service Call) 是兩個關鍵的系統異常,分別用于 首次任務啟動 和 任務上下文切換。它們的協作確保了從內核初始化到多任務調度的平滑過渡。以下是詳細的工作流程分析(以 ARM Cortex-M 為例):
1. SVC 異常:啟動第一個任務
作用
- SVC 用于在特權模式下執行內核級操作,通常用于首次任務啟動(通過
vTaskStartScheduler()
觸發)。 - 在 FreeRTOS 中,SVC 僅在啟動時調用一次,后續切換由 PendSV 處理。
觸發時機
- 在
xPortStartScheduler()
中,通過匯編指令svc 0
手動觸發 SVC 異常。
執行流程
-
觸發 SVC:
void vTaskStartScheduler() {// ... 初始化 SysTick、空閑任務等xPortStartScheduler(); // 調用匯編函數觸發 SVC }
; ARM Cortex-M 匯編示例(port.c) xPortStartScheduler:svc 0 ; 手動觸發 SVC 異常bx lr ; 返回(