完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
系统时基更新函数 void rt_tick_increase(void) 涉及时间片调度:在rt_thread_yield()中进行 问题:1、 但是如果一个tick中断到来本线程的时间片刚好用完,就会执行rt_thread_yield(),在rt_thread_yield()最终会执行系统调度rt_schedule(),切换到其他线程去执行了,就不会继续执行rt_timer_check(),那么本次tick中断就没有超时检查了? 问题:2 以上是哪里理解有误?敬请指点! |
|
相关推荐
3个回答
|
|
|
|
|
|
问题一
有超时检查。 原因:在中断环境中是无法完成切换线程动作的,以 Cortex-M 为例,真正的切换线程的动作是在 PENDSV 执行的,这个可以在 rt_hw_context_switch_interrupt 的实现中看到,也就是说,你执行在多次的 rt_schedule 也无法完成线程切换,只会在中断退出的时候立刻进入 PENDSV 来进行线程真正的线程切换。 问题二 问题一已经说到了,中断中不会发生线程切换,那么 rt_thread_yield 和 rt_timer_check 调用 rt_schedule 的作用都是找到当前时刻已经就绪的最高优先级任务。 |
|
|
|
谢谢!根据您的提示这几天抽空详细研究了下,大概理解如下:
1、这里实质是systick硬件中断的服务函数中嵌套了一个PendSV异常,而systick中断的优先级设置最高,PendSV异常优先级设置最低,总而言之就是高优先级中嵌套了一个人为软件触发的低优先级的异常,异常要响应只能等高优先级的systick退出才能响应进入PendSV_Handler异常服务函数,然后在PendSV_Handler服务函数中执行rt_hw_context_switch进行真正的上下文切换; 2、一方面,如设定的当前线程时间片用完,同时有线程的定时器超时,那么会在rt_tick_increase()中先执行rt_thread_yield()进行时间片调度,执行一次rt_schedule(),将当前线程的堆栈作为rt_interrupt_from_thread存储,将下一个拥有时间片的线程堆栈作为rt_interrupt_to_thread堆栈存储,并将其就绪,唯一的就是限于当前高优先级的中断服务函数环境,暂时没有运行起来; 另一方面,执行rt_timer_check进行定时器扫描,执行rt_thread_timeout超时调度,再执行一次rt_schedule(),如果超时线程的优先级更高,则将超时的线程堆栈内容替换前次保存的rt_interrupt_to_thread堆栈,并将其就绪,否则,如果优先级并不更高,则仅将超时线程就绪,插到就绪队列;故总的来说,systick结束前rt_interrupt_to_thread堆栈只有一种状态 3、关于rt_hw_context_switch()函数中rt_thread_switch_interrput_flag理解,它是一种人为设置的标志,跟中断相关的寄存器没有直接关系;它先在执行rt_schedule()中的rt_hw_context_switch()中被置1,而在当systick_handler()中断服务例程退出后,由于软件触发进入PendSV异常,PendSV_Handler()服务函数响应,其中会检查这个标志(rt_thread_switch_interrput_flag),如果这个标志为1,那么说明本次tick中断要进行线程切换,应该要发起上下文切换动作,把这个标志清零,然后进行上下文切换;否则,直接退出PendSV,不进行线程切换,也就不执行上下文切换。 写得有点啰嗦,把时机更新和线程切换整个串起来理解,不知那些正确那些不对。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
1559 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1108 浏览 0 评论
1550 浏览 0 评论
1399 浏览 0 评论
1042 浏览 0 评论
74626 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 14:11 , Processed in 0.856286 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号