嵌入式技术william hill官网
直播中

张健

7年用户 1358经验值
私信 关注
[问答]

造成rt_schedule()中线程切换与开中断时机的原因是什么

系统调度函数 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()函数?回到原来线程的过程不用担心被打断吗?

回帖(2)

张波

2022-9-23 11:06:09
可这里同样是线程切换
1.jpg
举报

王秀珍

2022-9-23 11:06:23
额,你看的是哪一版的代码呀?

4.0.2版本中,to_thread和current不一致,且中断嵌套为0时才调用rt_hw_context_switch切换,然后开中断;如果相同,只是简单从就绪列表中移除了。

你是不是将rt_hw_context_switch_interrupt错看成了rt_hw_context_switch?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分