STM32事件标志组

news/2024/9/22 17:35:44/

目录

什么是事件标志组?

事件标志组相关 API 函数

1. 创建事件标志组 

2. 设置事件标志位

3. 清除事件标志位

4. 等待事件标志位

实操

代码实现


什么是事件标志组?

事件标志位 :表明某个事件是否发生,联想:全局变量 flag 。通常按位表示,每一个位表示一个
事件(高 8 位不算)
事件标志组 是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
事件标志组本质是一个 16 位或 32 位无符号的数据类型 EventBits_t ,由 configUSE_16_BIT_TICKS
决定。
虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高 8 位用作存储事件标志组的
控制信息,低 24 位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

事件标志组相关 API 函数

函数
描述
xEventGroupCreate()
使用动态方式创建事件标志组
xEventGroupCreateStatic()
使用静态方式创建事件标志组
xEventGroupClearBits()
清零事件标志位
xEventGroupClearBitsFromISR()
在中断中清零事件标志位
xEventGroupSetBits()
设置事件标志位
xEventGroupSetBitsFromISR()
在中断中设置事件标志位
xEventGroupWaitBits()
等待事件标志位

1. 创建事件标志组 

EventGroupHandle_t xEventGroupCreate ( void );
参数:
返回值:
成功,返回对应事件标志组的句柄; 失败,返回 NULL

2. 设置事件标志位

EventBits_t xEventGroupSetBits ( EventGroupHandle_t xEventGroup ,
const EventBits_t uxBitsToSet );

 参数:

xEventGroup :对应事件组句柄。 uxBitsToSet :指定要在事件组中设置的一个或多个位的按位
值。
返回值:
设置之后事件组中的事件标志位值。

3. 清除事件标志位

EventBits_t xEventGroupClearBits ( EventGroupHandle_t xEventGroup ,
const EventBits_t uxBitsToClear );
参数:
xEventGroup :对应事件组句柄。 uxBitsToClear :指定要在事件组中清除的一个或多个位的按位
值。
返回值:
清零之前事件组中事件标志位的值。

4. 等待事件标志位

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

参数:

xEventGroup:对应的事件标志组句柄

uxBitsToWaitFor:指定事件组中要等待的一个或多个事件 位的按位值

xClearOnExitpdTRUE——清除对应事件位,pdFALSE——不清除

xWaitForAllBits: pdTRUE——所有等待事件位全为1(逻辑与),pdFALSE——等待的事件位有一个为1(逻辑或)

xTicksToWait :超时
返回值:
等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位 其他值:等待事件标志位
失败,返回事件组中的事件标志位

 

实操

实验需求
创建一个事件标志组和两个任务( task1 task2 ), task1 检测按键,如果检测到 KEY1 KEY2 都按过,则执行 task2

代码实现

/* USER CODE BEGIN Header */
/********************************************************************************* File Name          : freertos.c* Description        : Code for freertos applications******************************************************************************* @attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
EventGroupHandle_t eventgroup_handle;
/* USER CODE END Variables */
osThreadId Task1Handle;
osThreadId Task2Handle;/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes *//* USER CODE END FunctionPrototypes */void StartTask1(void const * argument);
void StartTask2(void const * argument);void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) *//* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;*ppxIdleTaskStackBuffer = &xIdleStack[0];*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;/* place for user code */
}
/* USER CODE END GET_IDLE_TASK_MEMORY *//*** @brief  FreeRTOS initialization* @param  None* @retval None*/
void MX_FREERTOS_Init(void) {/* USER CODE BEGIN Init *//* USER CODE END Init *//* USER CODE BEGIN RTOS_MUTEX *//* add mutexes, ... *//* USER CODE END RTOS_MUTEX *//* USER CODE BEGIN RTOS_SEMAPHORES *//* add semaphores, ... *//* USER CODE END RTOS_SEMAPHORES *//* USER CODE BEGIN RTOS_TIMERS *//* start timers, add new ones, ... *//* USER CODE END RTOS_TIMERS *//* USER CODE BEGIN RTOS_QUEUES *//* add queues, ... *//* USER CODE END RTOS_QUEUES *//* Create the thread(s) *//* definition and creation of Task1 */osThreadDef(Task1, StartTask1, osPriorityNormal, 0, 128);Task1Handle = osThreadCreate(osThread(Task1), NULL);/* definition and creation of Task2 */osThreadDef(Task2, StartTask2, osPriorityNormal, 0, 128);Task2Handle = osThreadCreate(osThread(Task2), NULL);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... */eventgroup_handle = xEventGroupCreate();/* USER CODE END RTOS_THREADS */}/* USER CODE BEGIN Header_StartTask1 */
/*** @brief  Function implementing the Task1 thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_StartTask1 */
void StartTask1(void const * argument)
{/* USER CODE BEGIN StartTask1 *//* Infinite loop */for(;;){// 等待 KEY1 按下if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){xEventGroupSetBits(eventgroup_handle, 0x01);}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);}// 等待 KEY2 按下if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET){osDelay(20);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET){xEventGroupSetBits(eventgroup_handle, 0x02);}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);}osDelay(1);}/* USER CODE END StartTask1 */
}/* USER CODE BEGIN Header_StartTask2 */
/**
* @brief Function implementing the Task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask2 */
void StartTask2(void const * argument)
{/* USER CODE BEGIN StartTask2 */EventBits_t event_bit = 0;/* Infinite loop */for(;;){event_bit = xEventGroupWaitBits(eventgroup_handle, 0x01 | 0x02, pdTRUE, pdFALSE, portMAX_DELAY);printf("返回值:%#x,请假成功,可以去大保健了!\r\n", event_bit);osDelay(1);}/* USER CODE END StartTask2 */
}/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application *//* USER CODE END Application */


http://www.ppmy.cn/news/422627.html

相关文章

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日,“2023量化科技嘉年华”在上海世博中心召开,这场为期两天的量化科技盛会,多方位呈现了量化科技创新成果,吸引了众多关注。 在嘉年华的第二天,多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

肝气郁结害处多(一)

今天谈谈痛经,宫寒血淤的痛经就不多说了,是个中医都能治; 今天说的是肝气郁结型痛经,表现和血淤型很像,都是前半段痛,伴随心情不好,但是用活血化淤药没用甚至可能还加重!肝气郁结的…

SE Block 在特定情况可能会产生的害处(未使用专门实验验证,仅记录)

2022/5/13更新 没空专门弄个实验验证了,仅记录 我没有空把 SeBlock 丢掉再训练一次实验,这篇记录就这样了,可能是SeBlock增加导致这样现象,也可能不是。 仅记录下实验情况。 模型结构 这是一个基于热图的关键点检测模型。 然后…

mysql爱吃鱼油_深海鱼油长期吃有什么害处吗

展开全部 深海鱼油长期吃是有害处的,害处有:把深海鱼油当做正常62616964757a686964616fe4b893e5b19e31333366303135饮食外的保健品服用,无疑增加了饮食中的热量摄入,也是不利于人体健康的饮食习惯; 海鱼油实际上就是一…

计算机工作对身体有害吗,在电脑前长时间工作会对身体有害处吗?

病情分析: 目前,电脑对人体生理和心理方面的负面影响已日益受到人们的重视.为此科学使用电脑,减少电脑和网络的危害是十分必要的. 指导意见: 一是要增强自我保健意识工作间隙注意适当休息,一般来说,电脑操作人员在连续工作1小时后应该休息10分钟左右.并且…

这四大手机技巧太神奇了!你不知道,真的很遗憾

现在人手一部手机再正常不过了,无论学习还是工作,都需要用到手机。随着科技的发展,手机也越发小巧,越发美观,简直跟艺术品有得一拼。虽然手机玩了多年,可这四大手机技巧你不一定会用哦,不信咋们…

想靠周末补觉还睡眠债?美研究证明害处比熬夜更大

原标题:想靠周末补觉还睡眠债?美研究证明:害处比熬夜更大 参考消息网3月3日报道 新媒称,很多人工作日天天熬夜,想着周末再把觉补回来,但美国一项新研究发现,周末补觉很难弥补平时熬夜带来的健康…

充一次电使用一年的手机_超级手机电池:充一次电用一年多?

乌克兰科学家Vladislav Kiselev宣称研发出了一种能够给智能手机甚至是汽车等设备供电12年的电池,在此期间这块电池不需要频繁的充电。 [-] 基辅市生物化学和石油化工研究所的资深研究员Kiselev在2016年度的西科斯基挑战赛上公布了他的电池原型。这个看起来像火柴盒的…