uCosII中的任務

来源:https://www.cnblogs.com/jasontian996/archive/2019/04/25/10770955.html
-Advertisement-
Play Games

任務基本概念 任務是一個接受操作系統管理的獨立運行單元,在 中類似與普通平臺上的 函數,需要自己來保護其因調用或中斷二產生的斷點,所以需要一個自己的私有堆棧,即任務堆棧; 任務有兩種,分為:用戶任務和系統任務; 中並沒有給任務分配獨立的運行空間,而是所有的任務共同使用一個記憶體空間,所以這裡的任務屬於 ...


任務基本概念

任務是一個接受操作系統管理的獨立運行單元,在uCosII中類似與普通平臺上的main()函數,需要自己來保護其因調用或中斷二產生的斷點,所以需要一個自己的私有堆棧,即任務堆棧;

任務有兩種,分為:用戶任務和系統任務;

uCosII中並沒有給任務分配獨立的運行空間,而是所有的任務共同使用一個記憶體空間,所以這裡的任務屬於線程;

系統中的任務共有5種狀態:

  • 睡眠狀態:任務只是以代碼的形式駐留在程式空間(ROM或RAM),還沒有交給操作系統管理時的情況叫睡眠狀態;
  • 就緒狀態:如果系統為任務分配了任務控制塊且在任務就緒表中進行了就緒登記,則任務就具備了運行的充分條件,這時任務的狀態就是就緒狀態;
  • 運行狀態:處於就緒狀態的任務如果經調度器判斷獲得CPU的使用權,則任務就進入了運行狀態,任何時刻只能有一個任務處於運行狀態;
  • 等待狀態:正在運行的任務,需要等待一段時間或需要等待一個事件發生再運行時,該任務就把CPU的使用權讓給其他任務而使任務進入了等待狀態;
  • 中斷服務狀態:一個正在運行的任務一旦響應中斷申請就會中止運行而去執行中斷服務程式,這時的任務狀態就是中斷服務狀態;

CosII預定義了兩個系統任務:空閑任務和統計任務,其中空閑任務是每個應用程式必須使用的,而統計任務則是應用程式可以根據實際需要來選擇可配置的;

任務控制塊及其鏈表

任務控制塊

一條空任務塊鏈表,其中所有任務控制塊還未分配給任務;

一條任務塊鏈表,其中所有任務控制塊已分配給任務;

一個數據類型為OS_TCB*的數據OSPrioTbl[],按照任務優先順序順序存放了指向各個任務控制塊的指針;

任務控制塊初始化

OSTaskCreate() -> OSTCBInit();

流程:獲取一個空的任務塊 -> 創建任務控制塊並初始化成員值 -> 將該任務控制塊鏈入任務控制塊鏈表中;

任務就續表及任務調度

任務就續表

任務就續表就是一個點陣圖,系統中每個任務占據一個二進位位,1/0表示任務是否處於就緒狀態;

實質是一個類型為INT8U的數組OSRdyTbl[],每個元素(每8個任務)是一個任務組;

點陣圖中按照任務優先順序高低為順序依次分配對應位;

為了便於對就緒表查找,定義了一個數據類型為INT8U的變數OSRdyGrp,使該變數的每一個位都對應OSRdyTbl[]的一個任務組,如果某任務組中有任務就緒,則在變數OSRdyGrp里把該任務組所對應的位設置1,否則為0,因此也對應最多可以管理64個任務;

任務調度

uCossII中的任務調度由調度器來完成;

任務調度器主要工作有兩項:

  • 在就續表中查找具有最高優先順序別的就緒任務;
  • 實現任務的切換;

任務調度器有兩種:

  • 任務級的調度器(由函數OS_Sched()來實現);
  • 中斷級的調度器(由函數OS_IntExt()來實現);

調度器把任務切換工作分為兩個步驟:

  • 獲得待運行任務的TCB指針;
  • 進行斷點數據的切換(在巨集OS_TASK_SW()中實施任務切換,主要是靠OSCtxSw());

任務的創建

uCosII是通過任務控制塊來管理任務的,所以創建任務的實質就是創建一個任務控制塊,並通過任務控制塊把任務代碼和任務堆棧關聯起來形成一個完整的任務,還要使剛創建的任務進入就緒狀態,並且接著引發一次任務調度;

創建任務的函數有兩個:STaskCreate()OSTaskCreateExt(),後者是前者的擴展,提供了一些附加功能;

uCosII有一個規定:在調用啟動任務函數OSStart()之前,必須已經創建了至少一個任務;不允許在中斷服務程式中創建任務;

任務的掛起和恢復

任務的掛起就是停止這個任務;

用戶任務可通過調用系統提供的OSTaskSuspend()函數來掛起自身或者除空閑任務之外的其他任務,用該函數掛起後的任務只能在其他任務中通過調用恢復函數OSTaskResume()使其恢復為就緒狀態;

其他任務相關函數

任務優先順序修改

OSTaskChangePrio() 在程式的運行過程中,可調用該函數來改變任務優先順序別;

任務的刪除

刪除任務就是把該任務置於休眠狀態;

可調用函數OSTaskDel()來刪除任務自身或者除了空閑任務之外的其他任務;

刪除任務時為防止被刪除任務所占用的一些資源沒有釋放,所以解決辦法是:提出刪除任務請求的任務只負責刪除任務請求,而刪除工作則由被刪除任務自己來完成,這樣被刪除任務就可以根據自身的具體情況來決定何時刪除自身,同hi也有機會刪除自身所占用的資源;

能實現這種刪除方式的方法是:利用被刪除任務的任務控制塊成員OSTCBDelReq作為請求刪除方與被刪除方的聯絡信號,同時提供了一個雙方都能調用的函數(請求刪除任務函數)OSTaskDelReq(),這樣提出刪除任務請求的任務和被刪除任務雙方就能使用該函數來訪問OSTCBDelReq這個信號,從而可以根據這個信號的狀態來決定各自的行為;

查詢任務信息

在應用程式運行中需要瞭解一個任務的指針、堆棧等信息時,可以調用函數OSTaskQuery()來獲取選定的任務信息;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.UI/Default代碼研究首先,我想到的是,既然是對圖集紋理進行採樣,而且又不能統一更改材質的紋理UV值,我們通常寫的shader都是直接根據模型UV值對主紋理進行採樣,那會不會是shader中對MainTexture進行了什麼神奇的處理,讓圖片採樣只根據指定的UV值進行採樣呢?我去官網下載了 ...
  • 要使用Dictionary集合,需要導入C#泛型命名空間 System.Collections.Generic(程式集:mscorlib) 要使用Dictionary集合,需要導入C#泛型命名空間 System.Collections.Generic(程式集:mscorlib) Dictionary ...
  • 註意:首先引入dll文件ICSharpCode.SharpZipLib.dll 壓縮文件 文件下載 具體使用 ...
  • 介紹 SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ...... 簡潔、高效、高性能、擴展性、監控、漸進式開發! 她是如何工作的? SmartSql 借鑒了 M ...
  • SignatureButton控制項 一、 樣式一 我們要實現上圖中的效果,需要如下的操作: 設置一個值,該值指示在GobileView中,當Visible指定的屬性值為空時,當前單元格是否顯示控制項,並調整GridView中單元格的大小。預設屬性設置為“False”,如圖1; 圖 1 設置控制項的背景色 ...
  • Windows -- 從註冊表刪除IE瀏覽器載入項 1. 一部分載入項從註冊表以下位置直接刪除 2. 一部分擴展項從註冊表以下位置直接刪除 ...
  • 1 #!/bin/sh 2 count=100 #控制每秒寫入不同大小的文件 3 4 while true 5 do 6 for ((i=1;i<=$count;i++)) 7 do 8 /bin/cp 10k.jpg /backup/test/$i/10k_`echo $(date)$RANDOM... ...
  • Linux scp命令用於Linux之間複製文件和目錄。 `scp`是`secure copy`的縮寫,scp是Linux系統下基於ssh登陸進行安全的遠程文件拷貝命令。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...