色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

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

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

一、寫在前面

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

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

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

但是,如果通過本文說的“直接消息”通信,會節約很多內存。

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

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

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

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

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

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

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

直接任務通知:

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

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

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

就像任務可以阻止二進制信號量等待該信號量變為“可用”一樣,任務可以阻止通知以等待該通知的狀態變為“待處理”。同樣,就像任務可以阻止計數信號量以等待該信號量的計數變為非零一樣,任務可以阻止通知以等待該通知的值變為非零。下面的第一個示例演示了這種情況。

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

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

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

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

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

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

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

四、使用直接任務通知性能優勢和使用限制

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

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

當然,有這些性能優勢,也肯定一些限制:

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

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

五、使用方法

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

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

/* main() 創建的兩個任務的原型 */static void prvTask1( void *pvParameters );static void prvTask2( void *pvParameters );/* 處理由main() 創建的任務的句柄 */static TaskHandle_t xTask1 = NULL, xTask2 = NULL;/* 創建兩個任務,來回發送通知,然后啟動RTOS調度程序 */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( ;; ) { /* 發送通知到prvTask2() ,使其脫離“已阻止”狀態。*/ xTaskNotifyGiveIndexed( xTask2, 0 ); /* 阻止等待prvTask2() 通知此任務 */ ulTaskNotifyTakeIndexed( 0, pdTRUE, portMAX_DELAY ); }}/*———————————————————–*//* prvTask2()使用API的原始版本(不帶“索引”) */static void prvTask2( void *pvParameters ){ for( ;; ) { /* 等待prvTask1()通知此任務 */ ulTaskNotifyTake( pdTRUE, portMAX_DELAY ); /* 向prvTask1()發送通知,使它退出“已阻止”狀態 */ xTaskNotifyGive( xTask1 ); }}

責任編輯:haq

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

    關注

    8

    文章

    1369

    瀏覽量

    114759
  • API
    API
    +關注

    關注

    2

    文章

    1503

    瀏覽量

    62139
  • RTOS
    +關注

    關注

    22

    文章

    815

    瀏覽量

    119708
收藏 人收藏

    評論

    相關推薦

    如何優化RAM內存使用

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

    RAM內存頻率對性能的影響

    在計算機系統中,RAM(隨機存取存儲器)是至關重要的組件之一,它直接影響著系統的響應速度和處理能力。內存頻率,即內存的運行速度,是衡量RAM性能的一個重要指標。 1. 內存頻率的定義
    的頭像 發表于 11-11 09:52 ?1137次閱讀

    freertos最多支持多少個任務

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

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

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

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

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

    芯海通用 MCU 應用筆記:在 MDK 開發環境下代碼重定向到 RAM 執行的幾種方法

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

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

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

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

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

    STM32是如何從flash讀取指令執行的?

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

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

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

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

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

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

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

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

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

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

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

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

    G120電機運行速度怎么設置? 例如我在觸摸屏=1是高速=2中速=3是低速。 這個速度怎么設置?
    發表于 01-09 07:37
    主站蜘蛛池模板: 久久亚洲精品AV无码四区| 偷偷要色偷偷| 真实的强视频免费网站| 久久精品视频在线直播6| 亚洲一卡二卡三卡四卡无卡麻豆| 精品无码日本蜜桃麻豆| 22eee在线播放成人免费视频| 欧美写真视频一区| 国产精品人妻无码久久久蜜桃臀| 亚洲欧美日本中文子不卡| 麻豆E奶女教师国产精品| 成人天堂婷婷青青视频在线观看| 性色AV一区二区三区咪爱四虎| 九九这里有精品| SM脚奴调教丨踩踏贱奴| 性欧美videofree中文字幕| 六六影院午夜伦理| 国产成人片视频一区二区青青| 亚洲色婷婷久久精品AV蜜桃久久| 男人网站在线观看| 国产无线乱码一区二三区| 最近2019中文字幕免费版视频 | 精品久久久久中文字幕加勒比东京热 | 在线高清视频不卡无码| 青青青草国产| 好紧小嫩嫩水的10p| MATURETUBE乱妇| 亚洲伊人久久大香线蕉综合图片| 欧美日韩在线亚洲一| 好想被狂躁A片免费久99| 999视频在线观看| 亚洲精品国产AV成人毛片| 翘臀后进美女白嫩屁股视频| 黄瓜视频苹果直接安装| 草莓视频免费在线观看| 在线观看免费精品国产| 无码中文字幕av免费放| 欧美一区二区三区久久综| 久久一er精这里有精品| 国产女人喷潮视频免费| 菠萝菠萝蜜视频在线看1|