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. 关键注意事项

  1. 中断优先级配置

    • 在 FreeRTOS 中,通常需要确保:

      • 系统中断(如 PendSV、SysTick)的优先级设置为最低(数值最大),以避免影响任务调度。

      • 用户中断的优先级合理分配,避免高优先级中断阻塞关键任务。

  2. 任务优先级设计

    • 高优先级任务应尽量短小(避免“任务饥饿”)。

    • 同优先级任务通过时间片轮转(Round-Robin)共享 CPU。

  3. 中断中调用 FreeRTOS API

    • 在中断服务程序(ISR)中调用 FreeRTOS API(如 xQueueSendFromISR)时,必须使用 带 FromISR 后缀的函数,且中断优先级不能过高。


常见问题

Q:为什么 FreeRTOS 的任务优先级和中断优先级规则相反?
  • 历史原因:不同硬件厂商对中断优先级的定义不同(如 ARM 的 NVIC 是数值越小优先级越高),而 FreeRTOS 选择更直观的“数值越大优先级越高”的任务规则。

Q:如何避免中断阻塞任务?
  • 将非紧急中断的优先级设置为较低(数值较大),确保高优先级任务能及时运行。

Q:中断优先级和任务优先级能重叠吗?
  • 不能。中断由硬件管理,任务由 FreeRTOS 管理,二者是独立的体系。


总结

  • 中断:硬件控制,数值越小优先级越高,绝对抢占任务。

  • 任务:FreeRTOS 控制,数值越大优先级越高,只能抢占低优先级任务。

  • 设计原则:合理分配中断和任务优先级,避免高优先级中断或任务长期阻塞系统。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐