设想一个这个场景。
程序中有两个系统线程:
现在
但是把线程A从睡眠状态恢复为ready状态并引发一次任务调度的这个过程是在timer_thread线程中进行的,而此时也没有任何机制会使得timer_thread线程得到执行,因为当前在执行线程B,时间片并没有到,也就不会引发任务调度使得timer_thread获得执行的机会。
退一步说,即使线程B的时间片用完,引发任务调度的时候,timer_thread仍然不会得到执行,因为timer_thread的优先级比线程B低。而timer_thread得不到执行,自然线程A无法恢复为ready状态,那么就一直等下去。
只有等到线程B主动挂起,timer_thread才会获得执行的机会,然后线程A才能恢复ready。
也就是说,即使线程A的延迟时间到了,也必须等到线程B主动挂起,才能得到执行。
这又如何保证线程A的实时性呢?
给我的感觉是,楼主对“任务调度切换的时机”理解不是很深刻,
说白了就是没有理解好,到底是什么时候发生任务切换的。
从楼主的理解“线程B一直占着CPU呢,调度器怎么执行啊”就可以看出来。
理论上说,每发生一次systick中断,都有可能触发一次任务切换,
具体如何切换,切换到哪个任务运行,取决于任务调度算法的实现。
另外,线程B只要不是while(1);这种死跑,CPU就不会被它一直占着。
以上是个人理解,欢迎大家指正。
两个问题:
简单来说,就是:高优先级线程的延迟时间到了,也不能马上得到调度执行,必须要等到低优先级的线程主动挂起(调用rt_thread_mdelay之类),然后再等到timer_thread执行完,然后高优先级线程才能获得执行机会
线程A优先级最高,所以A调用rt_thread_mdelay(5),主动挂起5ms,那么5ms之后调度器会自动把A恢复执行
这个是要代码实现的啊,怎么自动恢复执行呢,在哪里自动恢复执行?那不得要任务调度的时候吗,调度器是在timer_thread中执行的啊。线程B一直占着CPU呢,调度器怎么执行啊