Xiao's Blog

Sep 30, 2025

FreeRTOS中的SysTick、SVCall和Pend

1. SysTick

简介

  • SysTick 是 Cortex-M 系列专用的系统定时器中断。
  • 通常用于周期性地触发中断,时间间隔可以配置(比如每 1ms)。
  • 优先级可以设置,通常高于 PendSV。

在 FreeRTOS 中的用途

  • 系统时钟节拍(tick):FreeRTOS 用 SysTick 定时器生成操作系统节拍(OS Tick),即系统“心跳”。
  • 每当 SysTick 中断发生时,FreeRTOS 增加 tick 计数器,判断是否有延时任务需要唤醒,并决定是否触发任务切换(如果有高优先级任务就绪)。
  • 主要代码位于 SysTick_Handler,会调用 xPortSysTickHandler()

2. SVCall

简介

  • SVCall(Supervisor Call)是一个软件触发的中断,通过执行 SVC 指令产生。
  • 用于实现特权级操作或系统服务调用。

在 FreeRTOS 中的用途

  • 在一些 FreeRTOS 端口(如 ARM Cortex-M)中,SVCall 可用于进入或退出特权级模式,实现系统调用。
  • 比如在支持 MPU(内存保护单元)的端口,FreeRTOS 通过 SVC 切换任务的权限级别。
  • 在多数基础 FreeRTOS 用法中,SVCall用得较少,主要用于安全相关或特权切换场景。

3. PendSV

简介

  • PendSV(Pendable Service Call)是 Cortex-M 专有的、优先级最低的系统异常。
  • 只能由软件设置挂起,不能被硬件自动触发。
  • 设计目标:专用于 RTOS 的任务上下文切换。

在 FreeRTOS 中的用途

  • 任务切换(上下文切换):FreeRTOS 通过挂起 PendSV (SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk),实现任务切换的时机控制。
  • 当需要切换任务时(如更高优先级任务就绪或主动 yield),调度器会触发 PendSV。
  • PendSV 的异常处理函数会保存当前任务现场、恢复下一个任务现场,完成任务切换。

总结表格

异常名 Cortex-M作用 FreeRTOS用途
SysTick 周期性定时器中断 产生OS节拍,管理任务延时和唤醒
SVCall 软件触发的系统调用 进入/退出特权级,安全相关
PendSV 挂起服务异常 任务上下文切换(切换任务)
OLDER > < NEWER