兰州企业网站优化,嘉定区 网站建设,一站式网站建设比较好,雅安市政建设公司网站。事件标志组定义
FreeRTOS事件标志组介绍
FreeRTOS事件标志组工作原理
一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步#xff0c;此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与…。事件标志组定义
FreeRTOS事件标志组介绍
FreeRTOS事件标志组工作原理
一。事件标志组定义 信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与多个事件或任务间的同步。 如上图所示 事件可以由两个或两个以上来触发运行所以引入事件标志组定义。 2.FreeRTOS事件标志组介绍 有24个位中断或者任务运行结束把为SET为1当满足条件时运行Task2. 3.FreeRTOS事件标志组工作原理 任务1需要事件3与4同时运行任务0需要事件3或者4运行所以当事件3运行后任务0激活任务1不激活。当事件4发生后任务0才激活。 二。实验事件标志组函数的应用
1.功能需求 1、使用事件标志组检测多个按键输入K3、K4、K5、K6 2、当检测到任何一个按键按下串口打印输出按键信息 3、当4路按键都已经按下触发蜂鸣器报警 2.API
1xEventGroupCreate()创建事件标志组#include event_groups.h 2 xEventGroupSetBits()在任务中设置事件标志单位 3xEventGroupSetBitsFromISR()中断设置事件标志组位 4xEventGroupGetBits()在任务中获取事件标志组位值 5xEventGroupGetBitsFromISR()中断中获取事件标志组位的值 6xEventGroupWaitBits()等待事件标志组位触发 7xEventGroupSync()此功能通常用于同步多个任务 3.功能需求及具体实现方法 1、使用事件标志组检测多个按键输入K3、K4、K5、K6 2、当检测到任何一个按键按下串口打印输出按键信息 3、当4路按键都已经按下触发蜂鸣器报警 4.cubemx创建工程
1Key3-Key6都设置成中断输出并把上下沿都设置成可导致中断。NVIC也设置一下。 2FREERTOS的配置 上述的API接口xEventGroupSetBitsFromISR必须要用到守护任务。 从FREERTOS 原理图可以找到这个函数上面的Note中表示必须要使能configUSE_TIMERS与INCLUDE_xTimerPendFunctionCall。如下两图所示。 设置USE_TIMERS 设置 5.步骤
1创建事件标志 根据FREERTOS的参考手册上面也有API创建的时候需要头文件#include event_groups.h自己创建一个事件标志句柄EventGroupHandle_t KeyEventGroup;如图所示。 #include event_groups.h
EventGroupHandle_t KeyEventGroup;
2在FREERTOS的init中创建事件标志组 //创建事件标志组KeyEventGroup xEventGroupCreate();if(KeyEventGroup NULL){printf(KeyEventGroup Create Error\r\n);}
3事件标志组用在GPIO.c声明为外部变量 extern EventGroupHandle_t KeyEventGroup;
4在gpio.c的值 #define KEY3_EVENT_BIT (10)
#define KEY4_EVENT_BIT (11)
#define KEY5_EVENT_BIT (12)
#define KEY6_EVENT_BIT (13)
5在GPIO.c中的中断回调函数按下就Set指定位。 //按键3if(Key3_Pin GPIO_Pin){if(HAL_GPIO_ReadPin(Key3_GPIO_Port,Key3_Pin) GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key3_GPIO_Port,Key3_Pin) GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY3_EVENT_BIT,NULL); }}}//按键4if(Key4_Pin GPIO_Pin){if(HAL_GPIO_ReadPin(Key4_GPIO_Port,Key4_Pin) GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key4_GPIO_Port,Key4_Pin) GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY4_EVENT_BIT,NULL); }}}//按键5if(Key5_Pin GPIO_Pin){if(HAL_GPIO_ReadPin(Key5_GPIO_Port,Key5_Pin) GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key5_GPIO_Port,Key5_Pin) GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY5_EVENT_BIT,NULL); }}}//按键6if(Key6_Pin GPIO_Pin){if(HAL_GPIO_ReadPin(Key6_GPIO_Port,Key6_Pin) GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key6_GPIO_Port,Key6_Pin) GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY6_EVENT_BIT,NULL); }}}
6低优先级设置
EventBits_t KeyEventBits;KeyEventBits xEventGroupWaitBits(KeyEventGroup,KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT,pdFALSE,pdFALSE,portMAX_DELAY);printf(Key is Down Key Event Bit is %x\r\n,KeyEventBits);osDelay(10); 6高优先级设置 EventBits_t KeyEventBits;KeyEventBits xEventGroupWaitBits(KeyEventGroup,KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT,pdTRUE,pdTRUE,portMAX_DELAY); if(KeyEventBits (KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT)){printf(Buzzer is Toggle\r\n);HAL_GPIO_TogglePin(Buzzer_GPIO_Port,Buzzer_Pin);}
osDelay(10);
结果 应该是 key3key4key5key6按钮都可以触发输出蜂鸣器触发似乎是要全部按钮按下才会消除。