第十四讲--调度锁
从具体的例子中来看为啥引入调度锁机制。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; } ........ }