任务的挂起与唤醒
发布日期:2021-07-01 04:26:02
浏览次数:2
分类:技术文章
本文共 2043 字,大约阅读时间需要 6 分钟。
文章目录
1 任务的挂起与唤醒
1.1 概述
现有的任务状态切换图:
任务的挂起就是暂时禁止任务占用CPU运行,简单来说,就是无条件暂停任务运行。 新的任务状态切换图:1.2 设计实现
添加挂起计数器:
挂起函数: 恢复函数: 实现代码如下:/************************************************************************************************************ Function name : tTaskSuspend** Descriptions : 挂起指定的任务** parameters : task 待挂起的任务** Returned value : 无***********************************************************************************************************/void tTaskSuspend (tTask * task) { // 进入临界区 uint32_t status = tTaskEnterCritical(); // 不允许对已经进入延时状态的任务挂起 if (!(task->state & TINYOS_TASK_STATE_DELAYED)) { // 增加挂起计数,仅当该任务被执行第一次挂起操作时,才考虑是否 // 要执行任务切换操作 if (++task->suspendCount <= 1) { // 设置挂起标志 task->state |= TINYOS_TASK_STATE_SUSPEND; // 挂起方式很简单,就是将其从就绪队列中移除,这样调度器就不会发现他 // 也就没法切换到该任务运行 tTaskSchedUnRdy(task); // 当然,这个任务可能是自己,那么就切换到其它任务 if (task == currentTask) { tTaskSched(); } } } // 退出临界区 tTaskExitCritical(status); }/************************************************************************************************************ Function name : tTaskWakeUp** Descriptions : 唤醒被挂起的任务** parameters : task 待唤醒的任务** Returned value : 无***********************************************************************************************************/void tTaskWakeUp (tTask * task){ // 进入临界区 uint32_t status = tTaskEnterCritical(); // 检查任务是否处于挂起状态 if (task->state & TINYOS_TASK_STATE_SUSPEND) { // 递减挂起计数,如果为0了,则清除挂起标志,同时设置进入就绪状态 if (--task->suspendCount == 0) { // 清除挂起标志 task->state &= ~TINYOS_TASK_STATE_SUSPEND; // 同时将任务放回就绪队列中 tTaskSchedRdy(task); // 唤醒过程中,可能有更高优先级的任务就绪,执行一次任务调度 tTaskSched(); } } // 退出临界区 tTaskExitCritical(status); }
参考资料:
转载地址:https://muzimin.blog.csdn.net/article/details/104966712 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月14日 05时09分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LINUX CP命令详解
2019-05-01
source insight快捷键及使用技巧
2019-05-01
映 射 ALT 键
2019-05-01
vim使用快捷键F4生成文件头注释、F5生成main函数模板、F6生成.h文件框架模板
2019-05-01
用python解析html
2019-05-01
OV5620的视频驱动
2019-05-01
C++中两个类交叉定义或递归定义的解决办法
2019-05-01
ECharts is not Loaded解决方案
2019-05-01
ECharts地图显示不完整,只显示南海诸岛问题
2019-05-01
echarts切换tab时,第一个图表显示,第二个图表不显示的解决办法
2019-05-01
记一次Hive 行转列 引起的GC overhead limit exceeded
2019-05-01
OpenGL ES八 - 交叉存取顶点数据
2019-05-01
crontab定时任务写法
2019-05-01
nginx: [emerg] unknown directive "if($remote_addr" in /usr/local/tools/nginx/conf/nginx.conf:57
2019-05-01
module pip has no attribute main问题解决
2019-05-01
LeetCode 134.Gas Station (加油站)
2019-05-01
Python之命名元组 (namedtuple)
2019-05-01
使用libpcap过滤arp
2019-05-01
在VC环境中调试跟踪变量
2019-05-01