--- 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](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_basepri_interrupt.png) 中断服务函数中调用 FreeRTOS API 的规则: - 优先级需在 FreeRTOS 管理范围内(阈值由 `configMAX_SYSCALL_INTERRUPT_PRIORITY` 指定) - 使用带 `FromISR` 后缀的 API 函数 ### 开关中断 ```c #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](../raw/FreeRTOS/尚硅谷FreeRTOS教程/assets/freertos_delay_relative_vs_absolute.png) ## 相关页面 - [[source-freertos|尚硅谷 FreeRTOS 教程 - 资料页]] - [[freertos-task-api|任务 API 详解]] - [[freertos-ipc|任务间通信(IPC)]]