freertos系统优先级
1、中断优先级和任务优先级没有任何关系,中断的优先级高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。的任务优先级是,任务优先级数值越小,优先级越低。2、中断优先级数值越小,优先级就越高。
1. 中断优先级(硬件决定)
-
规则:数值越小,优先级越高(与 FreeRTOS 任务优先级相反)。
-
例如:中断优先级
0> 中断优先级1> 中断优先级2。
-
-
特点:
-
由硬件(如 ARM Cortex-M 的 NVIC)管理,与 FreeRTOS 无关。
-
中断的优先级始终高于任何任务。即使任务优先级是 FreeRTOS 的最高级(如
configMAX_PRIORITIES-1),也抢不过中断。 -
中断可以抢占正在执行的任务,但 不能抢占更高优先级的中断。
-
示例(ARM Cortex-M)
c
// 设置中断优先级(数值越小优先级越高) NVIC_SetPriority(USART1_IRQn, 1); // USART1 中断优先级 = 1 NVIC_SetPriority(TIM2_IRQn, 0); // TIM2 中断优先级 = 0(更高)
此时,TIM2 中断会抢占 USART1 中断。
2. FreeRTOS 任务优先级(软件决定)
-
规则:数值越大,优先级越高(与中断优先级相反)。
-
例如:任务优先级
3> 任务优先级2> 任务优先级1。
-
-
特点:
-
由 FreeRTOS 调度器管理,范围是
0(最低)到configMAX_PRIORITIES-1(最高)。 -
任务不能抢占中断,但高优先级任务可以抢占低优先级任务。
-
示例(FreeRTOS 任务)
c
xTaskCreate(Task1, "Task1", 100, NULL, 1, NULL); // 优先级 1(低) xTaskCreate(Task2, "Task2", 100, NULL, 3, NULL); // 优先级 3(高)
此时,Task2 会抢占 Task1,但两者都会被任何中断抢占。
3. 中断与任务优先级的对比
| 特性 | 中断优先级 | FreeRTOS 任务优先级 |
|---|---|---|
| 优先级规则 | 数值越小,优先级越高 | 数值越大,优先级越高 |
| 范围 | 由硬件决定(如 0~15) | 由 configMAX_PRIORITIES 决定 |
| 抢占关系 | 中断 > 所有任务 | 高优先级任务 > 低优先级任务 |
| 管理方 | 硬件(NVIC) | FreeRTOS 调度器 |
4. 关键注意事项
-
中断优先级配置
-
在 FreeRTOS 中,通常需要确保:
-
系统中断(如 PendSV、SysTick)的优先级设置为最低(数值最大),以避免影响任务调度。
-
用户中断的优先级合理分配,避免高优先级中断阻塞关键任务。
-
-
-
任务优先级设计
-
高优先级任务应尽量短小(避免“任务饥饿”)。
-
同优先级任务通过时间片轮转(Round-Robin)共享 CPU。
-
-
中断中调用 FreeRTOS API
-
在中断服务程序(ISR)中调用 FreeRTOS API(如
xQueueSendFromISR)时,必须使用 带FromISR后缀的函数,且中断优先级不能过高。
-
常见问题
Q:为什么 FreeRTOS 的任务优先级和中断优先级规则相反?
-
历史原因:不同硬件厂商对中断优先级的定义不同(如 ARM 的 NVIC 是数值越小优先级越高),而 FreeRTOS 选择更直观的“数值越大优先级越高”的任务规则。
Q:如何避免中断阻塞任务?
-
将非紧急中断的优先级设置为较低(数值较大),确保高优先级任务能及时运行。
Q:中断优先级和任务优先级能重叠吗?
-
不能。中断由硬件管理,任务由 FreeRTOS 管理,二者是独立的体系。
总结
-
中断:硬件控制,数值越小优先级越高,绝对抢占任务。
-
任务:FreeRTOS 控制,数值越大优先级越高,只能抢占低优先级任务。
-
设计原则:合理分配中断和任务优先级,避免高优先级中断或任务长期阻塞系统。
更多推荐



所有评论(0)