本帖最后由 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通信延迟,即提高系统响应速度的一些措施和方法,供大家参考。
|