0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

FreeRTOS如何減少RAM占用空間并加快執(zhí)行速度?

工程師 ? 來源:strongerHuang ? 作者:strongerHuang ? 2020-10-14 14:52 ? 次閱讀

之前分享了《FreeRTOS V10.4.0更新了哪些功能?》,今天就來詳細講述其中的一個知識點:FreeRTOS的直接任務(消息)通知,這樣做的目的就是減少RAM占用空間并加快執(zhí)行速度。

一、寫在前面

幾乎所有RTOS操作系統(tǒng)都提供了隊列和信號量的功能,對于大部分新手來說,使用隊列和信號量是必備技能。

但是,在大多數(shù)情況下,他們都是使用“中介對象”進行通信,而并非“直接任務消息”通信。

通過“中介對象”進行通信,每一組隊列或信號量都會分配一段內(nèi)存(消息緩沖區(qū)和流緩沖區(qū))。就存在一個問題,如果隊列或信號量比較多,勢必造成更大的內(nèi)存開支。

但是,如果通過本文說的“直接消息”通信,會節(jié)約很多內(nèi)存。

二、什么是直接任務通知?

大多數(shù)任務間通信方法都通過中介對象,例如隊列,信號量或事件組。發(fā)送任務寫入通信對象,接收任務從通信對象讀取。

比如FreeRTOS的隊列通信,首先創(chuàng)建隊列之前要定義一個隊列:

QueueHandle_t xQueue;xQueue = xQueueCreate(10, sizeof( /* 長度 */ ) );

而這個隊列包含了很多中介對象:

大家可以算一下這個“中介對象”會占用多少RAM空間?

通過一個代碼示意圖理解中介對象通信:

直接任務通知:

當使用直接任務通知時,顧名思義,發(fā)送任務將通知直接發(fā)送給接收任務,而無需中介對象。

通過一個代碼示意圖理解:

從FreeRTOS V10.4.0開始,每個任務都有一系列通知。每個通知都包含一個32位值和一個布爾狀態(tài),它們一起僅消耗5個字節(jié)的RAM。

就像任務可以阻止二進制信號量等待該信號量變?yōu)椤翱捎谩币粯?,任務可以阻止通知以等待該通知的狀態(tài)變?yōu)椤按幚怼?。同樣,就像任務可以阻止計?shù)信號量以等待該信號量的計數(shù)變?yōu)榉橇阋粯樱蝿湛梢宰柚雇ㄖ缘却撏ㄖ闹底優(yōu)榉橇?。下面的第一個示例演示了這種情況。

通知不僅可以傳達事件,還可以通過多種方式傳達數(shù)據(jù)。

三、進一步分析直接任務通知

通過對比FreeRTOS V10.4.0和之前版本,你會發(fā)現(xiàn)V10.4.0多了一些API,比如ulTaskNotifyTake / ulTaskNotifyTakeIndexed:

在官網(wǎng)也有針對這些API的詳細介紹和說明,以及應用代碼例子:

直接任務通信API說明地址:

https://www.freertos.org/RTOS-task-notification-API.html

(公號不支持外鏈接,請復制鏈接到瀏覽器打開)

四、使用直接任務通知性能優(yōu)勢和使用限制

任務通知的靈活性使它們可以在需要創(chuàng)建單獨的隊列、 二進制信號量、 數(shù)信號量或事件組的情況下使用。

與使用中介對象(例如信號量)來取消阻止任務相比,使用直接通知取消阻止RTOS任務的速度快了45% (來自官方數(shù)據(jù)) ,并且使用的RAM更少。

當然,有這些性能優(yōu)勢,也肯定一些限制:

僅當只有一個任務可以作為事件的接收者時,才可以使用RTOS任務通知。但是,在大多數(shù)實際使用情況下都可以滿足此條件,例如中斷使執(zhí)行任務處理的任務中斷時,該任務將處理該中斷接收的數(shù)據(jù)。

僅在使用RTOS任務通知代替隊列的情況下:接收任務可以在“阻塞”狀態(tài)下等待通知(因此不占用任何CPU時間),而發(fā)送任務不能在“阻塞”狀態(tài)下等待消息。如果發(fā)送無法立即完成,則發(fā)送完成。

五、使用方法

使用方法其實很簡單,只要你會使用RTOS的隊列、信號量,基本看一眼官方例子就能使用。

我這里也拿官方例子說明一下:

/* main() 創(chuàng)建的兩個任務的原型 */static void prvTask1( void *pvParameters );static void prvTask2( void *pvParameters );/* 處理由main() 創(chuàng)建的任務的句柄 */static TaskHandle_t xTask1 = NULL, xTask2 = NULL;/* 創(chuàng)建兩個任務,來回發(fā)送通知,然后啟動RTOS調(diào)度程序 */void main( void ){ xTaskCreate( prvTask1, “Task1”, 200, NULL, tskIDLE_PRIORITY, &xTask1 ); xTaskCreate( prvTask2, “Task2”, 200, NULL, tskIDLE_PRIORITY, &xTask2 ); vTaskStartScheduler();}/*———————————————————–*//* prvTask1() 使用API的“索引”版本 */static void prvTask1( void *pvParameters ){ for( ;; ) { /* 發(fā)送通知到prvTask2() ,使其脫離“已阻止”狀態(tài)。*/ xTaskNotifyGiveIndexed( xTask2, 0 ); /* 阻止等待prvTask2() 通知此任務 */ ulTaskNotifyTakeIndexed( 0, pdTRUE, portMAX_DELAY ); }}/*———————————————————–*//* prvTask2()使用API的原始版本(不帶“索引”) */static void prvTask2( void *pvParameters ){ for( ;; ) { /* 等待prvTask1()通知此任務 */ ulTaskNotifyTake( pdTRUE, portMAX_DELAY ); /* 向prvTask1()發(fā)送通知,使它退出“已阻止”狀態(tài) */ xTaskNotifyGive( xTask1 ); }}

責任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1365

    瀏覽量

    114476
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1475

    瀏覽量

    61760
  • RTOS
    +關(guān)注

    關(guān)注

    21

    文章

    809

    瀏覽量

    119366
收藏 人收藏

    評論

    相關(guān)推薦

    如何優(yōu)化RAM內(nèi)存使用

    :使用任務管理器查看當前運行的程序和服務,關(guān)閉那些不需要的。 禁用啟動程序 :減少開機啟動項,只保留必要的程序。 2. 優(yōu)化操作系統(tǒng)設置 調(diào)整虛擬內(nèi)存 :合理設置虛擬內(nèi)存,避免過多占用硬盤空間。 清理磁盤 :定期進行磁盤清理,
    的頭像 發(fā)表于 11-11 09:58 ?76次閱讀

    freertos最多支持多少個任務

    以下幾個因素: 系統(tǒng)資源 :FreeRTOS能夠支持的任務數(shù)量受到系統(tǒng)硬件資源的限制,特別是處理器的RAM大小和性能。RAM用于存儲任務的控制塊(TCB)和任務堆棧,因此RAM越大,理
    的頭像 發(fā)表于 09-02 14:21 ?622次閱讀

    在不影響性能或占用空間的情況下隔離您的CAN系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《在不影響性能或占用空間的情況下隔離您的CAN系統(tǒng).pdf》資料免費下載
    發(fā)表于 08-29 10:49 ?0次下載
    在不影響性能或<b class='flag-5'>占用</b><b class='flag-5'>空間</b>的情況下隔離您的CAN系統(tǒng)

    ESP32-S2的循環(huán)運行速度比ESP32慢很多是怎么回事?

    我想測試一下ESP32-S2的sqrtf的運算速度, 結(jié)果發(fā)現(xiàn)運行速度特別慢,sqrtf()需要3微秒以上,占用了接近1000個時鐘周期. 然后又寫了一個循環(huán)的測試.發(fā)現(xiàn)也很慢. 1000次循環(huán)
    發(fā)表于 06-21 17:11

    芯海通用 MCU 應用筆記:在 MDK 開發(fā)環(huán)境下代碼重定向到 RAM 執(zhí)行的幾種方法

    空間寫入新的代碼。此外還具備執(zhí)行效率高,壽命長優(yōu)點。 本文檔介紹和說明在 MDK 開發(fā)環(huán)境下將代碼重定向到 RAM執(zhí)行的方法。本文檔
    發(fā)表于 05-16 11:58

    請問Block RAM的資源如何計算?

    當使用ram時,width是960bit,depth是16bit,只有15Kb大小, 為什么占用了很多個BRAM?
    的頭像 發(fā)表于 05-06 14:12 ?466次閱讀
    請問Block <b class='flag-5'>RAM</b>的資源如何計算?

    怎么解決MCU RAM空間不夠用的問題?

    之前使用沁恒公司的一款BLE芯片CH573,隨著代碼量的增多,開發(fā)到后期時遇到了RAM空間不夠用的問題,當時嚇了我一跳,以為需要重新?lián)Q更大RAM的芯片。
    的頭像 發(fā)表于 05-01 09:57 ?1245次閱讀
    怎么解決MCU <b class='flag-5'>RAM</b><b class='flag-5'>空間</b>不夠用的問題?

    STM32是如何從flash讀取指令執(zhí)行的?

    的時候就要解密,現(xiàn)在衍生了另一個問題就是我STM32是如何從flash讀取指令執(zhí)行的?是讀一句執(zhí)行依據(jù)還是將flash里面的程序整體讀到內(nèi)部ram里面再
    發(fā)表于 04-24 07:09

    請問使用FreeRTOS與LWIP不算應用程序消耗600K Byte RAM是否夠用?

    大家好! 最近新項目中需要使用FreeRTOS + LWIP,選MCU時候,對內(nèi)部RAM資源無法準確評估: 請問使用FreeRTOS與LWIP 不算應用程序消耗 600K Byte RAM
    發(fā)表于 04-18 07:37

    你以為的RAM不是你以為的RAM~

    一、DTCM和AXI連接的RAMSTM32H7系列處理器內(nèi)部有多個RAM空間,每個RAM空間的大小和響應速度都不一樣。這里面我們重點關(guān)注DT
    的頭像 發(fā)表于 04-05 08:09 ?798次閱讀
    你以為的<b class='flag-5'>RAM</b>不是你以為的<b class='flag-5'>RAM</b>~

    G431CB把stack heap全分配到ccmram,代碼執(zhí)行速度并未改善是怎么回事?

    把stack heap全分配到ccmram發(fā)現(xiàn)函數(shù)執(zhí)行時間也沒有什么改善,附圖是我的結(jié)果 函數(shù)執(zhí)行速度非但沒有改善,反而發(fā)現(xiàn)在ccmram執(zhí)行很不穩(wěn)定; 測試手段:用定時器3計數(shù)來實現(xiàn)該函數(shù)
    發(fā)表于 03-27 08:23

    BlueRNG-M2SA運用FreeRTOS空間不足怎么解決?

    溢出1788bytes FreeRTOSConfig.h 其中的參數(shù)有牽扯到空間大小,所以我進行調(diào)整尺寸后即可以編譯過,但燒錄完后并不會有動作,請問有人有試過合拼FreeRTOS成功的案例嗎?
    發(fā)表于 03-22 07:26

    stm32h743是不是可以直接用ICache加快一些速度?

    stm32h743是不是可以直接用ICache加快一些速度,而不用DCache,DCache配置ram麻煩?
    發(fā)表于 03-08 08:01

    G120電機運行速度怎么設置?

    G120電機運行速度怎么設置? 例如我在觸摸屏=1是高速=2中速=3是低速。 這個速度怎么設置?
    發(fā)表于 01-09 07:37

    FreeRTOS中的任務管理

    任務是 FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨立運行。FreeRTOS 中的任務是基于優(yōu)先級的搶占式調(diào)度,優(yōu)先級高的任務可以搶占優(yōu)先級低的任務的 CPU 資源。任務的創(chuàng)建、刪除、掛起、恢復、設置優(yōu)先級
    的頭像 發(fā)表于 11-27 17:03 ?923次閱讀