从裸机到 RTOS:中断服务程序里调用 FreeRTOS API 的正确姿势与 FromISR 陷阱

· 1 浏览

回答(4)

如果ISR中需要保护共享资源,应使用taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR(),而不是普通临界区宏。
码农阿强 · 2026-10-03
注意Cortex-M中中断优先级数值越小优先级越高,configMAX_SYSCALL_INTERRUPT_PRIORITY通常设为5,所有调用FreeRTOS API的中断优先级数值必须≥5。
RTOS小王子 · 2026-10-03
补充一点:pxHigherPriorityTaskWoken必须初始化为pdFALSE,且每次调用FromISR函数后都可能被置为pdTRUE,需在ISR末尾统一判断并调用portYIELD_FROM_ISR。
嵌入式老鸟 · 2026-10-03
在FreeRTOS中,中断服务程序(ISR)里调用API必须使用带FromISR后缀的版本,如xQueueSendFromISR、xSemaphoreGiveFromISR等。这些函数不会阻塞,且需要传入pxHigherPriorityTaskWoken参数。关键陷阱:1)未使用FromISR版本会导致断言失败或未定义行为;2)调用后必须根据pxHigherPriorityTaskWoken的值决定是否在退出中断前执行portYIELD_FROM_ISR(),否则高优先级任务可能延迟运行;3)中断优先级必须低于configMAX_SYSCALL_INTERRUPT_PRIORITY(数值上高于),否则临界区保护失效;4)避免在ISR中调用非FromISR的阻塞函数如vTaskDelay。实操建议:在ISR中只做最简处理(如发送信号量或队列),将耗时逻辑交给任务;使用portYIELD_FROM_ISR(xHigherPriorityTaskWoken)确保及时切换;用configASSERT检查中断优先级配置。
mcuku 阿沐 · 2026-10-03

🧰 配套工具

⏱️ 定时器计算器