【OS】FreeRTOS的API有FromISR的区分
FreeRTOS的任务调度依赖定时器中断触发默认使用systick中断优先级最低就RTOS而言定时器可以不用systick优先级最好是中等偏上。那么在别的中断里对于OS的API使用一定要有管理否则会破坏上下文的切换影响系统运行。FreeRTOS的方案是configMAX_SYSCALL_INTERRUPT_PRIORITY优先级管理API分带FromISR如xQueueSendFromISR和不带FromISR如xQueueSend的版本只能在可管理的优先级范围内的中断中调用FromISR的API除此之外都可能破坏内核数据结构的完整性和调度逻辑的一致性。RT-Thread是在中断处理的开始和结束加入rt_interrupt_enter();和rt_interrupt_leave();补充FromISR版本的API做了特殊设计禁止阻塞操作普通任务API如xQueueSend可能因资源未就绪而阻塞当前任务例如队列满时等待空间但ISR中绝对不允许阻塞ISR无法被调度器挂起。因此FromISR版本的API从不阻塞操作失败时会立即返回错误码如errQUEUE_FULL。简化调度逻辑任务API可能在操作后主动触发任务调度如释放信号量后唤醒高优先级任务但ISR中不能直接调用调度器可能导致栈冲突或状态不一致。FromISR版本的API会通过一个输出参数如pxHigherPriorityTaskWoken告知ISR是否需要在退出后触发一次调度。ISR结束前需根据该参数决定是否调用portYIELD_FROM_ISR()触发调度。原子操作与临界区优化ISR可能打断任务的执行FromISR版本的API会使用更轻量的临界区保护如关闭特定中断而非全局中断或通过原子操作减少对系统响应性的影响避免普通API中可能的重入问题。