十八、FreeRTOS之FreeRTOS任務通知

本節需要掌握以下內容:

1、任務通知的簡介(了解)

2、任務通知值和通知狀態(熟悉)

3、任務通知相關API函數介紹(熟悉)

4、任務通知模擬信號量實驗(掌握)

5、任務通知模擬消息郵箱實驗(掌握)

6、任務通知模擬事件標志組實驗(掌握)

7、課堂總結(掌握)

一、任務通知的簡介(了解)

1.1 任務通知的相關概念

任務通知:用來通知任務的,任務控制塊中的結構體成員變量ulNotifiedValue就是這個通知值。

(隊列、信號量、事件標志組也可以用來通知任務。隊列可以往其它任務發數據,信號量同樣發送一個資源,釋放信號量,另外一個任務獲取信號量,事件標志組把某一位置一,另一個任務就來讀這個位是不是1。這些都能用來通知任務,為什么我們還要用任務通知呢?

最主要的是:內存消耗比較小,因為隊列、信號量、事件標志組使用之前都要提前創建好,才能去操作它,而任務通知就不用去創建,因為它的結構體成員就在任務控制塊TCB里面。

每創建一個任務就會給這個任務的任務控制塊分配個內存,任務控制塊中的結構體成員變量ulNotifiedValue就是這個通知值。而任務創建好之后,這個結構體成員變量就被創建好了)

  • 使用隊列、信號量、事件標志組時都需創建一個結構體,通過中間的結構體進行間接通信!

?使用隊列/信號量/事件標志組時發送數據,就是把發送數據放在隊列/信號量/事件標志組的結構體中,接收也是從隊列/信號量/事件標志組的結構體中讀出來。

  • 使用任務通知時,任務結構體TCB中就包含了內部對象,可以直接接收別人發過來的“通知”

發送的時候實際就是任務一直接去操作任務二 任務控制塊中的?結構體成員變量ulNotifiedValue,給這個成員寫一個值,接收的時候就直接去讀這個值。

?任務通知值的更新方式

  • 不覆蓋接受任務的通知值(這個結構體數據成員有數值就不寫進去,沒有數值的時候才寫進去)
  • 覆蓋接受任務的通知值(不管有沒有數值,都能寫進去)
  • 更新接受任務通知值的一個或多個bit
  • 增加接受任務的通知值

只要合理、靈活的利用任務通知的特點,可以在一些場合中替代隊列、信號量、時間標志組!

1.2 任務通知的優勢及劣勢

任務通知的優勢:

  • 效率更高:使用任務通知向任務發送時間或數據比使用隊列、時間標志組或信號快得多(freeRTOS官方也是做了一個測試,使用任務通知來模擬二值信號量這樣的一個方式來解除任務的阻塞事件,相對于常規的二值信號量,快了45%)
  • 使用內存更小:使用其它方法時都要創建對應的結構體,使用任務通知時無需額外創建結構體

任務通知的劣勢:

  • 無法發送數據給ISR:ISR沒有任務結構體,所以無法給ISR發送數據。但是ISR可以使用任務通知的功能,發數據給任務。(發送可以不能接收)
  • 無法廣播給多個任務:任務通知只能是被指定的一個任務接受并處理
  • 無法緩存多個數據:任務通知時通過更新任務通知值來發送數據的,任務結構體中只有一個任務通知值,只能一個數據。(隊列的話,只要有m個隊列項就保存m個數據)
  • 發送受阻不支持阻塞:發送方無法進入阻塞狀態等待(隊列已滿,可以阻塞)

二、任務通知值和通知狀態

任務都有一個結構體:任務控制塊TCB,它里邊有兩個結構體成員變量:

  • 一個是uint32_t類型,用來表示通知值
  • 一個是uint8_t類型,用來表示通知狀態

2.1 任務通知值

任務通知值的更新方式有多種類型:

  • 計數值(發送一次任務通知值更新,數值類型累加,類似信號量)
  • ?相應位置一(發送一次任務通知值更新,相應位置一,類似事件標志組)
  • 任意數值(支持覆寫和不覆寫,類似隊列)

2.2 任務通知狀態

其中任務通知狀態共有三種值:

  • ?任務未等待通知:任務通知默認的初始化狀態
  • 等待通知:接收方已經準備好了(調用了接收任務通知函數),等待發送放給個通知
  • 等待接收:發送方已經發送出去了(調用了發送任務通知函數),等待接收方接收

三、任務通知相關API函數介紹(介紹)

任務通知API函數主要有兩類:①發送通知,②接收通知。

注意:發送通知API函數可以用于任務和中斷服務函數中;接收通知API函數只能用在任務中。(因為中斷沒有任務控制塊這個結構體)

3.1 發送通知相關API函數:

函數

描述

xTaskNotify()

發送通知,帶有通知值

xTaskNotifyAndQuery()

發送通知,帶有通知值并且保留接收任務的原通知值

xTaskNotifyGive()

發送通知,不帶通知值

xTaskNotifyFromISR()

在中斷中發送任務通知

xTaskNotifyAndQueryFromISR()

vTaskNotifyGiveFromISR()

?在任務中發送通知的3個API函數原型如下所示,可以看到內部都是都是調用的xTaskGenericNotity()函數,唯一的區別就是帶入的入口參數有去區別

?

xTaskGenericNotity()函數參數?如下:

形參

描述

xTaskToNotify

接收任務通知的任務句柄

uxIndexToNotify

任務的指定通知(任務通知相關數組成員)

ulValue

任務通知值

eAction

通知方式(通知值更新方式)

pulPreviousNotificationValue

用于保存更新前的任務通知值(為NULL則不保存)

?任務通知方式共有以下幾種:

?3.2 接收通知相關API函數:

函數

描述

ulTaskNotifyTake()

獲取任務通知,可以設置在退出此函數的時候將任務通知值清零或者減一。

當任務通知用作二值信號量或者計數信號量的時候,使用此函數來獲取信號量。

xTaskNotifyWait()

獲取任務通知,比 ulTaskNotifyTak()更為復雜,可獲取通知值和清除通知值的指定位

總結:?

  • 當任務通知用作于信號量時,使用函數獲取信號量:ulTaskNotifyTake()
  • 當任務通知用作于事件標志組或隊列時,使用此函數來獲取: xTaskNotifyWait()
3.2.1?任務通知用作于信號量ulTaskNotifyTake()

?此函數用于接收任務通知值,可以設置在退出此函數的時候將任務通知值清零或者減一

形參

描述

uxIndexToWaitOn

任務的指定通知(任務通知相關數組成員)

xClearCountOnExit

指定在成功接收通知后,將通知值清零或減 1

pdTRUE:把通知值清零;pdFALSE:把通知值減一

xTicksToWait

阻塞等待任務通知值的最大時間

返回值

描述

0

接收失敗

0

接收成功,返回任務通知的通知值

3.2.2?任務通知用作于事件標志組或隊列 xTaskNotifyWait()

?此函數用于獲取通知值和清除通知值的指定位值,適用于模擬隊列和事件標志組,使用該函數來獲取任務通知。

形參

描述

uxIndexToWaitOn

任務的指定通知(任務通知相關數組成員)

ulBitesToClearOnEntry

等待前清零指定任務通知值的比特位(舊值對應bit0

ulBitesToClearOnExit

成功等待后清零指定的任務通知值比特位(新值對應bit0

pulNotificationValue

用來取出通知值(如果不需要取出,可設為NULL

xTicksToWait

阻塞等待任務通知值的最大時間

返回值

描述

pdTRUE

等待任務通知成功

pdFALSE

等待任務通知失敗

?四、任務通知模擬信號量實驗(掌握)

4.1、實驗目的:

學習 FreeRTOS 的任務通知功能模擬二值信號量和計數型信號量

4.2、實驗設計:

將設計三個任務:start_task、task1、task2

三個任務的功能如下:

  • start_task:用來創建task1和task2任務
  • task1:用于按鍵掃描,當檢測到按鍵KEY0被按下時,將發送任務通知
  • task2:用于接收任務通知,并打印相關提示信息

4.3 實驗代碼

demo.c

五、任務通知模擬信息郵箱實驗(掌握)

5.1、實驗目的:

學習 FreeRTOS 的任務通知功能模擬消息郵箱

5.2、實驗設計:

將設計三個任務:start_task、task1、task2

三個任務的功能如下:

  • start_task:用來創建task1和task2任務
  • task1:用于按鍵掃描,將按下的按鍵鍵值通過任務通知發送給指定任務
  • task2:用于接收任務通知,并根據接收到的數據做相應動作

5.3 實驗代碼

demo.c

代碼明天更新

六、任務通知模擬時間標志組實驗(掌握)

6.1、實驗目的:

學習 FreeRTOS 的任務通知功能模擬事件標志組

6.2、實驗設計:

將設計三個任務:start_task、task1、task2

三個任務的功能如下:

  • start_task:用來創建task1和task2任務
  • task1:用于按鍵掃描,當檢測到按鍵按下時,發送任務通知設置不同標志位
  • task2:用于接收任務通知,并打印相關提示信息

6.3 實驗代碼

demo.c

七、課堂總結

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

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

相關文章

智能無人零售:革新零售消費體驗的未來

智能無人零售:革新零售消費體驗的未來 在當今數字化時代,智能無人零售正以驚人的速度改變著我們的購物方式和消費體驗。這一新興領域的發展,為消費者帶來了前所未有的便利和個性化選擇。 智能無人零售是指利用先進的智能技術和自動化系統&…

【面試題:對象引用在內存中存在何處?基于何種計算機原理獲取對象的值?】

嗨,小伙伴們!小米在這里啦,今天給大家分享一個超有趣的話題——面試題:對象引用是存在內存哪,基于什么計算機原理獲取對象的值?廢話不多說,讓我們一起深入了解一下這個充滿技術魅力的問題吧&…

Java 安全框架shiro初探之一

1.Java安全框架除了spring家族另一個就是shiro框架 不過最近還有一個國產框架很好用:Sa-Token 添加鏈接描述,想了解的小伙伴可以去look look shiro 官方文檔 (https://shiro.apache.org/) 1. 學習教程 參考 (https://www.w3cschool.cn/shiro/) Apac…

2024濟南大健康展會,第六屆中國國際健康產業博覽會5月舉辦

大力發展全國健康事業 助力健康中國行動戰略 DJK 2024第6屆中國(濟南)國際大健康產業博覽會 The 2024 sixth China (Jinan) International Big Health Industry Expo 時間:2024年05月27日—29日 場館:中國濟南黃河國際會展中心 …

java中實現線程池的方式有哪些?

在 Java 中,實現線程池的方式主要有兩種: ThreadPoolExecutor 類: ThreadPoolExecutor 是 Java 提供的靈活、強大的線程池實現類。通過創建 ThreadPoolExecutor 對象,可以自定義線程池的各種參數,包括核心線程數、最大…

JavaScript-節點操作

節點操作 DOM節點 DOM節點:DOM樹里每一個內容都稱之為節點 節點類型: 元素節點 所有的標簽 比如body、divhtml時跟節點 屬性節點 所有的屬性,比如href 文本節點 所有的文本 其他 查找節點 節點的關系:針對的找親戚返回的都是…

java_springboot_ssm流浪寵物救助報名管理系統

用戶: 注冊登錄 寵物百科:提供一些養寵物的專業知識、養寵前的注意事項等等 寵物信息:包括寵物圖片、品種、性別、年齡、疫苗、領取要求等內容 寵物領養:領養人自己的詳細住址、收入情況、有無養過寵物的記錄(有則出示…

學習Java第64天,請求轉發和響應重定向

請求轉發和響應重定向 概述 什么是請求轉發和響應重定向 請求轉發和響應重定向是web應用中間接訪問項目資源的兩種手段,也是Servlet控制頁面跳轉的兩種手段 請求轉發通過HttpServletRequest實現,響應重定向通過HttpServletResponse實現 請求轉發生活舉例: 張三找李四借錢,李四…

人工智能原理復習--搜索策略(二)

文章目錄 上一篇啟發式搜索與或圖搜索博弈下一篇 上一篇 人工智能原理復習–搜索策略(一) 啟發式搜索 提高一般圖搜索效率的關鍵是優化OPEN表中節點的排序方式 最理想的情況是每次排序OPEN表表首n總在解答路徑上 全局排序–對OPEN表中的所有節點進行…

vue實例事件

實例方法 / 事件 vm.$on 監聽當前實例上的自定義事件。事件可以由 vm.$emit 觸發。回調函數會接收所有傳入事件觸發函數的額外參數。 vm.$on(test, function (msg) {console.log(msg) }) vm.$emit(test, hi) // > "hi"vm.$once( event, callback ) 監聽一個自定義…

Vue筆記(二)基本語法

基本語法 <style> table {border-collapse: collapse;margin:0 auto; } strong {color: rgb(235, 51, 100); }td, th {padding-left: 6px; } table tr td:first-child {width:150px } table tr td:nth-child(2) {width:300px } </style> <template><tabl…

mysql面試題——MVCC

一&#xff1a;什么是MVCC&#xff1f; 多版本并發控制&#xff0c;更好的方式去處理讀-寫沖突&#xff0c;就是為了查詢一些正在被另一個事務更新的行&#xff0c;并且可以看到它們被更新之前的值&#xff0c;這樣在做查詢的時候就不用等待另一個事務釋放鎖。 二&#xff1a…

萬界星空科技mes系統中看板管理

我們很多企業現在都有大屏&#xff0c;那到底萬界星空科技低代碼云mes系統管理中看板管理有什么作用&#xff1f;我總結了幾條: 1.提高車間的生產效率 2.有效的監控設備運行狀況 3.控制生產線運行 4.增加和改善用戶體驗 5.提高工作效率和工作安全性

Zabbix監控騰訊云VPC

一、簡介 私有網絡&#xff08;Virtual Private Cloud&#xff0c;VPC&#xff09;是騰訊云上一塊由用戶自定義的邏輯隔離網絡空間&#xff0c;為云服務器、云數據庫等資源提供安全可控的網絡環境。通過構建邏輯隔離的、用戶自定義配置的網絡空間&#xff0c;用戶能夠提升其云…

vue組件插槽

組件的插槽 組件本身就是一個容器&#xff0c;也可以是一個vue對象&#xff0c;也是一個虛擬DOM 普通插槽 組件本身是一個容器&#xff0c;這個容器本身是空的&#xff0c;當我們把需要封裝的html結構裝進去之后&#xff0c;我們可以認為這個容器被塞滿了&#xff0c;那就意…

WIN11家庭中文版使用ENSP+VirtualBox啟動AR失敗40錯誤+未完全關閉hyper-V,以及安裝VirtualBox兼容性問題

使用版本&#xff1a;eNSP 1.3.00.100VirtualBox 5.2.44WinPcap_4_1_3Wireshark最新版。 win11系統最好按照上述版本安裝&#xff0c;VirtualBox不要安裝更高版本&#xff0c;否則可能出現不兼容情況&#xff0c;Wireshark版本要求還好&#xff0c;安裝順序是VirtualBox 5.2.4…

python+pytest接口自動化之參數關聯

什么是參數關聯&#xff1f; 參數關聯&#xff0c;也叫接口關聯&#xff0c;即接口之間存在參數的聯系或依賴。在完成某一功能業務時&#xff0c;有時需要按順序請求多個接口&#xff0c;此時在某些接口之間可能會存在關聯關系。比如&#xff1a;B接口的某個或某些請求參數是通…

如何利用人工智能+物聯網技術實現自動化設備生產

隨著科技的發展與行業競爭的日益激烈&#xff0c;制造業也逐漸走向智能化發展。制造業的改革是利用物聯網技術和自動化設備&#xff0c;實現生產線的智能化和自適應生產&#xff0c;優化生產流程&#xff0c;提高生產效率和質量&#xff0c;為企業創造更大的價值。 方案概述 智…

Gif表情包怎么用圖片制作?一招簡單易上手

很多朋友對于gif動圖的名字不是很熟悉&#xff0c;但是對于“gif表情包”一定很熟悉吧&#xff01;在日常網絡聊天中經常能見到其的身影&#xff0c;能夠調節聊天的氣氛。想要制作gif表情包可以使用gif動圖在線制作&#xff08;https://www.gif.cn/&#xff09;網站-GIF中文網&…

【C語言期末】題目+解析

文章目錄 題目1.下面哪個不是C語言的基本數據類型&#xff1f;&#xff08; B &#xff09;2.C語言的標識符應以字母或&#xff08; A &#xff09;開頭。3.如果需要在C程序里調用標準函數庫中的printf函數&#xff0c;則應該在程序的開頭包含哪個頭文件&#xff1f;&#xff0…