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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

工程師 ? 來(lái)源:strongerHuang ? 作者:strongerHuang ? 2020-10-14 14:52 ? 次閱讀

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

一、寫在前面

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

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

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

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

二、什么是直接任務(wù)通知?

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

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

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

而這個(gè)隊(duì)列包含了很多中介對(duì)象:

大家可以算一下這個(gè)“中介對(duì)象”會(huì)占用多少RAM空間?

通過(guò)一個(gè)代碼示意圖理解中介對(duì)象通信:

直接任務(wù)通知:

當(dāng)使用直接任務(wù)通知時(shí),顧名思義,發(fā)送任務(wù)將通知直接發(fā)送給接收任務(wù),而無(wú)需中介對(duì)象。

通過(guò)一個(gè)代碼示意圖理解:

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

就像任務(wù)可以阻止二進(jìn)制信號(hào)量等待該信號(hào)量變?yōu)椤翱捎谩币粯?,任?wù)可以阻止通知以等待該通知的狀態(tài)變?yōu)椤按幚怼?。同樣,就像任?wù)可以阻止計(jì)數(shù)信號(hào)量以等待該信號(hào)量的計(jì)數(shù)變?yōu)榉橇阋粯?,任?wù)可以阻止通知以等待該通知的值變?yōu)榉橇恪O旅娴牡谝粋€(gè)示例演示了這種情況。

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

三、進(jìn)一步分析直接任務(wù)通知

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

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

直接任務(wù)通信API說(shuō)明地址:

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

(公號(hào)不支持外鏈接,請(qǐng)復(fù)制鏈接到瀏覽器打開)

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

任務(wù)通知的靈活性使它們可以在需要?jiǎng)?chuàng)建單獨(dú)的隊(duì)列、 二進(jìn)制信號(hào)量、 數(shù)信號(hào)量或事件組的情況下使用。

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

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

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

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

五、使用方法

使用方法其實(shí)很簡(jiǎn)單,只要你會(huì)使用RTOS的隊(duì)列、信號(hào)量,基本看一眼官方例子就能使用。

我這里也拿官方例子說(shuō)明一下:

/* main() 創(chuàng)建的兩個(gè)任務(wù)的原型 */static void prvTask1( void *pvParameters );static void prvTask2( void *pvParameters );/* 處理由main() 創(chuàng)建的任務(wù)的句柄 */static TaskHandle_t xTask1 = NULL, xTask2 = NULL;/* 創(chuàng)建兩個(gè)任務(wù),來(lái)回發(fā)送通知,然后啟動(dòng)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() 通知此任務(wù) */ ulTaskNotifyTakeIndexed( 0, pdTRUE, portMAX_DELAY ); }}/*———————————————————–*//* prvTask2()使用API的原始版本(不帶“索引”) */static void prvTask2( void *pvParameters ){ for( ;; ) { /* 等待prvTask1()通知此任務(wù) */ ulTaskNotifyTake( pdTRUE, portMAX_DELAY ); /* 向prvTask1()發(fā)送通知,使它退出“已阻止”狀態(tài) */ xTaskNotifyGive( xTask1 ); }}

責(zé)任編輯:haq

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

    關(guān)注

    8

    文章

    1369

    瀏覽量

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

    關(guān)注

    2

    文章

    1507

    瀏覽量

    62217
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    817

    瀏覽量

    119762
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    RAM內(nèi)存頻率對(duì)性能的影響

    在計(jì)算機(jī)系統(tǒng)中,RAM(隨機(jī)存取存儲(chǔ)器)是至關(guān)重要的組件之一,它直接影響著系統(tǒng)的響應(yīng)速度和處理能力。內(nèi)存頻率,即內(nèi)存的運(yùn)行速度,是衡量RAM性能的一個(gè)重要指標(biāo)。 1. 內(nèi)存頻率的定義
    的頭像 發(fā)表于 11-11 09:52 ?1397次閱讀

    freertos最多支持多少個(gè)任務(wù)

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

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

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

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

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

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

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

    請(qǐng)問(wèn)Block RAM的資源如何計(jì)算?

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

    怎么解決MCU RAM空間不夠用的問(wèn)題?

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

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

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

    請(qǐng)問(wèn)使用FreeRTOS與LWIP不算應(yīng)用程序消耗600K Byte RAM是否夠用?

    大家好! 最近新項(xiàng)目中需要使用FreeRTOS + LWIP,選MCU時(shí)候,對(duì)內(nèi)部RAM資源無(wú)法準(zhǔn)確評(píng)估: 請(qǐng)問(wèn)使用FreeRTOS與LWIP 不算應(yīng)用程序消耗 600K Byte RAM
    發(fā)表于 04-18 07:37

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

    一、DTCM和AXI連接的RAMSTM32H7系列處理器內(nèi)部有多個(gè)RAM空間,每個(gè)RAM空間的大小和響應(yīng)速度都不一樣。這里面我們重點(diǎn)關(guān)注DT
    的頭像 發(fā)表于 04-05 08:09 ?1460次閱讀
    你以為的<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í)行時(shí)間也沒有什么改善,附圖是我的結(jié)果 函數(shù)執(zhí)行速度非但沒有改善,反而發(fā)現(xiàn)在ccmram執(zhí)行很不穩(wěn)定; 測(cè)試手段:用定時(shí)器3計(jì)數(shù)來(lái)實(shí)現(xiàn)該函數(shù)
    發(fā)表于 03-27 08:23

    BlueRNG-M2SA運(yùn)用FreeRTOS空間不足怎么解決?

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

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

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

    FreeRTOS如何刪除clib支持和抽象rtos?

    我目前在我的項(xiàng)目中使用FreeRTOS,但只使用了其最少的功能。 我需要?jiǎng)h除 clib 支持和抽象 rtos,只保留 FreeRTOS。 這是為了實(shí)現(xiàn)更輕的應(yīng)用程序最大限度地減少依賴
    發(fā)表于 01-25 06:19