FreeRTOS学习 -- 8、事件标志组

参考文章:【学习FreeRTOS】第16章——FreeRTOS事件标志组-CSDN博客

1、什么是事件标志组?

事件组就是一组的事件位,事件组中的事件位通过位编号来访问,比如:

  • 事件标志组中的bit0表示队列中的消息是否处理掉;
  • 事件标志组中的bit1表示是否有消息需要从网络中发出去;
  • 事件标志组中的bit2表示现在是否需要向网络发送心跳信息。

 事件组的数据类型为EventGroupHandle_t,当configUSE_16_BIT_TICKS为1的时候,事件标志组可以存8个事件位,当configUSE_16_BIT_TICKS为0的时候,事件标志组可以存24个事件位。

一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 EventBits_t 的定义如下所示。EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型 (一般设为32位)

typedef TickType_t EventBits_t;
#if ( configUSE_16_BIT_TICKS  = =  1 )
	typedef   uint16_t   TickType_t;
#else	
	typedef   uint32_t   TickType_t;
#endif
#define  configUSE_16_BIT_TICKS    0 

事件标志组与队列、信号量的区别:

2、事件标志组的相关API函数:

  •  xEventGroupCreate():使用动态方式创建事件标志组
  • xEventGroupCreateStstic():使用静态方式创建事件标志组
  • xEventGroupClearBits():清零事件标志位
  • xEventGroupClearBitsFromISR():在中断中清零事件标志位
  • xEventGroupSetBits():设置事件标志位
  • xEventGroupSetBitsFromISR():在中断中设置事件标志位
  • xEventGroupWaitBits():等待事件标志位
  • xEventGroupSync():设置事件标志位,并等待事件标志位
  • vEventGroupDelete():删除事件标志组
  • xEventGroupGetBits():获取事件组中各事件标志位的值
  • xEventGroupGetBitsFromISR():在中断中获取事件组中各事件标志位的值

 2.1 动态创建事件标志组

EventGroupHandle_t    xEventGroupCreate (void) ; 
  • 返回值:NULL,事件标志组创建失败;其他值,事件标志组创建成功,返回其句柄

2.2 清零事件标志位

EventBits_t xEventGroupClearBits( 	EventGroupHandle_t 	xEventGroup,
									const EventBits_t 	uxBitsToClear) 
  • 形参xEventGroup:待操作的事件标志组句柄
  • 形参uxBitsToSet:待清零的事件标志位
  • 返回值:整数,清零事件标志位之前事件组中事件标志位的值

2.3 设置事件标志位

EventBits_t  xEventGroupSetBits(  	EventGroupHandle_t 	xEventGroup,
									const EventBits_t 	uxBitsToSet)
  • 形参xEventGroup:待操作的事件标志组句柄
  • 形参uxBitsToSet:待设置的事件标志位
  • 返回值:整数,函数返回时事件组中事件标志位的值

2.4 等待事件标志位

EventBits_t	xEventGroupWaitBits(EventGroupHandle_t	xEventGroup,
                                const EventBits_t 	uxBitsToWaitFor,
                                const BaseType_t 	xClearOnExit,
                                const BaseType_t 	xWaitForAllBits,
                                TickType_t 			xTicksToWait)
  •  形参xEvenrGroup:等待的事件标志组句柄
  • 形参uxBitsToWaitFor:等待的事件标志位,(可以用逻辑或等待多个事件标志位)
  • 形参xClearOnExit:成功等待到事件标志位后,清除事件组中对应的事件标志位,pdTRUE清除;pdFALSE:不清除
  • 形参xWaitForAllBits:等待uxBitsToWaitFor 中的所有事件标志位(逻辑与)pdTRUE,等待的位全部为1;pdFALSE,等待的位某个为1
  • 形参xTicksToWait:等待的阻塞时间
  • 返回值
  • 等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
  • 其他值:等待事件标志位失败,返回事件组中的事件标志位

注意,本函数只能完成设置标志位的某一位或者全部,并不能设置某几位。比如8各中的1个或8个,不能设置2-7个

2.5 设置事件标志位并等待事件标志位

EventBits_t	xEventGroupSync(EventGroupHandle_t	xEventGroup,
							const EventBits_t 	uxBitsToSet,
							const EventBits_t 	uxBitsToWaitFor,
							TickType_t 			xTicksToWait)
  • 形参xEvenrGroup:等待的事件标志组句柄
  • uxBitsToSet:达到同步点后,要设置的事件标志
  • uxBitsToWaitFor:等待的事件标志
  • xTicksToWait:等待的阻塞时间
  • 返回值:等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位

3、事件标志组实验

实验目的:学习 FreeRTOS 的事件标志组API函数的使用。
实验设计:将设计三个任务:start_task、task1、task2
start_task-用来创建task1和task2任务,并创建事件标志组
task1-读取按键按下键值,根据不同键值将事件标志组相应事件位置一,模拟事件发生
task2-同时等待事件标志组中的多个事件位,当这些事件位都置 1 的话就执行相应的处理

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值