zoukankan      html  css  js  c++  java
  • 第十四讲--调度锁

     从具体的例子中来看为啥引入调度锁机制。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;
        }
    
    ........
    
    }
  • 相关阅读:
    点击图片背景音乐开始暂停,图片旋转停止
    mui上下滑动
    mui中去掉li的下划线
    改变placeholder颜色的两种方法
    微信小程序开发错误代码
    重写(override)与重载(overload)的区别
    PHP面向对象 三大特性
    PHP 面向对象 基础知识
    PHP — 基础语法
    PHP 字符处理与常用函数
  • 原文地址:https://www.cnblogs.com/nasduc/p/8495697.html
Copyright © 2011-2022 走看看