中断管理(Interrupt Management)
对中断管理的理解
RTOS中,配置了专门用于中断函数里面的API。(函数一般以FromISR结尾)
主要是考虑到中断回调函数不能运行长时间的指令,以写队列为例:
xQueueSendToBackFromISR区别与xQueueSendToBack,在参数上削减了等待时间,
主要是考虑到中断函数中不能有较长的等待时间。
在调度上,如果被唤醒的任务优先级更高,也不会即可调度,而是记录下来表示需要调度。
在阻塞问题上,如果写的队列是满的,FromISR函数会即刻返回错误信息,而不会进行阻塞等待。
主要API函数
xHigherPriorityTaskWoken参数
如果任务在运行的过程中,由于数据传输可能会导致高优先级的任务被唤醒,
并且高优先级的任务会抢占运行,在中断中我们是不希望发生这样的事情的。
可以看到,在任务中调用API函数可能导致任务阻塞、任务切换,这叫做”context switch”,上下文切
换。这个函数可能很长时间才返回,在函数的内部实现了任务切换。
xQueueSendToBackFromISR() 函数也可能导致任务切换,但是不会在函数内部进行切换,而是返回一
个参数:表示是否需要切换。
1 | BaseType_t xHigherPriorityTaskWoken = pdFALSE; |
在示例代码中,xHigherPriorityTaskWoken用于保存函数的结果,
在外部对该结果进行判断,是否需要执行任务调度。
外部中断触发定时器实例:
1 | void EXTI0_IRQHandler(void) |
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);代码为触发调度。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com