rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

对Tag v5.0.0 中的rt_schedule函数存在疑惑(或许是BUG)

Open Nohysiwe opened this issue 1 year ago • 2 comments

在 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的函数下意味着未作任何操作,并且,这个没理解错的话,是不是想在出临界区时调度一下,可是这里显然不会执行任何操作。

Nohysiwe avatar Nov 07 '23 13:11 Nohysiwe

可以查看下最新版本情况。

BernardXiong avatar Nov 13 '23 14:11 BernardXiong

看了一下代码。rt_schedule() 的冲突区就是用 scheduler_lock_nest 保护的,自然走到这里这个 nest 不是 0。如果外面又主动锁住了调度器,这个 nest 就会大于 1.所以这里的判断是这么处理的。你还可以写一些样例代码,用 gdb 单步跟一下确认一下。这样也很容易理解实际代码运行起来的状态,单看源代码很多时候是会被误导的。

提示一下,rt_hw_interrupt_disable 会重载为 rt_cpus_lock。cpus lock 会通过 nest 递增标志调度器不可用。

polarvid avatar Nov 29 '23 01:11 polarvid