rt-thread
rt-thread copied to clipboard
对Tag v5.0.0 中的rt_schedule函数存在疑惑(或许是BUG)
在 Tag v5.0.0中, scheduler_mp.c 文件中 rt_schedule 函数, 有部分代码存在问题
if (current_thread->scheduler_lock_nest == 1) /* whether lock scheduler */
如果我没理解错, schedule_lock_nest = 1时表示调度器被锁住,那么为何在此版本, 这个是在调度器锁住时才进行调度相关操作,这里是不是有bug,并且同一文件的 rt_critical_exit函数的末尾代码段
if (current_thread->scheduler_lock_nest <= 0)
{
current_thread->scheduler_lock_nest = 0;
/* enable interrupt */
rt_hw_local_irq_enable(level);
rt_schedule();
}
在上述rt_schedule的函数下意味着未作任何操作,并且,这个没理解错的话,是不是想在出临界区时调度一下,可是这里显然不会执行任何操作。
可以查看下最新版本情况。
看了一下代码。rt_schedule()
的冲突区就是用 scheduler_lock_nest
保护的,自然走到这里这个 nest 不是 0。如果外面又主动锁住了调度器,这个 nest 就会大于 1.所以这里的判断是这么处理的。你还可以写一些样例代码,用 gdb 单步跟一下确认一下。这样也很容易理解实际代码运行起来的状态,单看源代码很多时候是会被误导的。
提示一下,rt_hw_interrupt_disable
会重载为 rt_cpus_lock
。cpus lock 会通过 nest 递增标志调度器不可用。