RTOS之队列
在RTOS官方文档中,对队列的定义讲述的很清晰,队列是任务间通信的主要方式,它们可以用于在任务之间 以及中断和任务之间发送消息。在大多数情况下,队列用作线程安全的 FIFO(先进先出)缓冲区, 新数据被发送到队列的后面,但也可以发送到前面。
任务A通过队列将数据发送给任务B,这里很容易理解,因为之前学习过数据结构的小伙伴应该都知道这个道理,官方文档当中也详细介绍了队列在RTOS当中的使用
FreeRTOS 队列 - FreeRTOS™
那么我这里来总结一下队列为什么简单便捷
1.将消息定义保存为指针,并复制消息的一个指针至队列。即将想要发送的消息地址作为队列函数的参数
2.单个队列可用于接收不同的消息类型, 以及来自多个地点的消息, 方法是将队列定义为保存一个结构体,该结构的一个成员持有消息类型, 另一个成员保存消息数据(或消息数据的一个指针)。
3.被限制在受保护的内存区域的任务可以将数据传递给一个被限制在不同的受保护内存区域的任务
官方文档当中也提供了阻塞队列的解释,原文如下
队列 API 函数允许指定阻塞时间。
1.当一个任务试图从一个空队列中读取时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中的数据变得可用,或者阻塞时间过期。
2.当一个任务试图写入到一个满队列时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中出现可用空间,或者阻塞时间过期。
3.如果同一个队列上有多个处于阻塞状态的任务, 那么具有最高优先级的任务将最先解除阻塞。
官方文档当中也提供了队列的相关函数,如创建队列,队列发送,队列接收这些函数,由于官方文档解释得很清除,所有有兴趣的可以直接去看官方文档,链接如下
xQueueCreate - FreeRTOS™
xQueueSend - FreeRTOS™
xQueueSendFromISR - FreeRTOS™
xQueueReceive - FreeRTOS™
xQueueReceiveFromISR - FreeRTOS™
函数名以FromISR结尾的函数都是用在中断当中的,不能用于普通任务,这些也只是一小部分,一般对于任务间通信,需要配合信号量来进行同步互斥,如果涉及到资源的竞争,还需要互斥锁来进行共享资源的使用分配