FreeRTOS学习:队列集和事件标志组

队列集简介

        在使用队列进行任务之间的消息传递时,一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集(也就是多个队列的集合)。

       作用: 队列集用于对多个队列进行“监听”,只要被监听的队列中有一个队列有有效的消息,都可以让任务退出阻塞。

以下是队列集的运行流程图,

队列集函数

队列集使用流程:创建队列集 --> 创建队列或信号量 --> 往队列集中添加队列或信号量 -->往队列发送消息或释放信号量 --> 获取队列集消息

 

创建队列集

xQueueCreateSet():

QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength)


参数

  • uxEventQueueLength:队列集可容纳的队列数量

     返回值:如果队列集创建成功,则返回队列集句柄,否则返回NULL。

队列集添加队列

xQueueAddToSet():

BaseType_t xQueueAddToSet(  QueueSetMemberHandle_t xQueueOrSemaphore,
                            QueueSetHandle_t xQueueSet    );


参数

  • xQueueOrSemaphore:待添加的队列句柄
  • xQueueSet:待添加的队列集

     返回值:如果队列集添加队列成功,则返回pdPASS,否则返回pdFAIL。

备注:队列在被添加到队列集之前,队列中不能有有效消息

队列集移除队列

xQueueRemoveFromSet():

BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
                                QueueSetHandle_t xQueueSet  );


参数

  • xQueueOrSemaphore:待移除的队列句柄
  • xQueueSet:队列集

     返回值:如果队列集添加队列成功,则返回pdPASS,否则返回pdFAIL。

备注:队列在被移除队列集之前,必须没有有效消息

获取队列集有效消息的队列

xQueueSelectFromSet():

QueueSetMemberHandle_t xQueueSelectFromSet(    QueueSetHandle_t xQueueSet,
                                               TickType_t const xTicksToWait   );


参数

  • xQueueSet:队列集
  • xTicksToWait:阻塞超时时间

     返回值:如果获取队列消息成功,则返回队列消息句柄,否则返回NULL。

事件标志组

事件标志组简介

事件标志位:用一个位,表示事件是否发送。

事件标志组是一组事件标志的集合,简单理解就是一个整数,类型是EventBites_t 。

EventBites_t的定义如下,

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

从上述定义可以看到,EventBites_t其实就是16位或者32位的无符号整数类型,STM32中是32位。

特点:

  •  它的每一位表示一个事件(高8位不算)
  • 每一位事件的含义,由我们自己绝对,1表示事件发送,0表示未发生
  • 任何任务或中断都可以读写这些位
  • 可以等待某一位处理,同样也可以选择等待多位同时成立


以下是EventBites_t的位使用情况的示意图,

虽然说使用了 32 位无符号的数据类型变量来存储事件标志,但是其中的高8位被用作存储事件标志组的一些控制信息,也就是说一个事件组最多可以存储 24 个事件标志

以下是事件标志组和队列,信号量的区别,

总结来说就是,信号量和队列就是私法消息,而事件标志组就是@所有人。


事件标志组函数

创建事件标志组(动态)

xEventGroupCreate():

EventGroupHandle_t xEventGroupCreate(void);

该函数无输入参数,返回值为事件标志组的句柄。

清除事件标志位

xEventGroupClearBits():

EventBits_t xEventGroupClearBits(    EventGroupHandle_t xEventGroup,
                                     const EventBits_t uxBitsToClear    )

参数:

  • xEventGroup:待操作的事件标志组
  • EventBits_t uxBitsToClear:待清零的事件标志位

返回值为整数,表示的是清零事件标志位之前事件标志组中的事件标志位的值

设置事件标志位

xEventGroupSetBits():

EventBits_t xEventGroupSetBits(    EventGroupHandle_t xEventGroup,
                                   const EventBits_t uxBitsToSet        )

参数:

  • xEventGroup:待操作的事件标志组
  • EventBits_t uxBitsToSet:待设置的事件标志位

返回值为整数,表示的是函数返回时事件组中的事件标志位值

等待事件标志位

 xEventGroupWaitBits():

EventBits_t xEventGroupWaitBits(    EventGroupHandle_t xEventGroup,
                                    const EventBits_t uxBitsToWaitFor,
                                    const BaseType_t xClearOnExit,
                                    const BaseType_t xWaitForAllBits,
                                    TickType_t xTicksToWait    )

参数:

  • xEventGroup:等待的事件标志组句柄
  • uxBitsToWaitFor:等待的事件标志位,可以用逻辑或等待多个事件标志位
  • xClearOnExit:成功等待到事件标志位后,清除事件组中对应的事件标志位,pdTRUE表示清除uxBitsToWaitFor的指定位,pdFALSE表示不清除。
  • xWaitForAllBits:等待uxBitsToWaitFor中的所有事件标志位(逻辑与),pdTRUE表示等待的位全部位1,pdFALSE表示等待的位某个为1。
  • xTicksToWait:等待阻塞时间

返回值如果为等待的事件标志位的值,表示的是等待事件标志位成功,返回等待到的事件标志位;

如果返回其他值,则表示等待事件标志位失败,返回事件组中的事件标志位。

备注:该函数让我们可以等待某一位,也可以等待多位,并且在等待到期望的事件后还可以清除某些位。

同步函数

 xEventGroupSync():

EventBits_t xEventGroupSync(    EventGroupHandle_t xEventGroup,
                                const EventBits_t uxBitsToSet,
                                const EventBits_t uxBitsToWaitFor,
                                TickType_t xTicksToWait    )

参数:

  • xEventGroup:等待事件标志所在群组
  • uxBitsToSet:达到同步点后,要设置的事件标志
  • uxBitsToWaitFor:等待的事件标志
  • xTicksToWait:等待阻塞时间

返回值如果为等待的事件标志位的值,表示的是等待事件标志位成功,返回等待到的事件标志位;

如果返回其他值,则表示等待事件标志位失败,返回事件组中的事件标志位。

备注:该函数主要进行同步,通过uxBitsToSet设置某个任务完成,再通过uxBitsToWaitFor设置要等待的任务,在两个任务都完成后再往下运行,实现任务的同步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值