# FreeRTOS_任务 **Repository Path**: wang-jialll/free-rtos-task4 ## Basic Information - **Project Name**: FreeRTOS_任务 - **Description**: 事件的学习 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-04 - **Last Updated**: 2022-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: FreeRTOS ## README # 事件 FreeRTOS 提供的事件具有如下特点: * 事件只与任务相关联,事件相互独立,一个 32 位的事件集合(EventBits_t 类型的 变量, 实际可用与表示事件的只有 24 位),用于标识该任务发生的事件类型,其 中每一位表示一种事件类型(0 表示该事件类型未发生、 1 表示该事件类型已经发 生),一共 24 种事件类型。 * 事件仅用于同步,不提供数据传输功能。 * 事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走), 等效于 * 只设置一次。 * 允许多个任务对同一事件进行读写操作。 * 支持事件等待超时机制。 # 实验 1. 定义事件句柄 & 通过宏定义设置事件掩码 2. 创建事件-> `xEventGroupCreate()` 3. 实现等待事件任务-> `xEventGroupWaitBits()` 4. 实现设置事件任务-> `xEventGroupSetBits()` * 定义事件句柄 ```C EventGroupHandle_t Event_Handle = NULL; ``` * 创建事件 ```C Event_Handle = xEventGroupCreate(); if(NULL != Event_Handle) printf("创建Event_Handle成功!\r\n"); ``` * 宏定义设置事件掩码 ```C #define EVENT1 (0x01<<1) #define EVENT2 (0x01<<2) ``` * 创建LED事件任务 ```C void LED_Task1(void *parameter) { EventBits_t xReturn = pdTRUE; while (1) { xReturn = xEventGroupWaitBits(Event_Handle, EVENT1|EVENT2, pdTRUE, pdTRUE, portMAX_DELAY); if ( (xReturn &=(EVENT1|EVENT2)) == (EVENT1|EVENT2) )//确定已经发生 { printf("KED1与KEY2都按下\r\n"); LED1_TOGGLE; } else printf("事件错误\r\n"); } } ``` * 创建事件建立任务 ```C void LED_Task2(void *parameter) { BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为pdPASS */ while (1) { if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ) { xEventGroupSetBits(Event_Handle,EVENT1); printf("KEY1被按下\r\n"); } if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON ) { xEventGroupSetBits(Event_Handle,EVENT2); printf("KEY2被按下\r\n"); } vTaskDelay(20); } } ```