OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2313|回复: 1

接收用队列缓冲很常见,但发送用队列却很少。思考思考。

[复制链接]

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2020-5-6 23:35:22 | 显示全部楼层 |阅读模式

平常单片机间做有协议通信,用环型对列来接收数据是很常用的。但是却很少看到发送有用队列的。基本都是while判断发送标志等着,直到数据全部发完。这样如果用9600波特率,发100byte,就要停100ms左右。。这里思考下发送用缓冲队列存在的局限。
想了想,可能原因有下:
1.单片机产生数据是很快的。而且是密集的。但是接收是比较均匀的。比如9600波特率串口最快也1ms接收一个数据。但发送时单片机会单次产生大量数据。比如一个协议是100byte,单片机是一次性就计算好这100byte数据,计算这100byte数据耗时也很短。如果采用环冲区,那环冲区的大小必须大于单次产生的数据才行。相比接收缓冲。要占用更多资源做缓冲区。
2.想要保证发送缓冲正常工作,那要满足  单次数据量/数据发送间隔<发送速率。比如单次数据是100byte,那就要控制数据产生的间隔要大于发送100byte的时间,不然再大的缓冲区也会溢出。如果用额外的程序控制数据的产生和发送间隔也是麻烦事。一次性计算完,一次性发送完会很清爽。
3.细想下,无论怎样处理,发100byte,就是需要这么多时间,用缓冲区再快也就是把计算时间匀到发送等待时间里。结合上一点,上次没有发完前,不可能一次把本次计算的数据放入缓冲。那就算数据在发送空闲时间里已经计算好了,也只能等着。再者计算数据本身就很快。产生100byte的发送数据的时间对于发送100byte的时间可能都可以忽略不计。发完前一笔数据再计算后一笔花费的时间也不多。。花大量代码去控制数据产生来配合发送缓冲区和发送速率,做好了也收效甚微。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-8-3
在线时间
8 小时
发表于 2020-5-6 23:35:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-28 05:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表