完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
2.FreeRTOS事件标志组
2.1事件标志组简介 从前几章中我们知道可以用信号量实现同步,但信号量只能实现与单个任务或中断之间的同步,当某个任务需要与多个任务或事件进行同步时,这时候我们可以使用事件标志组。 讲到事件标志组,首先要提到事件位,事件位用来表明某个事件是否发生,通常用作事件标志。比如:从中断中接收指令需要处理时将某个位(标志)置1,当处理结束以后就讲这个位(标志)置0。 一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问。 2.2事件标志组函数 2.2.1 创建事件标志组 创建事件标志组的函数有两个,分别如下: xEventGroupCreate(),此函数用于动态创建事件标志组,所需要的内存通过动态内存管理方法分配,事件标志组可用的bits数取决于宏configUSE_16_BIT_TICKS,当此宏为1时,事件标志组有8个可用位,当为0时有24个可用位。其函数原型如下: EventGroupHandle_t xEventGroupCreate( void ) 参数:无 返回值: NULL:事件标志组创建失败。 其他值:创建成功的事件标志组句柄。 xEventGroupCreateStatic(),此函数也用于创建事件标志组,所需要的内存通过用户自行分配,其函数原型如下: EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) 参数: pxEventGroupBuffer: 指向一个StaticEventGroup_t类型的变量,用来保存件标志组结构体。 返回值: NULL:事件标志组创建失败。 其他值:创建成功的事件标志组句柄。 2.2.2 设置事件位 设置事件位包括置1与清零操作,FreeRTOS提供了四个函数可以设置事件标志组的事件位,分别如下: 在任务级中将指定事件位清零函数xEventGroupClearBits(),其函数原型如下: EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup, Const EventBits_t uxBitsToClear) 参数: xEventGroup: 要操作的事件标志组句柄。 uxBitsToClear: 要清除的事件位。 返回值: 任何值: 将指定事件位清零之前的事件组值。 中断级清零函数 xEventGroupClearBitsFromISR(),此函数为xEventGroupClearBits()的中断版本,只能用于中断服务函数中,其函数原型如下: BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) 参数: xEventGroup: 要操作的事件标志组句柄。 uxBitsToSet: 要清除的事件位。 返回值: pdPASS: 事件位清零成功。 pdFAISE: 事件位清零失败。 置1函数xEventGroupSetBits(),此函数可在任务级中将指定事件位置1,其函数原型如下: EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup, Const EventBits_t uxBitsToSet) 参数: xEventGroup: 要操作的事件标志组句柄。 uxBitsToSet: 指定要置1的事件位。 返回值: 任何值: 将指定事件位置1后的事件组值。 中断xEventGroupSetBitsFromISR(),此函数为xEventGroupSetBits()的中断版本,只能用于中断服务函数中,其函数原型如下: BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet BaseType_t* pxHigherPriorityTaskWoken) 参数: xEventGroup: 要操作的事件标志组句柄。 uxBitsToSet: 指定要置1的事件位。 pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换 返回值: pdPASS: 事件位置1成功。 pdFAISE: 事件位置1失败。 2.2.3 获取事件标志组值 FreeRTOS中提供了可以查询事件标志组值的API函数,分别如下: xEventGroupGetBits(),此函数用于任务中获取当前事件标志组的值,即各个事件位的值,此函数是个宏,其函数原型如下: EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup ) 参数: xEventGroup: 要获取的事件标志组的句柄。 返回值: 任何值: 当前事件标志组的值。 xEventGroupGetBitsFromISR(),此函数用于在中断服务函数中获取当前事件标志组的值,为函数xEventGroupGetBits()的中断版本,此函数也是个宏,其函数原型如下: BaseType_t xEventGroupGetBitsFromISR ( EventGroupHandle_t xEventGroup); 参数: xEventGroup: 要获取的事件标志组的句柄。 返回值: 任何值: 当前事件标志组的值。 2.2.4 等待指定是事件位 当某个任务需要与多个事件进行同步时,那么它就需要等待并判断多个事件位,此时可以调用函数xEventGroupWaitBits()完成功能。调用此函数以后如果等待的事件位还没有准备好的话进入阻塞状态,直到等待的事件位准备好或者阻塞时间到达,其函数原型如下 EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFord, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, const TickType_t xTicksToWait ) 参数: xEventGroup: 指定要等待的事件标志组。 uxBitsToWaitFord: 指定要等待的事件位。 xClearOnExit: 此参数要是为pdTRUE的话,那么在退出此函数之前由参数 uxBitsToWaitFor所设置的这些事件位就会清零。如果设置位pdFALSE 的话这些事件位就不会改变。 xWaitForAllBits: 此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFord 所设置的 这些事件位都置 1,或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()才会返回。当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的这些事件位其中的任意一个置1,或者指 定 的 阻 塞 时 间到 的 话 函 数xEventGroupWaitBits()就会返回。 返回值: 任何值: 返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。根 据这个值我们就知道哪些事件位置 1 了。如果函数因为阻塞时间到而返回的 话这个返回值就不代表任何的含义。 2.3操作实验 2.3.1实验设计 本次设计通过检测三个按键状态,设置事件组中不同事件位,当全设置1之后,所有事件位清零,翻转LED电平。 可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料 2-程序源码ARM体系结构与接口威廉希尔官方网站 FreeRTOS5_MP1A-FreeRTOS-EVENT】 任务及其功能如下: StartTask02(): 等待事件组的所有事件位,若不全为1,则进入阻塞状态,当全设置为1时,通过翻转LED1电平表示。 StartDefaultTask(): 检测按键状态,当不同按键按下时,设置事件组对应事件位。 2.3.2实验过程与分析 首先,根据之前几章内容配置好CubeMX,按照上一节配置“FREERTOS”,完成后生成代码。 在StartDefaultTask() 与StartTask02()中添加代码如下。 另外,首先在主函数中调用xEventGroupCreate()函数创建事件标志组,获得事件标志组句柄。 当KEY1、KEY2、KEY3分别按下时,调用xEventGroupSetBits()函数分别将事件标志组的bit0、bit1、bit2置1,函数xEventGroupWaitBits()同时等待标志组的bit0、bit1、bit2,当这三个事件位都置为1时,才会执行任务中的其他程序。另外调用函数xEventGroupGetBits()可以查询标志组EventGroupHandler的值变化,结果如下所示。 |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
890 浏览 0 评论
3336 浏览 9 评论
3013 浏览 16 评论
3506 浏览 1 评论
9098 浏览 16 评论
1216浏览 3评论
631浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
620浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2361浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1926浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 20:12 , Processed in 1.073553 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号