一、什么是事件标志组?
事件标志位
:表明某个事件是否发生,联想:全局变量
flag
。通常按位表示,每一个位表示一个
事件(高
8
位不算)
事件标志组
是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。
事件标志组本质是一个
16
位或
32
位无符号的数据类型
EventBits_t
,
configUSE_16_BIT_TICKS
决定。
虽然使用了
32
位无符号的数据类型变量来存储事件标志, 但其中的高
8
位用作存储事件标志组的
控制信息,低
24
位用作存储事件标志 ,所以说一个事件组最多可以存储
24
个事件标志!
二、事件标志组相关 API 函数
1. 创建事件标志组
2. 设置事件标志位
3. 清除事件标志位
4. 等待事件标志位
三、实操
实验需求
创建一个事件标志组和两个任务(
task1
和
task2
),
task1
检测按键,如果检测到
KEY1
和
KEY2 都按过,则执行 task2
。
四、cubeMX配置
五、代码实现
/* USER CODE BEGIN Header_fun1 */
/**
* @brief Function implementing the task1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_fun1 */
void fun1(void *argument)
{
/* USER CODE BEGIN fun1 */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET)
{
osDelay(20);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
osDelay(20);
printf("KEY1 press down\r\n");
xEventGroupSetBits(myEvent01Handle,0x01);
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
{
osDelay(20);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
osDelay(20);
printf("KEY2 press down\r\n");
xEventGroupSetBits(myEvent01Handle,0x02);
}
}
/* USER CODE END fun1 */
}
/* USER CODE BEGIN Header_fun2 */
/**
* @brief Function implementing the task2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_fun2 */
void fun2(void *argument)
{
/* USER CODE BEGIN fun2 */
/* Infinite loop */
for(;;)
{
EventBits_t status;
//portMAX_DELAY死等
status=xEventGroupWaitBits(myEvent01Handle,0x03,pdTRUE,pdTRUE,portMAX_DELAY);
printf("key1 and key2 press down ,stutus = %d\r\n",status);
// status=xEventGroupWaitBits(myEvent01Handle,0x03,pdTRUE,pdFALSE,portMAX_DELAY);
// printf("key1 or key2 press down ,stutus = %d\r\n",status);
}
/* USER CODE END fun2 */
}