【STM32】FreeRTOS事件组学习
事件组(Event Group)
一个任务执行之前需要经过多个条件进行判断,当条件全部满足或多个条件中的某一个条件满足才执行。
实验:创建两个任务,一个事件组,当按键一二三都按过一遍才打印。
实现:FreeRTOS在CubeMX中使用V1版本的时候,没法设置Events,必须手动添加,或者是使用V2版本。
这里使用V1版本,在【STM32】FreeRTOS互斥量学习基础上修改代码实现
第一步:创建事件组
/* USER CODE BEGIN FunctionPrototypes */
//创建事件组
EventGroupHandle_t myEventGroup=NULL;
/* USER CODE END FunctionPrototypes */
第二步,初始化
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init */
//事件组初始化
myEventGroup=xEventGroupCreate( );
xEventGroupClearBits(myEventGroup,0X000);
/* USER CODE END Init */
/* Create the thread(s) */
/* definition and creation of Task1 */
osThreadDef(Task1, StartDefaultTask, osPriorityNormal, 0, 128);
Task1Handle = osThreadCreate(osThread(Task1), NULL);
/* definition and creation of Task2 */
osThreadDef(Task2, StartTask02, osPriorityNormal, 0, 128);
Task2Handle = osThreadCreate(osThread(Task2), NULL);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
}
第三步,任务一中按键加置位实现
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
{
printf("KEY1\r\n");
xEventGroupSetBits(myEventGroup,0X001);
osDelay(2000);
}
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)
{
printf("KEY2\r\n");
xEventGroupSetBits(myEventGroup,0X010);
osDelay(2000);
}
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
{
osDelay(20);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
{
printf("KEY3\r\n");
xEventGroupSetBits(myEventGroup,0X100);
osDelay(2000);
}
}
}
/* USER CODE END StartDefaultTask */
}
第四步,任务二中,任务组检查加打印实现
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
uint32_t Event=0;
for(;;)
{
Event=xEventGroupWaitBits(myEventGroup,0X111,pdTRUE,pdTRUE,portMAX_DELAY);
if(Event==0X111)
{
printf("OK\r\n");
}
}
/* USER CODE END StartTask02 */
}
现象:观察到,必须KEY1,KEY2,KEY3都按下过才能引发事件组打印OK。
如果KEY1,KEY2,KEY3其中一个按下就可以引发事件组打印OK的话,可以进行以下修改:
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
uint32_t Event=0;
for(;;)
{
Event=xEventGroupWaitBits(myEventGroup,0X111,pdTRUE,pdFALSE,portMAX_DELAY);
if(Event==0X111)
{
printf("OK\r\n");
}
}
/* USER CODE END StartTask02 */
}