FIFO 是一个内核对象,它实现了传统的先进先出 (first in first out) 队列,允许在线程和中断 中添加、移除任意尺寸的数据项。
可以定义任意数量的 FIFOs (受到RAM的限制)。每个 FIFO 通过其内存地址进行引用。
FIFO 的关键属性包括:
FIFO 必须先初始化再使用。初始化时会将队列设为空。
FIFO 的数据项必须 4 字节向上对齐,这是因为每个数据项的首个4字节是内核保留的,它被当做指针用来指向队列中的下一个数据项。
因此,如果应用程序需要 N 字节的数据项时,实际需要 N+4(或N+8) 字节的内存。
如果使用 k_fifo_alloc_put()
添加数据的话,则不需要数据对齐或者保留空间的,这些额外的内存是临时从调用线程的资源池中分配的。
数据项可以被线程或者中断添加到 FIFO 中。如果有线程在等待从这个 FIFO 中取数据,这个数据项则直接被给予这个线程;否则,该项会被直接添加到 FIFO 的队列中去。对可入队的数据项的数量没有任何限制。
数据项可以被线程从 FIFO 中移除。如果该 FIFO 的队列为空,线程在这个 FIFO 上进行等待。多个线程可以同时在某个空 FIFO 上等待,当一个新的数据项被添加时,它会被给予优先级最高的、等待时间最久的线程。
NOTE
中断服务函数虽然也可以从 FIFO 中移除数据,但是如果 FIFO 为空,中断服务函数中不能进行等待。