[FreeRTOS 內部實現] 事件組

文章目錄

    • 事件組結構體
    • 創建事件組
    • 事件組等待位
    • 事件組設置位


事件組結構體

// 路徑:Source/event_groups.c
typedef struct xEventGroupDefinition
{EventBits_t uxEventBits;List_t xTasksWaitingForBits;		
} EventGroup_t;

uxEventBits 中的每一位表示某個事件是否發生。 具體事件由程序員來確定,大小為uint32_t。
xTasksWaitingForBits 為等待事件鏈表。 若某個事件檢測到uxEventBits中所需要的位沒有置位,就會將自己保存在該鏈表中等待。


創建事件組

使用 xEventGroupCreate 函數進行事件組創建

EventGroupHandle_t xEventGroupCreate( void )// 1、申請事件組結構體 EventGroup_t 空間-> pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );// 2、初始化結構體中uxEventBits 事件位-> pxEventBits->uxEventBits = 0;// 3、初始化等待事件組鏈表vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );

事件組等待位

使用xEventGroupWaitBits 函數進行事件等待,函數定義如下:

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )

第一參數 EventGroupHandle_t xEventGroup :已經申請并且需要操作事件組句柄
第二參數 const EventBits_t uxBitsToWaitFor :等待的位有哪些
第三參數 const BaseType_t xClearOnExit :在退出的時候是否對等待的位進行清除
第四參數 const BaseType_t xWaitForAllBits:等待的位是同時滿足還是只要一個成立就滿足(等待位是 與的關系 還是 或的關系 )
第五參數 TickType_t xTicksToWait :等待的時間

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )// 1、關閉調度器,后面有詳解-> vTaskSuspendAll();	{// 2、檢查等待條件是否已經滿足const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits;xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits );// 3、等待條件已經滿足,所以沒有必要阻塞if( xWaitConditionMet != pdFALSE )	{// 4、判斷退出前xClearOnExit 是否清零if( xClearOnExit != pdFALSE )pxEventBits->uxEventBits &= ~uxBitsToWaitFor;		// 清零}// 判斷是否愿意等待else if( xTicksToWait == ( TickType_t ) 0 )uxReturn = uxCurrentEventBits;		// 不愿意等待,退出else{// 記錄標志位if( xClearOnExit != pdFALSE )uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;if( xWaitForAllBits != pdFALSE )uxControlBits |= eventWAIT_FOR_ALL_BITS;}// 將調用任務正在等待的比特存儲在任務的事件中列表項,以便內核知道何時找到匹配項。然后進入阻塞狀態vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait );// 把當前任務加入xEventListItem 鏈表中-> 	listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE );	-> 	vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) );// 把當前任務從就緒鏈表移到等待鏈表中-> 	prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );}

vTaskSuspendAll函數 功能是關閉調度器。在之前的隊列操作(包含信號量和互斥量操作)中無論是讀還是寫操作,第一步就是關中斷。而在操作事件組的時候第一步卻不需要直接關閉中斷,只需要關閉調度器,這兩者有什么區別呢?

對于隊列操作,存在兩種情況:
1、多個任務同時操作隊列
2、中斷 過程中可以對隊列進行讀寫操作
考慮到第一種情況,多任務之間操作隊列會相互影響,可以采取關閉調度器來解決,但是不能屏蔽掉中斷中對隊列的讀寫操作。如果只關閉調度器的話,中斷對隊列的操作同樣會對正在的任務有影響。因此任務在對隊列進行操作時,第一步一定是要關閉中斷。

對于事件組操作,只存在任務之間的操作,中斷過程中不會對事件組進行操作,因此只需要關閉調度器就可以實現任務之間對事件組操作的互斥。

在這里插入圖片描述


事件組設置位

使用xEventGroupSetBits 函數進行事件設置

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )-> vTaskSuspendAll();	// 關閉調度器{// 1、設置對應的位pxEventBits->uxEventBits |= uxBitsToSet;// 2、喚醒所有滿足條件的任務while( pxListItem != pxListEnd ){if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ){if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 )xMatchFound = pdTRUE;else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor )xMatchFound = pdTRUE;// 從鏈表中移除vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );}}

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

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

相關文章

適用于Mac和Windows的最佳iPhone恢復軟件

本文將指導您選擇一款出色的iPhone數據恢復軟件來檢索您的寶貴數據。 市場上有許多所謂的iPhone恢復程序。各種程序很難選擇并選擇其中之一。一旦您做出了錯誤的選擇,您的數據就會有風險。 最好的iPhone數據恢復軟件應包含以下功能。 1.安全可靠。 2.恢復成功率高…

java MultipartFile multipartFile 文件上傳重命名

java MultipartFile multipartFile 文件上傳重命名 我們在文件上傳的時候,需要考慮重名覆蓋問題,為邏輯嚴謹,需要在文件上傳的時候,將文件名前方拼接UUID或者時間戳,來區分同名文件,但因此引出如何修改前端…

Windows下Visual Studio 中配置第一個CUDA工程

今天整NVIDIA 的CUDA 安裝和第一個CUDA 代碼,順便添加一個有CUDA工程的空框架。 (1)首先確認自己的CUDA 已經安裝成功 >>cmd 進入命令窗,在窗口輸入查看cuda 是否安裝成功,能查到CUDA的版本號,表示安…

VitePress安裝部署

VitePress安裝部署 VitePress安裝步驟 安裝 Node環境 官網下載:https://nodejs.org/zh-cn 傻瓜式安裝到完成 npm環境 安裝完Node環境之后,可以直接運行下面的命令安裝npm npm install -g pnpm關于pnpm源: 有時候需要國內源&#xff0c…

0706_ARM8

練習1: PWM控制蜂鳴器,風扇,震動馬達 pwm.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_tim.h"//蜂鳴器 PB6 TIME4_CH1 初…

基于python的數據分解-趨勢-季節性-波動變化

系列文章目錄 前言 時間序列數據的分解,一般分為趨勢項,季節變化項和隨機波動項。可以基于加法或者乘法模型。季節變化呈現出周期變化,因此也叫季節效應(周期)。 一、數據分解步驟 (1)估計時間序列的長期…

儀器校準后出了校準證書后,是不是就代表儀器合格了?

儀器校準是一門技術活,對于從事生產制造的企業而言,是不可或缺的一環,因為這與產品質量密切相關。所以,了解儀器校準的相關知識也變得尤為重要。 在拿到校準證書后,是不是說明儀器合格了?相信不少企業品管人…

指針回顧.

指針的主要作用:提供一種間接訪問數據的方法 1.地址:區分不同內存空間的編號 2.指針:指針就是地址,地址就是指針 3.指針變量:存放指針的變量稱為指針變量,簡稱為指針 1.指針的定義 int *p NULL; int *q NULL; char *p NULL; double *p NUL…

PCDN技術如何提高內容分發效率?(貳)

PCDN技術通過以下方式提高內容分發效率: 1.利用用戶設備作為分發節點:與傳統的 CDN技術主要依賴中心化服務器不同, PCDN技術利用用戶的設備作為內容分發的節點。當用戶下載內容時,他們的設備也會成為內容分發的一部分,將已下載的內容傳遞給其…

第34集《大乘起信論》

好,請大家打開《講義》七十六頁, 子三、釋雙行 前面是把大乘的止跟大乘的觀,各別的說明,這個是針對初學的菩薩,應該是這樣修學的;這個地方是告訴我們的目標,應該使令自己在操作上最好是能夠止…

STL--求交集,并集,差集(set_intersection,set_union,set_difference)

set_intersection(重要) 求兩個有序的序列的交集. 函數聲明如下: template<class InputIterator1, class InputIterator2, class OutputIterator>OutputIterator set_intersection(InputIterator1 _First1, //容器1開頭InputIterator1 _Last1, //容器2結尾(不包含)Inp…

jenkins配置gitee源碼地址連接不上

報錯信息如下&#xff1a; 網上找了好多都沒說具體原因&#xff0c;最后還是看jenkins控制臺輸出日志發現&#xff1a; ssh命令執行失敗&#xff08;git環境有問題&#xff0c;可能插件沒安裝成功等其他問題&#xff09; 后面發現是jenkins配置git的地方git安裝路徑錯了。新手…

加入新數據預測,基于黏菌優化算法SMA優化SVM支持向量機回歸預測(多輸入單輸出)

加入新數據預測&#xff0c;基于黏菌優化算法SMA優化SVM支持向量機回歸預測&#xff08;多輸入單輸出&#xff09; 1.數據均為Excel數據&#xff0c;直接替換數據就可以運行程序。 2.所有程序都經過驗證&#xff0c;保證程序可以運行。 3.具有良好的編程習慣&#xff0c;程序…

cmake find_package 使用筆記

目錄 1 find_package2 config mode2.1 搜索的文件名2.2 搜索路徑 3 module mode3.1 搜索的文件名3.2 搜索路徑 參考 1 find_package 這是官方文檔 下面是學習總結&#xff1a; 首先是find_package的作用是什么&#xff1f;引入預編譯的庫。 find_package有兩種模式&#xff1a…

error executing init.py No module name “imp“ ida

在某論壇下了個IDA&#xff0c;打開報錯No module name “imp”&#xff0c;這是由于高版本python已經移除了imp&#xff0c;新版使用import importlib。 1、打開文件D:\IDA_Pro_7.7\python\3\ida_idaapi.py 2、替換import imp 為 import importlib。 3、替換IDAPython_LoadPr…

【LInux】從動態庫的加載深入理解頁表機制

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;個人主頁 &#xff1a;阿然成長日記 …

【MindSpore學習打卡】應用實踐-自然語言處理-基于RNN的情感分類:使用MindSpore實現IMDB影評分類

情感分類是自然語言處理&#xff08;NLP&#xff09;中的一個經典任務&#xff0c;廣泛應用于社交媒體分析、市場調研和客戶反饋等領域。本篇博客將帶領大家使用MindSpore框架&#xff0c;基于RNN&#xff08;循環神經網絡&#xff09;實現一個情感分類模型。我們將詳細介紹數據…

X86和ARM架構的服務器 的區別

X86和ARM架構的服務器各有其優缺點,并適用于不同的應用場景。 一、X86架構服務器的優缺點及應用場景: 優點: 1. 易于獲取和成本較低:X86服務器在市場上品牌和型號眾多,價格相對較低,適合中小型企業。 2. 處理能力強大:X86服務器通常具有強大的處理器性能,支持多核心…

CLIP-EBC:通過增強的逐塊分類,CLIP能夠準確計數

摘要 https://arxiv.org/pdf/2403.09281v1 CLIP&#xff08;Contrastive Language-Image Pretraining&#xff0c;對比語言-圖像預訓練&#xff09;模型在識別問題中表現出了卓越的性能&#xff0c;如零樣本圖像分類和對象檢測。然而&#xff0c;由于其固有的挑戰——即將計數…

Nettyの參數優化簡單RPC框架實現

本篇介紹Netty調優&#xff0c;在上篇聊天室的案例中進行改造&#xff0c;手寫一個簡單的RPC實現。 1、超時時間參數 CONNECT_TIMEOUT_MILLIS 是Netty的超時時間參數&#xff0c;屬于客戶端SocketChannel的參數&#xff0c;客戶端連接時如果一定時間沒有連接上&#xff0c;就會…