FreeRTOS(任務通知)

資料來源于硬件家園:資料匯總 - FreeRTOS實時操作系統課程(多任務管理)

目錄

一、任務通知的概念

1、概念

2、發送通知給任務的方式

3、任務通知使用限制

二、任務通知的運行機制

三、任務通知的API函數

1、任務通知的數據結構

2、常用的API函數

3、函數xTaskNotifyGive()

4、函數ulTaskNotifyTake()

5、函數xTaskNotify()

6、函數ulTaskNotifyWait()

7、使用說明

四、任務通知代替二值信號量

五、任務通知代替計數信號量

六、任務通知代替隊列

七、任務通知代替事件組


一、任務通知的概念

1、概念

FreeRTOS 從 V8.2.0 版本開始提供任務通知功能,每個任務都有一個 32位的通知值,在多數情況下,任務通可以替代二值信號量、計數信號量、事件組,也可以替代長度為1的隊列(可以保存一個 32位整數或指針值)。

相對于以前使用 FreeRTOS 內核通信的資源時必須創建隊列、二進制信號量、計數信號量或事件組的情況,使用任務通知顯然更靈活。按照 FreeRTOS 官方的說法,使用任務通知比通過信號量等ICP通信方式解除阻塞的任務速度快45%,并且更加省RAM內存空間,任務通知的使用無須創建隊列。要想使用任務通知,必須將FreeRTOSConfig.h中的宏定義configUSE_TASK_NOTIFICATIONS設置為1。其實 FreeRTOS 默認是為1的,所以任務通知是默認可用的。

2、發送通知給任務的方式

> 發送通知給任務,如果有通知未讀,則不覆蓋通知值。

>?發送通知給任務,直接覆蓋通知值。

>發送通知給任務, 設置通知值的一個或者多個位,可以當作事件組來使用。

>?發送通知給任務,遞增通知值,可以當作信號量使用。

通過對以上任務通知方式的合理使用,可以在一定場合下替代 FreeRTOS 的信號量、隊列、事件組等。

3、任務通知使用限制

當然,凡事都有利弊,消息通知雖然處理更快,RAM 開銷更小,但也有以下限制:

>只能有一個任務接收通知消息,因為必須指定接收通知的任務。

>只有等待通知的任務可以被阻塞,發送通知的任務在任何情況下都不會因為發送失敗

而進入阻塞態。

二、任務通知的運行機制

任務通知屬于任務附帶的資源,所以在任務被創建時,任務通知也被初始化,我們知道在使用隊列、信號量前,必須先創建隊列和信號量,目的是創建隊列數據結構,比如使用xQueueCreate() 函數創建隊列,用xSemaphoreCreateBinary()函數創建二值信號量等。再來看任務通知,由于任務通知的數據結構包含在任務控制塊中,只要任務存在,任務通知數據結構就已經創建完畢,可以直接使用,所以使用時很方便

任務通知可以在任務中向指定任務發送通知,也可以在中斷中向指定任務發送通知。FreeRTOS的每個任務都有一個32位的通知值,任務控制塊中的成員變量ulNotifiedValue 就是這個通知值。只有在任務中可以等待通知,而不允許在中斷中等待通知。如果任務在等待的通知暫時無效,任務會根據用戶指定的阻塞超時時間進入阻塞狀態,我們可以將等待通知的任務看作消費者;其他任務和中斷可以向等待通知的任務發送通知,發送通知的任務和中斷服務函數可以看作生產者,當其他任務或者中斷向這個任務發送任務通知,且任務獲得通知以后,該任務就會從阻塞態中解除,這與 FreeRTOS 中內核的其他通信機制一致。

三、任務通知的API函數

1、任務通知的數據結構

任務通知是任務控制塊的資源,屬于任務控制塊中的成員變量。

ulNotifiedValue:?任務通知值,用于保存一個32位整數或指針值

ucNotifyState:??任務通知狀態,用于標識任務的通知狀態

2、常用的API函數

①?替代二值信號量與計數信號量

發送任務通知:

xTaskNotifyGive()

vTaskNotifyGiveFromISR()

獲取任務通知:

ulTaskNotifyTake()

② 替代長為1的隊列與事件組

發送任務通知:

xTaskNotify()

vTaskNotifyFromISR()

獲取任務通知:

ulTaskNotifyWait()

3、函數xTaskNotifyGive()

①?函數原型

?功能如下:在任務中向指定任務發送通知,使任務通知值加1,這種方式用于信號量

②形參說明

形參1:任務句柄

形參2:?任務通知值,取0

形參3:?指示任務控制塊中的變量 ulNotifiedValue 實現加一操作

形參4:空

③返回值

沒有超時機制,永遠返回pdPASS

4、函數ulTaskNotifyTake()

①?函數原型

功能如下:在任務中獲取通知,與xTaskNotifyGive()配套使用,用于替代二值信號量與計數信號量

②形參說明

形參1:退出時是否清零計數。pdTRUE->清零, pdFALSE ->?減1

形參2:?超時時間,單位為系統節拍

③返回值

返回任務之前的任務通知值

5、函數xTaskNotify()

①?函數原型

功能如下:在任務中向指定任務發送通知,根據eAction的值完成不同操作

②形參說明

形參1:任務句柄

形參2:?任務通知值

形參3:?如下圖片

形參4:?空

③返回值

根據上面第 3 個形參的說明,將其設置為 eSetValueWithoutOverwrite,有可能返回pdFALSE,其余所有情況都返回值 pdPASS

6、函數ulTaskNotifyWait()

①?函數原型

功能如下:在任務中獲取通知,與xTaskNotify()配套使用,用于替代長度位1的隊列與事件組

②形參說明

形參1:進入函數時,清除哪些位? ->??0:無變化? ? 1:清除相應位

形參2:退出函數時,清除哪些位? ->??0:無變化? ? 1:清除相應位

形參3:保存通知值

形參4:?超時時間,單位為系統節拍

③返回值

pdTRUE:?獲取任務通知成功

pdFALSE:獲取任務通知失敗

7、使用說明

四、任務通知代替二值信號量

五、任務通知代替計數信號量

?

?

六、任務通知代替隊列

?

?

七、任務通知代替事件組

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36550.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

opencv實戰項目 手勢識別-實現尺寸縮放效果

手勢識別系列文章目錄 手勢識別是一種人機交互技術,通過識別人的手勢動作,從而實現對計算機、智能手機、智能電視等設備的操作和控制。 1. opencv實現手部追蹤(定位手部關鍵點) 2.opencv實戰項目 實現手勢跟蹤并返回位置信息&…

Linux elasticsearch設置為開機自啟動服務

Linux elasticsearch怎么設置為設置為開機自啟動服務 1、進入/etc/init.d目錄 cd /etc/init.d 2、新建文件elasticsearch,注意,沒有擴展名 vi elasticsearch 3、新建文件elasticsearch的內容如下 說明: (1)“su…

基于低代碼和數字孿生技術的電力運維平臺設計

電力能源服務商在為用能企業提供線上服務的時候,不可避免要面對用能企業的各種個性化需求。如果這些需求和想法都要靠平臺廠家研發人員來實現,那在周期、成本、效果上都將是無法滿足服務運營需要的,這也是目前很多線上能源云平臺應用效果不理…

【狀態模式】拯救if-else堆出來的屎山代碼

前言 我想大家平時都在開發重都遇見過屎山代碼,這些屎山代碼一般都是由于復雜且龐大的if-else造成的,狀態模式,是一種很好的優化屎山代碼的設計模式,本文將采用兩個業務場景的示例來講解如何使用狀態模式拯救屎山代碼。 目錄 前…

【Axure高保真原型】通過輸入框動態控制環形圖

今天和大家分享通過輸入框動態控制環形圖的原型模板,在輸入框里維護項目數據,可以自動生成對應的環形圖,鼠標移入對應扇形,可以查看對應數據。使用也非常方便,只需要修改輸入框里的數據,或者復制粘貼文本&a…

簡單記錄牛客top101算法題(初級題C語言實現)BM17 二分查找 BM21 旋轉數組的最小數字 BM23 二叉樹的前序遍歷

1. BM17 二分查找 要求:給定一個 元素升序的、無重復數字的整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標(下標從 0 開始),否則返回 -1。 輸入&#xff1a…

【云原生】K8S存儲卷:PV、PVC詳解

目錄 一、emptyDir存儲卷二、hostPath存儲卷三、nfs共享存儲卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2創建動態PV 一、emptyDir存儲卷 容器磁盤上的文件的生命周期是短暫的,這就使得在容器中運行重要應用時會出現一些問題。首先,當容器崩潰時,ku…

UG NX二次開發(C++)-PK函數創建一條圓弧曲線

文章目錄 1、前言2、創建一個項目3、添加頭文件4、在do_it中添加創建圓曲線的源代碼5、調用dll6、再創建一個長方體驗證1、前言 采用PK進行UG NX二次開發,現在看到的文章很多是直接創建實體,然后在UG NX的視圖區顯示出來,對于創建圓曲線的文章不多,本文講一下PK函數創建圓…

Java基礎篇--日期時間類

目錄 前言 Instant(時間戳)類 LocalData(日期)類 LocalTime(時間)類 LocalDataTime(日期時間)類 Duration(時間間隔)類 Period(日期間隔)類 Clock(獲取時區)類 前言 在開發中經常需要處理日期和時間,Java提供…

Git 代碼分支規范

目的 俗話說:沒有規矩,不成方圓。遵循一個好的規章制度能讓你的工作事半功倍。同時也可以展現出你做事的認真的態度以及你的專業性,不會顯得雜亂無章,管理困難。Git分支規范也是一樣。當遵循了某種約定的Git分支,在代…

若依框架淺淺介紹

由若依官網所給介紹可知 1、文件結構介紹 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模塊,在ruoyi-framework的pom.xml文件中引入了ruoyi-system模塊。 2、技術棧介紹 前端:Vue、Element UI后端&#xff1a…

Redis持久化機制簡介

當涉及到Redis的持久化時,有兩種主要的持久化方式:RDB(Redis Database)快照和AOF(Append-Only File)日志。這些方式可以根據需求的不同,選擇適合的策略。 RDB(Redis Database&#…

第1章:緒論

科學、技術、工程、應用 科學:是什么、為什么技術:怎么做工程:怎樣做的多快好省應用:怎么使用 定義 機器學習:利用經驗改善系統自身的性能。 研究 智能數據分析(數據分析算法) 典型的機器…

電腦ip地址怎么改 ip地址怎么改到別的城市

一、ip地址怎么改到別的城市 1.ip地址怎么改到別的城市,1、重啟WIFI路由設備 一般手機或電腦在家或公司上網時都是接入到路由器的WIFI網絡,再由路由器分配上網IP地址,如果要更換上網IP那么重啟路由器設備后,路由器會向網絡運營商進行寬帶的重新撥號,此時手機或電腦設…

【【verilog 典型電路設計之加法器樹乘法器】】

verilog 典型電路設計之加法器樹乘法器 加法器樹乘法器 加法器樹乘法器的設計思想是“移位后加”,并且加法運算采用加法器樹的形式。乘法運算的過程是,被乘數與乘數的每一位相乘并且乘以相應的權值,最后將所得的結果相加,便得到了…

mongodb:環境搭建

mongodb 是什么? MongoDB是一款為web應用程序和互聯網基礎設施設計的數據庫管理系統。沒錯MongoDB就是數據庫,是NoSQL類型的數據庫 為什么要用mongodb? (1)MongoDB提出的是文檔、集合的概念,使用BSON&am…

【Go】常見的四個內存泄漏問題

Goroutine沒有順利結束 1、這里更多的是由于channelforselect導致的,錯誤的寫法導致了發送者或接收者沒有發現channel已經關閉,任務已經結束了,卻仍然在嘗試輸入輸出https://geektutu.com/post/hpg-exit-goroutine.html Map的remove方法不會…

selenium.webdriver Python爬蟲教程

文章目錄 selenium安裝和使用 selenium安裝和使用 pip install selenium 下載對應的瀏覽器驅動 實例化瀏覽器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制瀏覽器

HTB-Keeper

HTB-Keeper 信息收集80端口 lnorgaardroot 信息收集 80端口 80主頁給了一個跳轉的鏈接 跟隨鏈接后到了一個登陸界面。 嘗試搜索默認密碼。 通過賬號root:password登錄。不知道為什么我登陸了兩次才成功。 通過搜索在Admin->Users->Select里面發現了用戶信息。 lno…

WS2812B————動/靜態顯示

一,系統架構 二,芯片介紹 1.管腳說明 2.數據傳輸時間 3.時序波形 4.數據傳輸方法 5.常用電路連接 三,代碼展示及說明 驅動模塊 在驅動模塊首先選擇使用狀態機,其中包括,空閑狀態,復位清空狀態&#xff0c…