第十四讲--调度锁

 从具体的例子中来看为啥引入调度锁机制。task1和task2,都对一个全局变量进行的了操作。

如果在task1中进行临界区保护的话,那么taskDelay也不会触发任务调度,task2就永远不会得到运行。

如果不进行临界区保护的话,task2对全局变量的操作就会被覆盖。其实这个例子不太好,task1仍旧可以用临界区保护,只要退出后再调用一次taskDelay不就可以调用

task2了嘛。目前的课程阶段,主要是慢慢引入各种机制的概念,后续会有这种机制更加适合的应用场景。

 引入调度锁机制来解决这个问题,首先有几个调度锁的函数:

    tTaskSchedInit(); //初始化调度锁计数器
    tTaskSchedDisable();//启用调度锁,调度锁计数器加1
    tTaskSchedEnable();//退出调度锁,调度锁计数器减1,如果判断计数器为0,调用tTaskSched()函数
  同时修改了tTaskSched ()函数,会在这个函数里面判断调度锁计时器是否大于0,大于0就不触发切换,见后面

怎么用这些函数解决上面这个问题呢?用法和临界区保护类似,task1中启用调度锁,然后调度锁计数器加1,这样即使用了taskDelay函数,因为调度锁计数器为1,也不会触发调度。最后退出调度锁,这个时候计数器减1后为0,调用tTaskSched ()函数后就跳到task2正常运行了。

void tTaskSched ()
{
    uint32_t status = tTaskEnterCritical();
    
    if (schedLockCount > 0)
    {
        tTaskExitCritical(status);
        return;
    }

........

}
原文地址:https://www.cnblogs.com/nasduc/p/8495697.html