打印
[学习资料]

MCU搞低延迟通信,有哪些方法?我们一起来看看吧!

[复制链接]
149|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-6-6 14:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dffzh 于 2025-6-6 14:47 编辑

在MCU中实现低延迟通信需要综合考虑硬件特性、协议选择和软件优化等。
我们可以通过以下的一些措施来综合实现MCU的低延迟通信:
1、硬件层面优化
选择高速接口
SPI:串行外设接口总线,一般为四线制,全双工,主从模式,时钟频率可达几十MHz,代码实现快:
I2C:内部集成电路总线,两线制,半双工,速率较低,但可以通过快速模式(400kHz)或超快速模式(1MHz)执行优化:
UART/USART:通用同步异步收发器通信,两线制,波特率需尽可能高(如1Mbps以上),但需注意时钟同步误差:
QSPI:Quad SPI,为六线SPI,是加强版的SPI,比SPI的应用更广泛;如果SPI不够,就上QSPI:
硬件加速:比如现在很多32位MCU都内置了DMA(直接内存访问)模块,很多外设(ADC
/DAC/SPI/I2C等)使用时都可以配备DMA来操作,可以通过减少CPU干预的方式来提高数据处理速度。
专用外设
CAN FD:全称控制器局域网灵活数据速率,是传统CAN总线的升级版本,通过提升数据传输速率、扩展数据长度和优化帧结构,解决了传统CAN在带宽和效率上的局限,主要应用于汽车电子和工业控制领域;
USB FS/HS:全速/高速USB,需要协议栈支持。
2、协议优化
精简协议
可以减少数据包的帧头和帧尾,一般情况下用1字节帧头和1字节帧尾可能就够了;
尽量用BIT表示来代替BYTE表示,比如一些状态信息或者错误信息等,只需要0和1即可;
尽量使用固定长度的数据帧,避免额外的解析开销。
实时协议
Modbus RTU:RTU即远程终端单元,基于UART,轮询模式;RTU能够实时采集各种传感器和设备的信号,并将数据传输到上位机或云端服务器进行处理和分析,常用于工业自动化领域;
CANopen协议:适用于CAN总线;
当然你也可以自定义轻量级的通信协议,包含必要的CRC校验或者LRC校验等。
3、中断与DMA结合
高优先级中断
为通信中断分配最高优先级(如NVIC配置);
中断服务程序(ISR)尽量短,只放标志位,数据处理放到主循环。
DMA传输
使用DMA自动搬运数据,避免CPU处理;
双缓冲或者队列技术:一边传输一边处理,减少等待时间,防止数据丢失,特别是高速的数据交互场景。
4、加入实时操作系统RTOS
这也是常用的降低MCU通信延迟的手段之一。
任务调度优化
使用RTOS(如FreeRTOS)的优先级调度确保通信任务优先执行;
避免任务频繁切换(如通过事件队列或信号量同步)。
零拷贝技术
直接传递数据指针而非复制数据(如使用RTOS的消息队列传递指针)。
5、软件优化
轮询模式:
在极端低延迟场景下,轮询比中断更快速,但是比较占用CPU资源;
内联汇编/寄存器操作:
直接操作外设寄存器,比如STM32的SPI收发库函数HAL_SPI_TransmitReceive的执行就比较费时,可以直接用寄存器方式实现数据读写,减少函数调用开销,可以参考作者的一篇文章(链接:https://bbs.21ic.com/icview-3453282-1-1.html)就对比测试了两种方式的发送数据的时间(数据量不一样,时间不一样,但HAL库有点慢):
如果还不行,就通过SPI+DMA+中断来操作。
预计算与缓存:
提前计算校验和或CRC,减少实时计算延迟。


以上作者介绍了五种降低MCU通信延迟,即提高系统响应速度的一些措施和方法,供大家参考。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

690

帖子

7

粉丝