嵌入式操作系统FreeRTOS(队列管理)

1.队列管理

        (1)数据存储

        队列可以保存有限个具有确定长度的数据单元。队列可以保存的最大单元数目被称为队列的“深度”。在队列创建时需要设定其深度和每个单元的大小。通常情况下,队列被作为FIFO

(先进先出)使用,即数据由队列尾写入,从队列首读出。当然,由队列首写入也是可能的。 往队列写入数据是通过字节拷贝把数据复制存储到队列中;从队列读出数据使得把队列中的数据拷贝删除。

        (2)可被多任务存取

        队列是具有自己独立权限的内核对象,并不属于或赋予任何任务。所有任务都可以向同一队列写入和读出。一个队列由多方写入是经常的事,但由多方读出倒是很少遇到。

       (3)读队列时阻塞

        当某个任务试图读一个队列时,其可以指定一个阻塞超时时间。在这段时间中,如果队列为空,该任务将保持阻塞状态以等待队列数据有效。当其它任务或中断服务例程往其等待的队列中写入了数据,该任务将自动由阻塞态转移为就绪态。当等待的时间超过了指定的阻塞时间,即使队列中尚无有效数据,任务也会自动从阻塞态转移为就绪态。由于队列可以被多个任务读取,所以对单个队列而言,也可能有多个任务处于阻塞 状态以等待队列数据有效。这种情况下,一旦队列数据有效,只会有一个任务会被解除阻塞,这个任务就是所有等待任务中优先级最高的任务。而如果所有等待任务的优先级相同,那么被解除阻塞的任务将是等待最久的任务。

        (4)写队列时阻塞

        同读队列一样,任务也可以在写队列时指定一个阻塞超时时间。这个时间是当被写队列已满时,任务进入阻塞态以等待队列空间有效的最长时间。

        由于队列可以被多个任务写入,所以对单个队列而言,也可能有多个任务处于阻塞状态以等待队列空间有效。这种情况下,一旦队列空间有效,只会有一个任务会被解除阻塞,这个任务就是所有等待任务中优先级最高的任务。而如果所有等待任务的优先级相同,那么被解除阻塞的任务将是等待最久的任务。

        (5)使用队列

        xQueueCreate() API 函数

#define xQueueCreate( uxQueueLength, uxItemSize )

uxQueueLength 描述 队列能够存储的最大单元数目,即队列深度。

uxItemSize     队列中数据单元的长度,以字节为单位。

返回值       NULL表示没有足够的堆空间分配给队列而导致创建失败。非NULL值表示队列创建成功。此返回值应当保存下来,以作为操作此队列的句柄。

        队列在使用前必须先被创建。队列由声明为 xQueueHandle 的变量进行引用。xQueueCreate()用于创建一个队列,并返回一个xQueueHandle句柄以便于对其创建的队列进行引用。当创建队列时,FreeRTOS从堆空间中分配内存空间。分配的空间用于存储队列数 据结构本身以及队列中包含的数据单元。如果内存堆中没有足够的空间来创建队列,xQueueCreate()将返回NULL。

        xQueueSendToBack() 与 xQueueSendToFront() API 函数

如同函数名字面意思所期望的一样,xQueueSendToBack()用于将数据发送到队列尾;

而xQueueSendToFront()用于将数据发送到队列首。

xQueueSend()完全等同于xQueueSendToBack()。

        但切记不要在中断服务例程中调用xQueueSendToFront()或xQueueSendToBack()。系统提供中断安全版本的 xQueueSendToFrontFromISR()与xQueueSendToBackFromISR()用于在中断服务中实现相同的功能。

        xQueueReceive()与 xQueuePeek() API 函数

xQueueReceive()用于从队列中接收(读取)数据单元。接收到的单元同时会从队列中删除。

xQueuePeek()也是从从队列中接收数据单元,不同的是并不从队列中删出接收到的单元。xQueuePeek()从队列首接收到数据后,不会修改队列中的数据,也不会改变数据在队列中的存储序顺。

切记不要在中断服务例程中调用xQueueRceive()和xQueuePeek()。中断安全版本的替代API函数xQueueReceiveFromISR()。

        uxQueueMessagesWaiting() API 函数

uxQueueMessagesWaiting()用于查询队列中当前有效数据单元个数。

切记不要在中断服务例程中调用uxQueueMessagesWaiting()。应当在中断服务中使用其中断安全版本uxQueueMessagesWaitingFromISR()。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值