女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

    文章

    1391

    瀏覽量

    116614
  • API
    API
    +關注

    關注

    2

    文章

    1558

    瀏覽量

    63416
  • RTOS
    +關注

    關注

    24

    文章

    837

    瀏覽量

    120669
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RVCT編譯器是否比GNU的編譯器的代碼執行速度更快?

    ,是rvct3.1還是rvct4.0?如何把rvct編譯器集成到ide中? 2、RVCT編譯器是否比GNU的編譯器的代碼執行速度更快?
    發表于 05-08 07:49

    如何提高弧光保護裝置的動作速度

    ,提高故障判斷的速度和準確性。 提升硬件性能:選用響應速度更快的弧光傳感器,確保能迅速感知弧光的產生輸出信號;同時,配備高性能的主控單元和通信模塊,加快信號處理和傳輸
    發表于 05-06 10:09

    S32K116不能使用全部RAM怎么解決?

    'm_data_2' 溢出 0 字節 當它是 8192 時,RAM 只使用了將近 9 KB,小于總 RAM 空間 16kB,為什么會提醒錯誤,如何解決?
    發表于 03-26 07:26

    如何優化RAM內存使用

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

    RAM內存頻率對性能的影響

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

    什么是RAM內存 RAM內存對電腦性能的影響

    所有存儲的數據。RAM的主要作用是提供快速的數據訪問,以便CPU(中央處理器)能夠高效地執行程序和處理任務。 RAM內存對電腦性能的影響 RAM對電腦性能的影響是顯著的,以下是幾個關鍵
    的頭像 發表于 11-11 09:38 ?5355次閱讀

    制造業使用數字孿生來提高效率減少排放

    將工業生產的碳足跡減少 1%,每年就能減少 9000 萬噸二氧化碳排放,這相當于每年減少 2000 多萬輛汽油車上路。 借助數字孿生和加速計算等技術,制造商能夠減少排放、提高能效
    的頭像 發表于 11-08 11:19 ?698次閱讀

    如何在KEIL軟件中將變量定義在特定的RAM空間

    _____________________________________________________________如何在KEIL軟件中將變量定義在特定的RAM空間
    發表于 10-16 22:47

    ram和eeprom各有什么特點

    速度非常快速和高效。 高速讀寫速度RAM具有非常快的讀寫速度,通常以納秒級別的延遲進行數據讀取和寫入。這使得CPU可以迅速從RAM中獲取
    的頭像 發表于 09-18 11:11 ?1653次閱讀

    AMD創下STAC基準測試最快電子交易執行速度世界紀錄

    從復雜的算法交易和交易前風險評估到實時市場數據傳輸,當今領先的交易公司、做市商、對沖基金、經紀商和交易所都在不斷追求最低時延的交易執行,以獲得競爭優勢。
    的頭像 發表于 09-18 09:21 ?531次閱讀

    freertos最多支持多少個任務

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

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

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

    請問如何將幾十K大小的數組存放在flash里面,不占用內存空間呢?

    請問如何將幾十K大小的數組存放在flash里面,不占用內存空間呢? 用了const好像不管用,還是占用了heap空間
    發表于 07-19 07:10

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

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

    端點存儲器 (EPM) 位于何處? 系統RAM還是MMIO寄存器空間

    您好,端點存儲器 (EPM) 位于何處? 系統 RAM 還是 MMIO 寄存器空間? 非常感謝!
    發表于 05-30 07:52