打印
[其他ST产品]

【STM32】FreeRTOS事件组学习

[复制链接]
206|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rzjvv|  楼主 | 2024-2-29 18:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
事件组(Event Group)

一个任务执行之前需要经过多个条件进行判断,当条件全部满足或多个条件中的某一个条件满足才执行。

实验:创建两个任务,一个事件组,当按键一二三都按过一遍才打印。

实现:FreeRTOS在CubeMX中使用V1版本的时候,没法设置Events,必须手动添加,或者是使用V2版本。

这里使用V1版本,在【STM32】FreeRTOS互斥量学习基础上修改代码实现


使用特权

评论回复
沙发
rzjvv|  楼主 | 2024-2-29 18:05 | 只看该作者
第一步:创建事件组

/* USER CODE BEGIN FunctionPrototypes */

//创建事件组

EventGroupHandle_t myEventGroup=NULL;

/* USER CODE END FunctionPrototypes */

使用特权

评论回复
板凳
rzjvv|  楼主 | 2024-2-29 18:05 | 只看该作者
第二步,初始化
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 */

}

使用特权

评论回复
地板
rzjvv|  楼主 | 2024-2-29 18:06 | 只看该作者
第三步,任务一中按键加置位实现

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 */
}

使用特权

评论回复
5
rzjvv|  楼主 | 2024-2-29 18:06 | 只看该作者
第四步,任务二中,任务组检查加打印实现
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 */
}

使用特权

评论回复
6
rzjvv|  楼主 | 2024-2-29 18:06 | 只看该作者


现象:观察到,必须KEY1,KEY2,KEY3都按下过才能引发事件组打印OK。


使用特权

评论回复
7
rzjvv|  楼主 | 2024-2-29 18:06 | 只看该作者
如果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 */
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

204

帖子

1

粉丝