博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十四讲--调度锁
阅读量:6034 次
发布时间:2019-06-20

本文共 814 字,大约阅读时间需要 2 分钟。

 从具体的例子中来看为啥引入调度锁机制。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

你可能感兴趣的文章
数据库
查看>>
机器学习入门-决策树算法
查看>>
vue-router学习笔记(一)
查看>>
Linux的用户和用户组管理
查看>>
怎样让webservice在浏览器远程浏览时像在本地浏览一样有参数输入框
查看>>
COGS 2353 2355 2356 2358 有标号的DAG计数
查看>>
「WC2018」即时战略
查看>>
linux密码修改实验
查看>>
Xcode+OpenCV3.4.0 折腾(2)
查看>>
JAVA时间日期处理类,主要用来遍历两个日期之间的每一天。
查看>>
H5页面遮罩弹框下层还能滚动的问题
查看>>
经典算法
查看>>
实验1
查看>>
兄弟元素选择器
查看>>
git 命令小结
查看>>
Building Particle Filters and Particle MCMC in NIMBLE
查看>>
设计模式:策略模式
查看>>
5 HttpHandler
查看>>
【剑指offer】用两个栈实现一个队列
查看>>
C语言,C#,Java,JavaScript之强类型与弱类型
查看>>