eanry 发表于 2025-10-19 18:05:52

普通的硬件SPI传输大量数据时,慎重选用中断方式!

如题,最近在使用Ai8H8K64U开发一块数控小板,在功能基本完成后,优化中无意发现:
把SPI的中断方式屏蔽掉,只用单纯的查询方式,效率竟然提高了20%左右。

其实计算一下大概也可以得出结果。中断方式每发送一个字节就中断一次,中断的CPU消耗就非常严重了。
按24M主频算,SPI的频率采用4分频,大概就是6MHz。发送一个字节8位加硬件准备大概最低也要9个时钟,就是9/6M=1.5us左右。
每次中断CPU都要把当前的相关寄存器入栈出栈,消耗相当厉害。模式改用后,纯硬件的SPI刷320X240的屏幕,肉眼可见的快了不少。



神农鼎 发表于 2025-10-19 18:48:55

DMA-SPI



eanry 发表于 2025-10-19 21:06:16

神农鼎 发表于 2025-10-19 18:48
DMA-SPI
前面已经发文评论过DMASPI了,对于需要CPU准备数据的DMASPI,在8位芯片中(DMASPI一次最多只能传输256字节)完全没有优势可言。粗略测试了采用查询式硬件SPI比DMASPI还快。
具体原因是8位机在采用双缓冲时带来的代码量增加所耗费的CPU时间已经完全覆盖了DMASPI的优势。具体的可以自己写段双缓冲代码并对照相应的汇编机器码就知道指令增加多少,消耗多少CPU时间了。我在上次发贴中的双缓冲代码自认已经是最简化的代码了,但测试得到的结果却不理想。结果是256个字节经SPIDMA发送完,CPU这边只准备了0x70个字节。当然这个可以通过不断提升主频来抹平CPU的数据准备时间和DMASPI间的差距,但随之带来的功耗和稳定性也不得不考虑。

eanry 发表于 2025-10-19 21:18:53

个人认为:需要CPU来准备数据(检查缓冲区并把数据放XDATA中的缓冲区中)的DMASPI,在8位机中有点鸡肋。除非是无需CPU准备数据的情况另论。

神农鼎 发表于 2025-10-19 21:53:47







eanry 发表于 2025-10-20 08:27:11

神农鼎 发表于 2025-10-19 21:53

你这个统计表只是单纯统计DMA的中断服务程序的CPU占比,没有统计对比非DMA的,也没有统计引入双缓冲所带来的指令增长对应的CPU消耗。应该做个双方对比,并统计引入双缓冲的前后性能对比,这样更有说服力。
纯粹的自己与自己比,看不出问题,也说明不了问题。只有前后对比才有说服力。

eanry 发表于 2025-10-20 08:29:46

打个比方,就像公司的报表报告今年利润同比增长了100%,但却不提去年同期是亏损的。所以只要今年不亏就已经是增长了。

神农鼎 发表于 2025-10-20 11:12:23

外设配置好后,只需要考虑,
DMA中断服务程序占用 CPU的时间比率
如 缓冲区是 256字节时, 0.262% :



天宁宁 发表于 2025-12-18 18:17:25

拍个视频看看实际效果

_NCY_ 发表于 2026-2-1 19:30:10

DMA中断确实能很好的解放CPU,因为发256字节的间隔时间可以干别的
但感觉纯中断确实感觉和硬件阻塞轮询差不多,因为中断的太频繁了以至于中间的散碎时间就算用rtos也没法利用起来(空闲的总时间很多的,但都切的碎碎的,us级别的,利用不了
页: [1] 2
查看完整版本: 普通的硬件SPI传输大量数据时,慎重选用中断方式!