RTOS官方文檔學習

来源:https://www.cnblogs.com/xsl-blogs/archive/2023/08/23/17651860.html
-Advertisement-
Play Games

# 任務與協程 ## 區別 > 一個程式可以只有任務、只有協程、二者都有,但不可以通過隊列/信號量互相傳遞數據 ## 任務特點 1. 任務之間可以互相獨立 2. 每個任務分配自己的堆棧,提高了RAM使用率 3. 操作簡單、按優先順序搶占式執行 4. 搶占容易導致重入(執行任務時被其他線程或進程調用了) ...


任務與協程

區別

一個程式可以只有任務、只有協程、二者都有,但不可以通過隊列/信號量互相傳遞數據

任務特點

  1. 任務之間可以互相獨立

  2. 每個任務分配自己的堆棧,提高了RAM使用率

  3. 操作簡單、按優先順序搶占式執行

  4. 搶占容易導致重入(執行任務時被其他線程或進程調用了)

協程特點

  1. 一般用於小型,RAM有限制的處理器上

  2. 所有協程共用一個堆棧

  3. 通過一組巨集實現的

  4. 減少了重入問題,但是和任務混用總搶不過人家

任務狀態

運行、就緒、阻塞、掛起

任務優先順序

  1. 0--configMAX_PRIORITIES - 1,最大值定義在FreeRTOSConfig.h中

  2. 設置的越小越好,某些特殊情況不得超過32

  3. 空閑任務優先順序為0

  4. 預設情況,相同優先順序按時間切片輪流運行

任務調度

單核調度

  1. 搶占式調度,即使在同一時間片,出現了一個高優先順序任務,也會打斷當前的低優先順序任務。

  2. 時間片指兩個tick中斷之間的時間,相同優先順序的任務,一人一個時間片依次執行。

  3. 如果一個高優先順序任務永遠不阻塞、不掛起,低優先順序任務永遠也不會執行,因此推薦創建事件驅動的任務,等待事件的時候阻塞掉它,收到事件再解除阻塞

  4. 高優先順序任務處於“阻塞”狀態時, 低優先順序任務會運行。

  5. FreeRTOSConfig中:
    configUSE_PREEMPTION=0關閉搶占,只有阻塞/掛起/運行的任務調用 taskYIELD()/ISR才會切換下文的任務

configUSE_TIME_SLICING=0關閉時間片,相同優先順序的任務不會在tick間隔後切換。

AMP調度

非對稱多核處理,每個核心獨立運行位元組的實例,不需要有相同架構

SMP調度

對稱多核處理,一個程式跨多個處理器調度

  • 單核移植到SMP
  1. configRUN_MULTIPLE_PRIORITIES = 0 ,可以同時運行優先順序相同的多個任務

  2. configUSE_CORE_AFFINITY = 1,通過vTaskCoreAffinitySet() 方法定義某個任務可以在哪個核運行

任務實現

定義任務
void vMyTask(void *pvParameters)
{
    for(;;){
	    Task coding here...
		//任務代碼寫在死迴圈里,非必要不退出,退出一定要delete
	}
    vTaskDelete(NULL);
}

typedef void (*TaskFunction_t)(void*);

  • 這句話是什麼意思呢,就是TaskFunction_t是一個指向函數的指針,這類函數具有void * 類型的形參,返回值類型是void

  • 事件型驅動代碼框架,WaitForEvent是消息隊列接收/事件等待等

if(WaitForEvent(事件,等待超時時間))
		{Tasking coding here...}
		else
		{報錯、處理錯誤等}
  • 通過巨集定義實現一個任務定義
    portTASK_FUNCTION_PROTO( vMyTask, pvParameters );

隊列

隊列是任務間通信的主要形式,先入先出

  • 數據被拷貝到隊列中,而不是傳地址

  • 讀空隊列、寫入滿隊列都會導致阻塞,高優先順序的優先解除阻塞

  • 隊列API允許指定阻塞最長時間,

信號量

是一種實現任務間通信的機制,是一個計數器

每當有個任務獲取信號量計數器就減一,變成0後所有試圖獲取信號量的任務都阻塞了

信號量當前的值就是可用資源數,

二值信號量

許多情況下可以用任務通知代替二值信號量

  • 信號量API允許指定最大阻塞時間,阻塞時間指的是tick間隔的數量

  • 二進位信號量可視為容量為1的隊列

用處

一個任務只用來服務一個外設,但不是一直服務的,還有輪詢或者其他無關操作,這時候就可以用二值信號量減少資源浪費。
具體操作為:

  1. 任務執行時獲取信號量,所謂獲取信號量就是讓計數器-1,變成0了,於是進入阻塞狀態,其他任務想執行就可以執行

  2. 當外設需要任務了,就觸發中斷給出信號量,也就是變成1了,原來的任務不阻塞了,繼續為外設服務。

  3. 我覺得可以理解成把主動權交給外設,需要任務就叫他

計數信號量

長度大於1的隊列

用處

  1. 初始定義信號量為0,用來盤點事件,發生一個事件+1,處理後-1

  2. 初始定義信號量為MAX,用於資源管理,每執行一次任務減一

互斥鎖

互斥鎖是包含優先順序繼承機制的二進位信號量

在 FreeRTOS 中,通常採用搶占式調度。這意味著當一個高優先順序任務準備好並且具備運行條件時,它會立即搶占當前正在執行的低優先順序任務。
然而,即使是搶占式調度,仍然可能出現低優先順序任務占用資源導致高優先順序任務無法執行的情況,原因就是高優先順序任務沒有準備好

  • 互斥鎖之所以叫互斥,是因為它執行當前的任務時把他優先順序調到最高了,就算浪費資源也要先把它執行完

  • 不要在中斷中使用互斥鎖,因為中斷無法保持阻塞等待互斥鎖的任務執行完畢,而且優先順序繼承機制要求從任務中拿出而不是中斷中

遞歸互斥鎖

只有一個任務成功執行n次(遞歸深度)才可以解鎖

任務通知

每個任務都有一個任務通知數組,數組裡每條通知都有掛起、不掛起倆狀態和一個32位通知值

  • configTASK_NOTIFICATION_ARRAY_ENTRIES 設置任務通知數組最大索引

  • 直達任務通知是直接發到任務的通知

  • 任務可以被通知阻塞,等待通知下達掛起指令


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

-Advertisement-
Play Games
更多相關文章
  • ## zhontai 項目 > 基於 .Net7.x + Vue 等技術的前後端分離後臺許可權管理系統,想你所想的開發理念,希望減少工作量,幫助大家實現快速開發 後端地址:https://github.com/zhontai/Admin.Core 前端地址:https://github.com/zho ...
  • 最近建立一個新項目準備寫一個小demo,新建項目時選的時.Net7。寫代碼的時候發現。Net7沒有系統的中文註釋,去官網下載的時候發現沒有關於.Net7的漢化文件包,最新的漢化包是。Net5的,可能是我沒找到,我這裡是把.Net5漢化包放到了.Net7下麵了,測試好用。 一、.NET Framewo ...
  • # C#文本轉語音(科大訊飛離線版) ### 引言 文本轉語音(Text To Speech),簡稱TTS,在很多業務場景會用到,比如廣播大廳,人機互動等。C#要實現TTS有不少選擇,比如調用System.Speech,此處就不細說了,下麵主要介紹一下C#調用科大訊飛的離線語音合成SDK來實現文本轉 ...
  • 本文主要介紹SignalR在實際項目中的應用,以及.NET Framework和.NET Core中如何去使用SignalR。SignalR是一個開放源代碼庫,可用於簡化嚮應用添加實時Web功能,實時Web功能使伺服器端代碼能夠將內容推送到客戶端。 ...
  • ## 一、為什麼要使用 LINQ 要理解為什麼使用 LINQ,先來看下下麵的例子 例子:要統計字元串中每個字母出現的頻率(忽略大小寫),然後按照從高到低的順序輸出出現頻率高於2次和其出現的的頻率。如果用傳統的 Sql 語句來寫,一定是非常的繁雜,如果用 LINQ 語句來寫,效果如下 ```c# st ...
  • [toc] # Linux運維工程師面試題(1) > 祝各位小伙伴們早日找到自己心儀的工作。 > 持續學習才不會被淘汰。 > 地球不爆炸,我們不放假。 > 機會總是留給有有準備的人的。 > 加油,打工人! ## 1 別名、內部命令、外部命令的執行順序 命令執行尋找順序:別名 > 內部命令 > 外部命 ...
  • [toc] ### 1.文件操作 #### 1.1 創建文件 ``` shell # touch+文件名 # 例子: # 創建一個文件 touch hello.c # 創建多個文件 touch hello.c hi.c ``` #### 1.2 刪除文件 ``` shell # rm+文件名 # 例 ...
  • 因為我用的是windows伺服器,因此需要一臺虛擬機,用來安裝centos,虛擬機的安裝網上好多教程,這裡不做過多介紹 這次同樣是按步操作 在本地伺服器創建下載目錄 -> 將yum文件下載到本地 -> 在遠程伺服器上創建目錄 -> 上傳文件到遠程伺服器目錄 -> 使用命令安裝yum到伺服器上 這次的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...