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

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

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

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

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

嵌入式專欄

1

寫在前面幾乎所有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)存。

嵌入式專欄

2

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

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

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

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

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

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

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

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

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

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

從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)榉橇?。下面的第一個(gè)示例演示了這種情況。

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

嵌入式專欄

3

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

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

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

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

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

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

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

嵌入式專欄

4

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

嵌入式專欄

5

使用方法使用方法其實(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é)任編輯:xj

原文標(biāo)題:如何改善FreeRTOS運(yùn)行的速度、RAM大小

文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(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

    文章

    1354

    瀏覽量

    114444
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61915
  • 運(yùn)行速度
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6720

原文標(biāo)題:如何改善FreeRTOS運(yùn)行的速度、RAM大小

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    FreeRTOS是一個(gè)輕量級(jí)的實(shí)時(shí)操作系統(tǒng)(RTOS),其設(shè)計(jì)初衷就是為了提供簡(jiǎn)單、可靠且高效的實(shí)時(shí)任務(wù)管理。關(guān)于FreeRTOS最多支持多少個(gè)任務(wù)的問(wèn)題,實(shí)際上并沒(méi)有一個(gè)固定的上限,
    的頭像 發(fā)表于 09-02 14:21 ?615次閱讀

    關(guān)于BLE通知值的通知長(zhǎng)度問(wèn)題求解

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

    請(qǐng)問(wèn)一下FREERTOS只能創(chuàng)建4個(gè)任務(wù),修改哪個(gè)宏定義可以增加創(chuàng)建任務(wù)的數(shù)量?

    請(qǐng)問(wèn)一下FREERTOS只能創(chuàng)建4個(gè)任務(wù),修改哪個(gè)宏定義可以增加創(chuàng)建任務(wù)的數(shù)量?解決方法:增加FREERTOS的堆。
    發(fā)表于 05-13 06:44

    淺析FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用

    FreeRTOS在MCU領(lǐng)域應(yīng)用非常廣泛,今天就給大家講解一下FreeRTOS調(diào)度器中的三種調(diào)度算法,以及在瑞薩RZ/T2L MPU中的應(yīng)用。
    的頭像 發(fā)表于 05-10 14:02 ?6338次閱讀
    淺析<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>調(diào)度器的三種調(diào)度算法和應(yīng)用

    用的cube生成的freertos工程,串口和任務(wù)通過(guò)郵箱通訊,結(jié)果任務(wù)反應(yīng)很慢是怎么回事?

    初學(xué)freertos。用的cube生成的freertos工程,單片機(jī)型號(hào)位stm32f103vbt6。 建了三個(gè)人物,一個(gè)是串口任務(wù),一個(gè)是LED每秒翻轉(zhuǎn)一次,一個(gè)是空任務(wù)。 串口
    發(fā)表于 05-08 08:13

    freertos系統(tǒng)如何劃分任務(wù)?

    正在看freertos方面的教程,想請(qǐng)教下如何劃分任務(wù)? 比如之前做的一個(gè)數(shù)據(jù)采集板,用到了單片機(jī)以下功能: 1,單片機(jī)通過(guò)SPI1和ADC芯片通訊,同時(shí)還要通過(guò)SPI控制ADC電路部分的其他外圍
    發(fā)表于 05-08 07:16

    freertos如何周期性的執(zhí)行一個(gè)任務(wù),比如200ms調(diào)用一次任務(wù), 用定時(shí)器發(fā)消息?

    freertos如何周期性的執(zhí)行一個(gè)任務(wù),比如200ms調(diào)用一次任務(wù), 用定時(shí)器發(fā)消息?有沒(méi)有一個(gè)函數(shù)能直接實(shí)現(xiàn)
    發(fā)表于 05-07 08:21

    FreeRTOS系統(tǒng)使用xTaskCreate產(chǎn)生的任務(wù)與osThreadDef 產(chǎn)生的線程有什么不同?

    請(qǐng)教下是要 FreeRTOS系統(tǒng), 使用 xTaskCreate 產(chǎn)生的任務(wù) 與 osThreadDef產(chǎn)生的線程有什么不同?
    發(fā)表于 04-29 07:20

    freertos任務(wù)創(chuàng)建,每一個(gè)任務(wù)分配的內(nèi)存是多大才好,怎么計(jì)算呢?

    小白剛剛接觸freertos,想問(wèn)一下就創(chuàng)建任務(wù)而言,每一個(gè)任務(wù)分配的內(nèi)存是多大才好,怎么計(jì)算呢? 另外,每個(gè)任務(wù)的執(zhí)行周期怎么確定?在任務(wù)
    發(fā)表于 04-23 06:39

    為什么CubeMX設(shè)計(jì)的FreeRTOS工程只能正常運(yùn)行3個(gè)任務(wù)?

    用CubeMX4.20設(shè)計(jì)的FreeRTOS工程有六個(gè)任務(wù),出一個(gè)任務(wù)優(yōu)先級(jí)較低外,另外幾個(gè)都是較高優(yōu)先級(jí)。發(fā)現(xiàn)只有3個(gè)任務(wù)是正常運(yùn)行的,還有三個(gè)沒(méi)有運(yùn)行的跡象。用斷點(diǎn)跟蹤法在
    發(fā)表于 04-19 08:23

    freertos串口接收數(shù)據(jù)后如何發(fā)送給任務(wù)?

    正在學(xué)freertos。串口中斷接收一幀數(shù)據(jù)后,放到數(shù)組里,如何將數(shù)據(jù)發(fā)送給任務(wù)呢? 如果用消息隊(duì)列,是否建立的消息隊(duì)列需要是數(shù)組類型的?還是說(shuō)消息列表建立成uint8類型的,列表長(zhǎng)度設(shè)為接收數(shù)據(jù)
    發(fā)表于 04-18 06:36

    FreeRTOS里在中斷中掛起任務(wù)出錯(cuò)的原因?怎么解決?

    各位大佬,新手剛學(xué)習(xí)FreeRTOS,現(xiàn)在想在中斷中掛起某個(gè)任務(wù),我在教程里看到說(shuō)有中斷中的恢復(fù)函數(shù)xTaskResumeFromISR,但是沒(méi)有在中斷中的掛起函數(shù),我搜了一下,有人說(shuō)直接
    發(fā)表于 04-16 08:26

    FreeRTOS任務(wù)無(wú)故進(jìn)入掛起狀態(tài)的原因?

    請(qǐng)教大家一個(gè)問(wèn)題,我子啊使用FreeRTOS的時(shí)候創(chuàng)建了一個(gè)以太網(wǎng)的任務(wù),任務(wù)在使用的過(guò)程中被無(wú)故掛起,請(qǐng)問(wèn)一下出現(xiàn)這種現(xiàn)象有哪幾種原因呢?
    發(fā)表于 04-09 07:20

    如何可視化FreeRTOS任務(wù)響應(yīng)時(shí)間

    高效的開發(fā)基于FreeRTOS的固件需要理解任務(wù)、中斷和內(nèi)核之間的交互以及時(shí)間序列。
    的頭像 發(fā)表于 12-22 11:12 ?1003次閱讀
    如何可視化<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>響應(yīng)時(shí)間

    FreeRTOS中的任務(wù)管理

    任務(wù)FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨(dú)立運(yùn)行。FreeRTOS 中的任務(wù)是基于優(yōu)先級(jí)的搶占式調(diào)度,優(yōu)先級(jí)高的任務(wù)
    的頭像 發(fā)表于 11-27 17:03 ?922次閱讀