系统调度函数 rt_schedule()中:
关中断后,获取就绪的最高优先级对应的线程,然后进行线程切换判断
(1)
如果目标线程不是当前线程,则要进行线程切换,具体操作是:
先切换上下文:
rt_hw_context_switch((rt_uint32_t)&from_thread->sp,(rt_uint32_t)&to_thread->sp);
再开中断:
rt_hw_interrupt_enable(level);
这里好理解,先切换上下文(线程切换),以免被中断打断,然后开中断;
(2)
如果目标线程是当前线程,则先开中断:
rt_hw_interrupt_enable(level);
再切换回到原线程继续执行
rt_hw_context_switch((rt_uint32_t)&from_thread->sp, (rt_uint32_t)&to_thread->sp);
可这里同样是线程切换(虽然是回到原线程,没有上下文的变更,但本质上讲,也是一次上下文切换,只不过是回到原来的堆栈环境开始执行),为什么要先开中断,再调用上下文切换rt_hw_context_switch()函数?回到原来线程的过程不用担心被打断吗?
更多回帖