FreeRTOS的中断管理核心思想是中断服务程序尽可能的简短,只处理紧急的任务,将负责的工作交给任务去做。
核心原则:延迟处理
在实时操作系统中,中断优先级最高,会立即打断当前运行的任务,因此中断服务程序过长可能会导致其他低优先级任务被长时间遮蔽,系统响应性变低;任务调度被推迟,破坏任务实时性。
通过延迟处理:
ISR只负责应答硬件、清除中断标志和读取数据等紧急操作。
任务负责处理数据、处理复杂逻辑等操作
关键机制:FromISR API
FreeRTOS为几乎所有可以在中断中调用的函数提供了一个以FromISR结尾的版本。
普通的API在结束时可能会检查是否需要进行一次上下文切换,在ISR内部,不能进行上下文切换,因为直接切换可能会导致调度上的混乱。
以FromISR结尾的API不会直接切换上下文,会返回一个xHigherPriorityTaskWoken的参数。
该参数初始化的值为pdFALSE,如果在执行FromISR API时,解除阻塞了一个任务,并且该任务优先级高于被中断的任务,参数值会被设为pdTRUE。
中断处理流程
1.硬件中断发生,CPU跳转到对应的ISR。
2.ISR开始执行,进行必要的硬件操作
3.ISR调用FromISR的API
4.ISR结束前,检查xHigherPriorityTaskWoken的值,并调用poerYIELD_FROM_ISR();如果xHigherPriorityTaskWoken==pdTRUE,就会触发一次中断退出时的上下文切换,让更高优先级的任务立刻执行,而不是返回到被中断的任务;如果==pdFALSE,则正常返回到被中断的任务
573

被折叠的 条评论
为什么被折叠?



