作者| ”>在嵌入式專欄共享之前,“在FreeRTOS V10.4.0中更新了哪些功能? ”,今天我將詳細介紹以下知識點之一:FreeRTOS直接任務(消息)通知,其目的是減少RAM占用空間并加快執行速度。
1寫在前面幾乎所有的RTOS操作系統都提供隊列和信號量功能。
對于大多數新手來說,使用隊列和信號量是一項必不可少的技能。
然而,在大多數情況下,它們使用“中間對象”來代替。
而不是“直接任務消息”進行通信溝通。
通過“中介對象”,為了進行通信,將為每組隊列或信號量分配一部分內存(消息緩沖區和流緩沖區)。
有一個問題。
如果有更多的隊列或信號量,將不可避免地導致更大的內存開銷。
但是,如果您通過“直接消息”進行通信,本文所述,您將節省大量內存。
2什么是直接任務通知?大多數任務間通信方法使用中間對象,例如隊列,信號量或事件組。
發送任務寫入通信對象,接收任務從通信對象讀取。
例如,在FreeRTOS隊列通信中,必須先定義一個隊列,然后再創建隊列:QueueHandle_t xQueue; xQueue = xQueueCreate(10,sizeof(/ *長度* /));并且該隊列包含許多中間對象:您可以將這個“中間”對象數為1。
“對象”需要多少RAM空間?占?通過代碼圖了解中介對象的通信:直接任務通知:顧名思義,使用直接任務通知時,發送任務將通知直接發送給接收任務,而無需中介對象。
通過代碼圖了解:從FreeRTOS V10.4.0開始,每個任務都有一系列通知。
每個通知包含一個32位值和一個布爾狀態,這兩個狀態加在一起僅占用5個字節的RAM。
正如任務可以防止二進制信號量等待信號量變為“可用”一樣,任務可以防止通知等待通知狀態變為“待處理”。
同樣,就像任務可以阻止信號量計數以等待信號量的計數變為非零一樣,任務可以阻止通知等待信號量的計數變為非零。
下面的第一個示例演示了這種情況。
通知不僅可以傳達事件,而且還可以通過多種方式傳達數據。
3直接任務通知的進一步分析通過比較FreeRTOS V10.4.0和以前的版本,您會發現V10.4.0具有更多的API,例如ulTask??NotifyTake / ulTask??NotifyTakeIndexed:在官方網站上也有關于這些API的詳細介紹和說明,如以及應用程序代碼示例:直接任務通信API描述地址:https://www.freertos.org/RTOS-task-notification-API.html 4使用直接任務通知的性能優勢以及使用受限任務通知的靈活性使他們能夠創建單獨的二進制隊列,用于信號量,數字信號量或事件組。
與使用中間對象(例如信號量)取消阻止任務相比,使用直接通知取消阻止RTOS任務的速度(根據官方數據)提高了45%,并且使用的RAM更少。
當然,憑借這些性能優勢,肯定存在一些局限性:僅當只有一個任務可以作為事件的接收者時,才可以使用RTOS任務通知。
但是,在大多數實際用例中都可以滿足此條件。
例如,當中斷中斷執行任務處理的任務時,該任務將處理該中斷接收的數據。
僅當使用RTOS任務通知而不是隊列時:接收任務可以等待“阻塞”消息中的通知。
狀態(因此不占用任何CPU時間),并且發送任務不能等待消息“阻塞”中的消息。
狀態。
如果無法立即完成傳輸,則傳輸已完成。
5如何使用實際上,使用方法非常簡單,只要您可以使用RTOS隊列和信號燈,就可以通過查看官方示例來基本使用它。
我還在此處以一個官方示例進行說明:/ *& nbsp; main()& nbsp;創建的兩個任務的原型* / static void prvTask1(void * pvParameters);靜態void prvTask2(void * pvParameters); / *& nbsp;處理由main()創建的任務的句柄* / static TaskHandle_t xTask1 = NULL,xTask2 = NULL; / *& nbsp;創建兩個任務,來回發送通知,然后啟動RTOS調度程序* / void main(void){xTaskCreate(prvTask1,“ Task1”,200,NULL,tskIDLE_PRIORITY,& amp; amp; ;