队列概述
FreeRTOS中所有的通信与同步机制都是基于队列实现的。
队列的特性
- 数据存储
FIFO(先进先出) - 可被多任务存取
- 读队列时阻塞
任务试图读取队列,等待队列中数据有效。当队列被多个任务读取时,只有一个任务被解除阻塞,这个任务就是等待任务中优先级最高的任务,如果优先级相同,则被解除阻塞的是等待时间最久的任务。 - 写队列时阻塞
性质同读
当读的优先级高于写优先级,通常队列里只会有一个元素;
当写的优先级高于读优先级,通常队列里都会是满的。
延迟中断处理
- 采用二值信号量同步
二值信号量可以再某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步,这样可以让中断事件处理量大的工作在同步任务中完成。中断服务例程(ISR)中只是快速处理少部分工作。如此,中断处理可以说是被“推迟“到一个处理任务中。
设一个只有一个数据的队列(深度为1),中断里写队列,任务函数里读队列,中断没有发生的时候,任务函数一直是阻塞的,中断发生,任务函数开始处理具体细节内容。
- 计数信号量
由于二值信号量只能存储一个中断事件,如果中断过多,会导致中断事件丢失,所以需要用技术信号量代替二值信号量。
计数信号量即深度大于1的队列。
- 队列
队列同信号量的区别是,队列可以带数据
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。