队列(FIFO)是一种常见的线性存储结构,在嵌入式开发中经常用到,主要的应用场景有:
1. 高级一点的单片机内部串行通信模块,像UART、SPI、CAN等串行通信,内部带有FIFO缓存。有FIFO的模块可以一次写入或保存多个数据,而没有FIFO的模块只可以写入或保存一个数据。
2. 在RTOS中,可以通过消息队列实现任务(线程)间的通信
3. 解决CPU与外设由于速度差导致的阻塞

写数据索引write,读数据索引read,数据个数为write-read,普通队列写索引永远不小于读索引。但我们可利用的栈内存是有限的。
一种优化的队列是环形队列,也可以理解为首尾相连的队列。当写索引到达最大分配内存时,跳回到队列的头部继续写入,数据个数为(write+BUFFER_SIZE-read)%BUFFER_SIZE。

下面以使用环形队列来解决单片机串口打印阻塞问题为例来说明软件实现。




上面代码已经注释得够详细了,就不再描述了。
在需要打印数据时,直接调用printf函数格式化打印,在主函数大循环中执行debug_print_task就可以了。

-
cpu
+关注
关注
68文章
11216浏览量
222942 -
fifo
+关注
关注
3文章
406浏览量
45493 -
串口
+关注
关注
15文章
1607浏览量
81936
发布评论请先 登录
环形队列在串口数据接收中的使用
聊一聊串口环形队列常用的几种方法
cubeMX+STM32+Freertos 读队列时阻塞
FreeRTOS+STM32F103串口通信错误解决方法

基于环形队列的串口打印阻塞解决方法
评论