FreeRTOS源码分析-10 事件标志组_#define eventclear_events_on_exit_bit 0x01000000ul

  1. 创建或获取一个事件组句柄。
  2. 使用xEvetnGroupSync函数等待指定的事件位。可以设置需要等待的事件位、需要设置的事件位和等待超时时间。
  3. 根据返回值判断等待是否成功,根据已发生的事件位执行相应的操作。

注意,xEvetnGroupSync函数是一个阻塞函数,即在等待期间会阻塞当前任务的执行。如果有其他任务在等待相同的事件组,则它们可能会被唤醒以执行后续操作。因此,在使用xEvetnGroupSync函数时需要谨慎设计,以避免出现死锁或优先级反转等问题。

2.3 功能实现

STM32CubeMX功能配置

GPIO略

根据接口说明 ,事件标志组中断中需要开启守护任务

按键中断及事件标志组创建

//freertos.c

//...略
#include "event_groups.h"

EventGroupHandle_t KeyEventGroup; //全局变量句柄

void MX_FREERTOS_Init(void) {

	//创建
	KeyEventGroup = xEventGroupCreate();
	if(KeyEventGroup == NULL){
		printf("KeyEventGroup Create Error\r\n");
	}

    //...略
}


按键检测任务和蜂鸣器报警任务

//gpio.c

#include "event_groups.h"

//...略
/*  
#define KEY3_EVENT_BIT  (1<<0)
#define KEY4_EVENT_BIT  (1<<1)
#define KEY5_EVENT_BIT  (1<<2)
#define KEY6_EVENT_BIT  (1<<3) 
	 
typedef enum
{
	KEY_DOWN,
	KEY_UP,
	KEY_RESET

}teKeyStatus;

*/

teKeyStatus KeyStatus;
extern EventGroupHandle_t KeyEventGroup;


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){

	if(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);
			}
		}
	}
	
	if(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);
			}
		}
	}

	if(Key5_Pin == GPIO_Pin)
    {
		if(HAL_GPIO_ReadPin(Key5_GPIO_Port,Key5_Pin) == GPIO_PIN_RESET)
        {
			HAL_Delay(10);
			if(HAL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值