单片机实现环形队列_使用环形队列解决串口打印阻塞问题

本文介绍了环形队列作为常见线性存储结构在嵌入式开发中的应用,特别是在解决单片机串口打印阻塞问题上的作用。通过利用环形队列,当写索引达到最大内存时,数据会跳回队列头部继续写入,从而避免阻塞。文中以实例展示了如何使用环形队列优化单片机的串口通信。
摘要由CSDN通过智能技术生成

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

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

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

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

fd249b6d3790be1408c165363bbd9cd7.png

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

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

fb40653ccad30f360f3d188bc01fed9b.png

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

2c73c66f619bc01191dd6d404db5bade.png
eff62072512fe4ed80f8f0531e98d97d.png
175333b078bc149f28962f0dc8a59927.png
cd2c0fd7f51ce0d4a2a19b8019de8d2f.png

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

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

b9c80347f83c7df1e40f0c1f0315afff.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值