freeRTOS 事件标志组
任务需要与多个事件或任务进行同步时,需要用到事件标志组。
一个事件组就是一组的事件位, 事件组中的事件位通过位编号来访问。
事件标志组的数据类型为 EventGroupHandle_t。
事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中。
typedef TickType_t EventBits_t; #if( configUSE_16_BIT_TICKS == 1 ) typedef uint16_t TickType_t; #define portMAX_DELAY ( TickType_t ) 0xffff #else typedef uint32_t TickType_t; #define portMAX_DELAY ( TickType_t ) 0xffffffffUL #define portTICK_TYPE_IS_ATOMIC 1 #endif
EventBits_t 类型的变量可以存储(32-8=24个)(或16-8=8个)事件位,另外高 8 位另有他用。
创建
EventGroupHandle_t xEventGroupCreate( void ) EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) 设置 EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); 返回事件清零之前的状态 BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); 返回成功或失败 EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t * pxHigherPriorityTaskWoken );
用法:
//事件标志组句柄
extern EventGroupHandle_t EventGroupHandler;
//中断服务函数
void EXTI3_IRQHandler(void)
{
BaseType_t Result,xHigherPriorityTaskWoken;
delay_xms(50); //消抖
if(KEY0==0)
{
Result=xEventGroupSetBitsFromISR(EventGroupHandler, EVENTBIT_0, &xHigherPriorityTaskWoken);
if(Result!=pdFAIL)
{
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); 根据higherPrioTaskWoken的值,置位PendSV
}
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3); //清除中断标志位
}
获取
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
等待
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
const TickType_t xTicksToWait );
uxBitsToWaitFor: 要等待 bit0和(或)bit2的时候此参数就是 0x05,如果要等待 bit0 和(或)bit1 和(或)bit2 的时候此参数就是 0x07,以此类推。
xClearOnExit: 此参数要是为 pdTRUE 的话,那么在退出此函数之前由参数 uxBitsToWaitFor所设置的这些事件位就会清零。
xWaitForAllBits: 此参数如果设置为 pdTRUE 的话, 当 uxBitsToWaitFor 所设置的这些事件位都置 1, 或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()才会返回。
当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的这些事件位其中的任意一个置1,或者指定的阻塞时间到的话函数xEventGroupWaitBits()就会返回。
返回值:
返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。
根据这个值我们就知道哪些事件位置 1 了。
如果函数因为阻塞时间到而返回的话那么这个返回值就不代表任何的含义。
函数的代码在 event_groups.c/.h 里面
留白
联我:shen5773384##163.com