欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

任务的挂起与唤醒

发布时间:2025/4/5 编程问答 68 豆豆
生活随笔 收集整理的这篇文章主要介绍了 任务的挂起与唤醒 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 1 任务的挂起与唤醒
      • 1.1 概述
      • 1.2 设计实现

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); }

参考资料:

  • 【李述铜】从0到1自己动手写嵌入式操作系统
  • 总结

    以上是生活随笔为你收集整理的任务的挂起与唤醒的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。