rt_interrupt_leave 中为什么没有像其他RTOS,例如ucosii ucosIII TencentOS 等在退出中断时进行调度?
我的理解是:
以上三个OS 都不允许在interruput_nest不为0时进行任务调度。
rt_thread 可以,是因为rt_thread主要支持cortex m处理器 可以用pendsv 来处理任务切换,pendsv会等待所有中断都退出了,才处理切换,所以无所谓嵌套层数吗?
ucosii ucosIII TencentOS还兼容其他架构的MCU,例如pic等,所以不允许中断在嵌套中进行调度?
rt_thread在中断后如果想进行任务切换,直接在中断中提交信号量、邮箱等使任务就绪,无所谓现在的嵌套层数,都可以进行任务切换,反正pendsv会退出所有中断后再进行任务切换。
不用像ucos检测嵌套层数,在退出所有嵌套的中断最后在提交任务切换。
可以这么理解吗?
你可以对比下非M的移植,也会检查的。
感谢解答
我看了一下2440 asm9260t
的移植,中断似乎工作再irq模式,不支持中断嵌套
rt_hw_context_switch_interrupt
并没有完成线程的切换,只是用全局变rt_interrupt_from_thread
和rt_interrupt_to_thread
保存了被换出和换入的线程的栈顶指针,而真正的切换过程在中断处理中IRQ_Handler完成。
并不是我问题里所说的 在中断退出前检测nest = 0,
再切换
楼主这里几个问题:
标题“rt_interrupt_leave 中为什么没有 在退出中断时进行调度“
对于M,不调度,通过触发PendSV来实现。
对于arm9这类,退出中断时检查是否需要调度。
“rt_hw_context_switch_interrupt并没有完成线程的切换”
没毛病,中断里面不可能直接切的。切的时机参考问题1。
ARM9没支持中断嵌套。如果你的ARM9的中断控制器改造了抢占式中断,可以考虑支持嵌套,但会比较麻烦,所以看你是否必要。