日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

任务的挂起与唤醒

發布時間:2025/4/5 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 任务的挂起与唤醒 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 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自己動手寫嵌入式操作系統
  • 總結

    以上是生活随笔為你收集整理的任务的挂起与唤醒的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。