91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

FreeRTOS的直接任務(消息)通知

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2021-01-07 09:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

嵌入式專欄

1

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

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

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

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

嵌入式專欄

2

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

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

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

51ced8f2-507c-11eb-8b86-12bb97331649.png

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

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

525d7ce2-507c-11eb-8b86-12bb97331649.png

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

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

52ac85da-507c-11eb-8b86-12bb97331649.png

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

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

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

嵌入式專欄

3

進一步分析直接任務通知通過對比FreeRTOS V10.4.0和之前版本,你會發(fā)現(xiàn)V10.4.0多了一些API,比如ulTaskNotifyTake / ulTaskNotifyTakeIndexed:

530f67cc-507c-11eb-8b86-12bb97331649.png

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

53c0628e-507c-11eb-8b86-12bb97331649.png

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

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

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

嵌入式專欄

4

使用直接任務通知性能優(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ā)送完成。

嵌入式專欄

5

使用方法使用方法其實很簡單,只要你會使用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 );    }}

責任編輯:xj

原文標題:如何改善FreeRTOS運行的速度、RAM大小

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。


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

    關注

    8

    文章

    1399

    瀏覽量

    120523
  • FreeRTOS
    +關注

    關注

    14

    文章

    499

    瀏覽量

    66890
  • 運行速度
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6850

原文標題:如何改善FreeRTOS運行的速度、RAM大小

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    FreeRTOS入門資料

    性和可靠性。 FreeRTOS是一個迷你的實時操作系統(tǒng)內(nèi)核。作為一個輕量級的操作系統(tǒng),功能包括:任務管理、時間管理、信號量、消息隊列、內(nèi)存管理、記錄功能、軟件定時器、協(xié)程等,可基本滿足較小系統(tǒng)的需要
    發(fā)表于 01-23 06:38

    ucos與freertos哪個好?

    選擇uCOS或FreeRTOS取決于項目的具體需求和資源限制。 FreeRTOS的優(yōu)點包括: 更小的內(nèi)核ROM和RAM占用,特別是在RAM方面,適合資源受限的嵌入式系統(tǒng)。 支持協(xié)程
    發(fā)表于 12-05 07:13

    FreeRTOS 空閑任務

    FreeRTOS 中很多人會注意到為什么有一個叫IDLE task的任務占用了CPU百分之九十多的使用權,但是這個任務并沒有自己手動創(chuàng)建。原因就是這個空閑任務是系統(tǒng)自己創(chuàng)建的,每當系統(tǒng)
    發(fā)表于 12-04 07:35

    RTOS 必學概念:任務、信號量、隊列一次搞懂

    個FIFO緩沖區(qū)?”這些問題聽起來基礎,但又總是繞在初學者腦子里。很多人直接FreeRTOS、RTX這樣的RTOS例程開搞,能跑起來,卻完全沒理解任務調(diào)度、信號
    的頭像 發(fā)表于 11-17 10:53 ?465次閱讀
    RTOS 必學概念:<b class='flag-5'>任務</b>、信號量、隊列一次搞懂

    FreeRTOS和uC/OS-II的功能特性

    FreeRTOS: 核心功能: 任務調(diào)度(固定優(yōu)先級搶占式 + 時間片輪詢)、隊列、信號量(二進制、計數(shù))、互斥鎖(帶優(yōu)先級繼承)、軟件定時器、事件組(事件標志)、任務通知(高效輕量級
    發(fā)表于 11-17 08:17

    freertos關閉任務調(diào)度的方法

    #include \"FreeRTOS.h\" #include \"task.h\" /* 關閉任務調(diào)度 */ void
    發(fā)表于 11-17 06:47

    FreeRTOS任務調(diào)度及優(yōu)先級問題

    大家好,最近本人在學習FreeRTOS ,之前有過一些裸機開發(fā)的經(jīng)驗,目前知道了FreeRTOS任務是基于時間片輪轉來調(diào)度,也就是知道了任務會基于各個時間片來運行。 于是聯(lián)想了如果有
    發(fā)表于 11-06 02:18

    關于BLE通知值的通知長度問題求解

    FreeRtos 中的 streambuffer 的壓力。 如果 notify 支持每次通知大小大于 244 的數(shù)組,我需要做哪些修改才能實現(xiàn)每次通知大小為 512 或 1024 的數(shù)組。
    發(fā)表于 07-01 06:58

    FreeRTOS任務中發(fā)送事件隊列是有什么限制嗎?

    到了TMC的芯片,但是在到位上報的信息中少了卡死電機的上報。所以有的電機的到位中斷并沒有成功寫入任務。 一開始是每個電機都開啟了一個定時器查詢,后續(xù)改成一個定時器查六個電機并將定時器的周期加到50ms,就很少會卡死。 所以向FreeRTOS
    發(fā)表于 06-11 07:57

    HarmonyOS NEXT應用開發(fā)-Notification Kit(用戶通知服務)通知類型、級別與渠道

    。 NOTIFICATION_CONTENT_SYSTEM_LIVE_VIEW11+ 5 實況窗類型通知。不支持三方應用直接創(chuàng)建該類型通知,可以由系統(tǒng)代理創(chuàng)建系統(tǒng)實況窗類型通知后,三方
    發(fā)表于 06-09 14:39

    詳解FreeRTOS與SAFERTOS的區(qū)別

    開源免費的FreeRTOS由Richard Barry在WHIS工作時創(chuàng)建,WHIS基于FreeRTOS的功能模型,通過完整的HAZOP分析,確定了功能模型和API中的所有的弱點,減輕所有薄弱環(huán)節(jié),并采用IEC 61508 SIL 3的開發(fā)生命周期,重新設計實現(xiàn)了SAFE
    的頭像 發(fā)表于 06-04 16:58 ?908次閱讀
    詳解<b class='flag-5'>FreeRTOS</b>與SAFERTOS的區(qū)別

    FreeRTOS讀取ADS1299數(shù)據(jù)有誤

    您好,請問,用stm32的FreeRTOS的隊列對ADS1299傳感器讀取數(shù)據(jù),已設置采樣率為2khz 在采集任務中:通過spi讀取數(shù)據(jù)——濾波(-DSP庫)——將數(shù)據(jù)寫入隊列——延時
    發(fā)表于 05-05 22:48

    【RA-Eco-RA4M2開發(fā)板評測】RA-Eco-RA4M2 移植FreeRTOS

    FreeRTOS、Threadx,這里選擇FreeRTOS。 Figure 2?5 選擇RTOS 接下來就是選擇工程模板。 Figure 2?6 工程模板選擇 接下來在新建一個空任務。點擊“Stacks
    發(fā)表于 05-03 23:24

    FreeRTOS進階使用之流緩沖區(qū):高效處理字節(jié)流的秘密武器

    在嵌入式開發(fā)中,流緩沖區(qū)(Stream Buffer)是FreeRTOS中用于高效處理字節(jié)流數(shù)據(jù)傳輸?shù)暮诵臋C制,尤其適合任務間或中斷與任務間的連續(xù)數(shù)據(jù)傳輸場景(如串口通信、網(wǎng)絡數(shù)據(jù)流等)。本文將深入
    發(fā)表于 03-24 11:37

    移植LWIP+FREERTOS時遇到的問題怎么解決?

    :將ST官網(wǎng)的LWIP1.4.1 的例子(關于LWIP的部分)移植到步驟1 的FreeRTOS 系統(tǒng)的工程里面,只是添加LWIP初始化的任務,并沒有調(diào)用任何接口的情況下可以Ping 通 而且長時間
    發(fā)表于 03-11 06:48