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

电子说

1.2w人已加入

描述

队列(FIFO)是一种常见的线性存储结构,在嵌入式开发中经常用到,主要的应用场景有:

1. 高级一点的单片机内部串行通信模块,像UART、SPI、CAN等串行通信,内部带有FIFO缓存。有FIFO的模块可以一次写入或保存多个数据,而没有FIFO的模块只可以写入或保存一个数据。

2. 在RTOS中,可以通过消息队列实现任务(线程)间的通信

3. 解决CPU与外设由于速度差导致的阻塞

fifo

写数据索引write,读数据索引read,数据个数为write-read,普通队列写索引永远不小于读索引。但我们可利用的栈内存是有限的。

一种优化的队列是环形队列,也可以理解为首尾相连的队列。当写索引到达最大分配内存时,跳回到队列的头部继续写入,数据个数为(write+BUFFER_SIZE-read)%BUFFER_SIZE。

fifo

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

fifo

fifo

fifo

fifo

上面代码已经注释得够详细了,就不再描述了。

在需要打印数据时,直接调用printf函数格式化打印,在主函数大循环中执行debug_print_task就可以了。

fifo

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分