FreeRTOS事件標志組

使用信號量來同步的話,任務只能與單個事務或任務進行同步,有時候某個任務可能會需要與多個事件或任務進行同步,此時信號量就無能為力了,FreeRTOS為此提供了一個可選的解決方法,那就是事件標志組。

0x01 事件標志組

事件標志組的數據類型為EventGroupHandle_t,當configUSE_16_BIT_TICKS為1的時候,事件標志組可以存儲8個事件位,當configUSE_16_BIT_TICKS設置為0的時候,可以存儲24個事件位。事件0存在在bit0上,EventGroupHandle_t變量的位1就是事件1。

0x02 創建事件標志組

FreeRTOS提供了兩個用于創建事件標志組的函數

  • xEventGroupCreate():使用動態方法創建事件標志組
  • xEventGroupCreateStatic():使用靜態方法創建事件標志組
EventGroupHandle_t xEventGroupCreate( void );
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer );

pxEventGroupBuffer :保存事件標志組結構體
xEventGroupCreate所需要的內存通過動態內存管理方法分配,當configUSE_16_BIT_TICKS為1的時候,事件標志組可以存儲8個事件位(bit0-bit7),當configUSE_16_BIT_TICKS設置為0的時候,可以存儲24個事件位(bit0-bit23)。

xEventGroupCreateStatic所需要的內存用戶自己分配

0x03 設置事件位

FreeRTOS提供了4個函數用來設置事件標志組中事件位,事件位的設置包括清零和置1兩種操作

  • xEventGroupClearBits():將指定的事件位清零,用在任務中

  • xEventGroupClearBitsFromISR():將指定的事件位清零,用在中斷服務中

  • xEventGroupSetBits():將指定的事件位置1,用在任務中

  • xEventGroupSetBitsFromISR():將指定的事件位置1,用在中斷中

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
  • EventGroupHandle_t xEventGroup:要操作的時間標志組的句柄
  • EventBits_t uxBitsToClear:要清零的事件位,比如要清除bit3的話就設置0x08,可以同時清除多個位,如設置0x09,就同時清除bit3和bit0
	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
  • EventGroupHandle_t xEventGroup:要操作的時間標志組的句柄
  • EventBits_t uxBitsToClear:要清零的事件位,比如要清除bit3的話就設置0x08,可以同時清除多個位,如設置0x09,就同時清除bit3和bit0
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
  • EventGroupHandle_t xEventGroup:要操作的事件標志組的句柄
  • EventBits_t uxBitsToSet:指定要置1的事件位,比如要置bit3為1的話就設置0x08,可以同時設置多個位,如設置0x09,就同時置bit3和bit0為1
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken )
  • EventGroupHandle_t xEventGroup:要操作的事件標志組的句柄
  • EventBits_t uxBitsToSet:指定要置1的事件位,比如要置bit3為1的話就設置0x08,可以同時設置多個位,如設置0x09,就同時置bit3和bit0為1
  • BaseType_t *pxHigherPriorityTaskWoken:標記退出此函數以后是否進行任務切換,傳入pdTRUE在退出中斷函數之前一定進行一次任務切換

0x04 獲取事件標志組值

FreeRTOS提供了兩個API函數用來查詢事件標志組值。

  • xEventGroupGetBits():獲取當前事件標志組的值(各個事件位的值),用在任務中
  • xEventGroupGetBitsFromISR():獲取當前事件標志組的值,用在中斷服務函數中
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
  • EventGroupHandle_t xEventGroup :要獲取的事件標志組的句柄
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
  • EventGroupHandle_t xEventGroup :要獲取的事件標志組的句柄

0x05 等待指定的事件位

某個任務可能需要與多個事件進行同步,那么這個任務就需要等待并判斷多個事件位,FreeRTOS提供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:指定要等待的時間標志組
  • EventBits_t uxBitsToWaitFor:指定要等待的事件位,比如要等待bit0和bit2的時間此參數就是0x05
  • const BaseType_t xClearOnExit:此參數為pdTRUE的話,那么在退出此函數之前由參數uxBitsToWaitFor指定的這些事件位就會清零,如果設置為pdFALSE的話,這些事件位就不會改變。
  • const BaseType_t xWaitForAllBits:此參數如果設置為pdTRUE的話,當uxBitsToWaitFor所設置的這些事件為都置1,或者指定的阻塞時間到的時候xEventGroupWaitBits函數才會返回,當設置為pdFALSE的話,只要uxBitsToWaitFor所設置的這些事件位其中的任意一個置1,或者指定的阻塞時間到的話,函數xEventGroupWaitBits就會返回
  • TickType_t xTicksToWait :設置阻塞時間,單位為節拍數

返回值:
返回當前所等待事件位置1以后的事件標志組的值,或者阻塞時間到,根據這個值,我們就知道哪些事件位置1了,如果函數因為阻塞時間到返回的話,那么這個返回值就不代表任何的含義。

實驗

設計四個任務:
start_task:用來創建其他三個任務和事件標志組
eventsetbit_task:讀取按鍵值,根據不同的按鍵值將事件標志組中相應的事件位置1,用來模擬事件的發生
eventgroup_task:同時等待事件標志組中的多個事件位,當這些事件位都置1的話就將其顯示到LCD上,并且也通過串口打印出來

start_task代碼:

void start_task(void *pvParameter)
{taskENTER_CRITICAL();EventGroup_Handler=xEventGroupCreate();xTaskCreate(eventsetbit_task,"eventsetbit_task",256,NULL,2,&EventSetBit_Handler);xTaskCreate(eventgroup_task,"eventgroup_task",256,NULL,4,&EventGp_Handler);xTaskCreate(eventquery_task,"eventquery_task",256,NULL,3,&EventQuery_Handler);vTaskDelete(StartTask_Handler);taskEXIT_CRITICAL();
}

創建三個任務和一個事件狀態標志組

void eventsetbit_task(void *pvParameter)
{u8 key;while(1){if(EventGroup_Handler!=NULL){key = KEY_Scan(0);switch(key){case KEY1_PRES:xEventGroupSetBits(EventGroup_Handler,2);break;case WKUP_PRES:xEventGroupSetBits(EventGroup_Handler,4);break;}}vTaskDelay(10);}
}

eventsetbit_task檢查KEY1和KEY_UP有無按下,KEY1按下將bit1設置為1,KEY_UP按下將bit2設置為1

//中斷服務函數
void EXTI3_IRQHandler(void)
{BaseType_t Result,xHigherPriorityTaskWoken;delay_xms(50);						//消抖if(KEY0==0){Result=xEventGroupSetBitsFromISR(EventGroup_Handler,EVENTBIT_0,&xHigherPriorityTaskWoken);if(Result!=pdFAIL){portYIELD_FROM_ISR(xHigherPriorityTaskWoken);}}__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);	//清除中斷標志位
}

kEY0按下將bit0值1

eventgroup_task檢查bit0、bit1、bit2是否都置為1了

void eventgroup_task(void *pvParameter)
{u8 num;EventBits_t EventValue;while(1){if(EventGroup_Handler!=NULL){EventValue=xEventGroupWaitBits(EventGroup_Handler,7,pdTRUE,pdTRUE,portMAX_DELAY);printf("事件標志組的值:%d\r\n",EventValue);LCD_ShowxNum(174,110,EventValue,1,16,0);num++;LED1 = !LED1;LCD_Fill(6,131,233,313,lcd_discolor[num%14]);}else{vTaskDelay(10);}}}

查詢當前的事件標志組的值,然后顯示出來

void eventquery_task(void *pvParameter)
{u8 num=0;EventBits_t NewValue,LastValue;while(1){if(EventGroup_Handler!=NULL){NewValue=xEventGroupGetBits(EventGroup_Handler);if(NewValue!=LastValue){LastValue = NewValue;printf("事件標志組的值: %d\r\n",NewValue);LCD_ShowxNum(174,110,NewValue,1,16,0);}}num++;if(num==0){num=0;LED0 = !LED0;}vTaskDelay(50);}
}

在這里插入圖片描述

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

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

相關文章

FusionCharts等產品簡介

以前做柱狀圖、餅形圖等圖表都是根據數據繪制出來的靜態圖,偶然看到別人的一套系統,居然可以讓柱狀圖的柱子動畫般的逐個出現,效果還是很不錯的。不要跟我抬杠說不就是展現數據嘛,靜態圖表有什么不好,要知道用戶一般可…

c#foreach循環_C#| 使用foreach循環打印整數數組

c#foreach循環Given an integer array and we have to print its elements using "foreach loop" in C#. 給定一個整數數組,我們必須在C#中使用“ foreach循環”打印其元素 。 Syntax for foreach loop: foreach循環的語法: fore…

Eclipse和Tomcat綁定并且將上傳資源到Tomcat上

步驟如下: 創建一個Dynamic Web Project(圖一) Target runtime 選擇Apache Tomcat v7.0版本(圖二) 切記要選擇 v7.0 和2.5 (若沒有圖二選項見圖三) 然后,點擊window --> Prefer…

淺析.NET平臺編程語言的未來走向

在去年的PDC2008召開期間,微軟逐步公開了圍繞.NET和編程語言的很多想法,據此我們可以饒有興趣地對.NET的未來預測一番。 .NET平臺以運行在通用語言運行時(Common Language Runtime,CLR)上的C#和VB.NET作為開端。CLR是通用語言架構(Common Lan…

FreeRTOS任務通知

從v8.2.0版本開始,FreeRTOS新增了任務通知這個功能,可以使用任務通知來代替信號量、消息隊列、事件標志組等這些東西,使用任務通知的話效率會更高。 任務通知在FreeRTOS是一個可選的選項,要使用任務通知的話就需要將宏configUSE_T…

kinect在openni下也能玩摳出人物換背景

之前想了個很拉風的名字《用kinect玩穿越》,但是現在功能還不是很完善,細節處理也不是很好,臉皮沒有足夠的厚,所以呢還是叫換背景吧。 這里面包含兩個技術要點: 一、摳出活動人物 在微軟的SDK里深度圖像的前3位即0-2位…

物聯網基礎知識_聯網| 基礎知識能力問答 套裝1

物聯網基礎知識1) There are the following statements that are given below, which of them are correct about the computer network? A computer network is an interconnection between multiple devices to share hardware resources and information.A computer networ…

Emit學習-基礎篇-基本概念介紹

之前的Hello World例子應該已經讓我們對Emit有了一個模糊的了解,那么Emit到底是什么樣一個東西,他又能實現些什么功能呢?昨天查了點資料,大致總結了下,由于才開始學習肯定有不完善的地方,希望大家能夠批評指…

The FreeRTOS Distribution(介紹、移植、類型定義)

1 Understand the FreeRTOS Distribution 1.1 Definition :FreeRTOS Port FreeRTOS目前可以在20種不同的編譯器構建,并且可以在30多種不同的處理器架構上運行,每個受支持的編譯器和處理器組合被認為是一個單獨的FreeRTOS Port。 1.2 Build…

notepad++節點_在C ++中刪除鏈接列表的中間節點

notepad節點Given a single Linked List and we have to delete the middle the element of the Linked List. 給定一個鏈表,我們必須刪除鏈表中間的元素。 If the length of the linked list is odd then delete (( n1)/2)th term of the linked list and if the…

SET ANSI_NULLS ON

指定在與 Null 值一起使用等于 () 和不等于 (<>) 比較運算符時采用符合 ISO 標準的行為。 當 SET ANSI_NULLS 為 ON 時&#xff0c;即使 column_name 中包含空值&#xff0c;使用 WHERE column_name NULL 的 SELECT 語句仍返回零行。即使 column_name 中包含非空值&…

Eclipse項目左上角出現大紅色感嘆號怎么辦?

出現大紅色感嘆號是因為環境不匹配 解決方法&#xff1a; 右擊出現大紅色感嘆號的項目 點擊 Libraries&#xff0c;將有叉號的給Remove掉 然后再點擊 Add Library —> JRE System Library —> Next 勾選第二個即可 之后&#xff0c;就不會出現大紅色感嘆號了。

PCB---STM32最小系統制作過程

PCB 制作過程STM32核心模塊連接外部電源晶振OSC_IN(8MHz)OSC32_IN(32.768MHz&#xff09;復位下載口BOOT模式電源模塊添加功能UARTWKUPSTM32核心模塊 這里我們以STM32F103C8T6為列&#xff0c;先將芯片的原理圖放到原理圖中 對于STM32&#xff0c;有幾個模塊是核心&#xff0…

scala 隨機生成整數_如何在Scala中以整數形式獲取當前年份?

scala 隨機生成整數In Scala programming language, there is an option for the programmer to use libraries of java because of its interoperability with java. 在Scala編程語言中&#xff0c;程序員可以選擇使用Java庫&#xff0c;因為它可以與Java互操作。 There are …

轉載:glut.h 與 stdlib.h中 的exit()重定義問題的解決

遇到的問題&#xff0c;來自&#xff1a;http://blog.sina.com.cn/s/blog_629c53bd0100f5li.html 出現&#xff1a; c:\codeprogram\microsoft visual studio 10.0\vc\include\stdlib.h(353): error C2381: “exit”: 重定義&#xff1b;__declspec(noreturn) 不同1> c:\pro…

括號配對問題(C++棧)

題目描述: 現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。 輸入描述: 第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的N行輸入多組輸入數據&#xff0c;每組輸入數據都是一個字符串S(S的長度小于10000&#xff0c;…

FreeRTOS---堆內存管理(一)

FreeRTOS的堆內存管理簡介動態內存分配及其與 FreeRTOS 的相關性動態內存分配選項內存分配方案Heap_1heap_2Heap_3Heap_4設置heap_4的起始地址Heap_5vPortDefineHeapRegions()堆相關的函數xPortGetFreeHeapSizexPortGetMinimumEverFreeHeapSizeMalloc調用失敗的Hook函數這篇文章…

python中生成隨機整數_在Python中生成0到9之間的隨機整數

python中生成隨機整數Following are the few explanatory illustrations using different python modules, on how to generate random integers? Consider the scenario of generating the random numbers between 0 and 9 (both inclusive). 以下是使用不同的python模塊的一…

愚人節惡搞網站謹防遭黑客攻擊

金山毒霸云安全中心日前發出預警&#xff0c;在近期攔截的大量“掛馬”、釣魚等惡意網頁中&#xff0c;與“愚人節”相關的&#xff0c;在近一周數量急劇增加。 愚人節將至&#xff0c;怎么整人好玩?近期許多惡搞網站、相關的網絡論壇的流量不斷攀升。金山毒霸云安全中心日前發…

JavaScript中的String()函數與示例

String()函數 (String() function) String() function is a predefined global function in JavaScript, it is used to convert an object to the string. String()函數是JavaScript中預定義的全局函數&#xff0c;用于將對象轉換為字符串。 Example: 例&#xff1a; In thi…