在 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 ; 返回(