freertos-interrupt-time.md 2.4 KB


type: concept title: FreeRTOS 中断管理与时间管理 tags: [freertos, rtos, interrupt, time, critical-section, concept]

created: 2026-07-12

FreeRTOS 中断管理与时间管理

中断管理

STM32 中断优先级通过高 4 位 [7:4] 配置,支持 16 级(0 最高,15 最低)。FreeRTOS 将 PendSV 和 SysTick 设为最低优先级(15),避免阻塞系统其他中断。

FreeRTOS 利用 BASEPRI 寄存器 实现中断管理:屏蔽优先级低于某阈值的中断。如 BASEPRI=0x50,则优先级 5~15 被屏蔽,0~4 正常执行。

BASEPRI interrupt management

中断服务函数中调用 FreeRTOS API 的规则:

  • 优先级需在 FreeRTOS 管理范围内(阈值由 configMAX_SYSCALL_INTERRUPT_PRIORITY 指定)
  • 使用带 FromISR 后缀的 API 函数

开关中断

#define portDISABLE_INTERRUPTS()  vPortRaiseBASEPRI()
#define portENABLE_INTERRUPTS()   vPortSetBASEPRI(0)

临界段代码

临界区是不被打断完整运行的代码段。进入关闭中断,退出开启中断。

函数 描述
taskENTER_CRITICAL() 进入临界段
taskEXIT_CRITICAL() 退出临界段
taskENTER_CRITICAL_FROM_ISR() 中断中进入临界段
taskEXIT_CRITICAL_FROM_ISR() 中断中退出临界段

使用嵌套计数器 uxCriticalNesting,只有所有临界段退出时才使能中断。

挂起调度器 vs 临界区

挂起调度器(vTaskSuspendAll())不关闭中断,仅防止任务间资源争夺,中断仍可直接响应。

时间片调度

同优先级任务轮流分享相同 CPU 时间(一个时间片 = SysTick 中断周期)。

配置项 说明
configUSE_TIME_SLICING 1: 使能时间片调度
configUSE_PREEMPTION 1: 抢占式调度

延时函数

API 函数 类型 特点
vTaskDelay() 相对延时 从调用开始计时,到期后进入就绪态
xTaskDelayUntil() 绝对延时 以任务运行周期为整体,适合固定频率执行的任务

Relative vs absolute delay

相关页面

  • [[source-freertos|尚硅谷 FreeRTOS 教程 - 资料页]]
  • [[freertos-task-api|任务 API 详解]]
  • [[freertos-ipc|任务间通信(IPC)]]