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