type: concept title: FreeRTOS 中断管理与时间管理 tags: [freertos, rtos, interrupt, time, critical-section, concept]
STM32 中断优先级通过高 4 位 [7:4] 配置,支持 16 级(0 最高,15 最低)。FreeRTOS 将 PendSV 和 SysTick 设为最低优先级(15),避免阻塞系统其他中断。
FreeRTOS 利用 BASEPRI 寄存器 实现中断管理:屏蔽优先级低于某阈值的中断。如 BASEPRI=0x50,则优先级 5~15 被屏蔽,0~4 正常执行。
中断服务函数中调用 FreeRTOS API 的规则:
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,只有所有临界段退出时才使能中断。
挂起调度器(vTaskSuspendAll())不关闭中断,仅防止任务间资源争夺,中断仍可直接响应。
同优先级任务轮流分享相同 CPU 时间(一个时间片 = SysTick 中断周期)。
| 配置项 | 说明 |
|---|---|
configUSE_TIME_SLICING |
1: 使能时间片调度 |
configUSE_PREEMPTION |
1: 抢占式调度 |
| API 函数 | 类型 | 特点 |
|---|---|---|
vTaskDelay() |
相对延时 | 从调用开始计时,到期后进入就绪态 |
xTaskDelayUntil() |
绝对延时 | 以任务运行周期为整体,适合固定频率执行的任务 |