STM32+i.MX6ULL异构通信下对比轮询和零拷贝性能测试
1、CPU占用率对比测试STM32端保持全速发送,对比驱动中使用CPU轮询加传统read()方式,以及驱动中使用DMA加零拷贝方式的CPU占用率 使用top查看CPU占用率前,需要让进程在后台运行,且不能把输出写到终端中 1./enoseApp > /dev/null 2>&1 & 查看进程的CPU占用率 1top -p $(pidof enoseApp) 后台只有1个进程,用fg命令把它拉回前台,直接结束就可以了 使用CPU轮询加传统read()方式,CPU占用率高达98% 使用DMA加零拷贝方式,CPU占用率下降至1% 2、端到端延时测试在10MHz的SPI传输速率下,测试从STM32准备好数据,拉高同步引脚,到应用程序在接收到数据后,将一个空闲引脚拉高之间的时间。端到端延时1.3ms
STM32与i.MX6ULL异构SPI+DMA通信踩坑记录
背景: 本项目旨在设计一种可以本地运行轻量化机器学习算法的通用电子鼻底层系统,选用STM32采集传感器数据以及实时控制采样流程,i.MX6ULL负责数据处理算法以及结果展示。为了传输大量数据并节约传输开销选择SPI协议传输自定义帧,使用DMA搬运数据,降低CPU占用率。 1. 异步通信导致的 DMA 数据撕裂问题现象: 如果 Linux 端来不及读取数据,STM32 的 DMA 会直接将旧数据覆盖。当 Linux 正在读取一段缓存,而 DMA 正好在覆写同一段缓存时,会引发严重的“数据撕裂”。 解决方法: 增加硬件同步握手线: 当 STM32 准备好数据后,拉高同步引脚;Linux 检测到外部中断后开始读写 SPI;DMA 发现数据被读取完毕后,拉低同步引脚。 增加协议层状态标志: 如果 Linux 读写不及时,当 DMA 写完一段缓存切换区域时,若发现同步线仍为高电平,则主动修改溢出标志错误码,通知应用层丢弃脏数据。 2. 数据量不满足 Linux DMA 触发阈值问题现象: STM32 发送的一帧数据仅有 26 字节,未达到 Linux 端 SPI DMA 的启动阈值,导...
