eanry 发表于 2025-10-2 17:26:23

为什么 8H8K64U的DMA_SPI比纯硬件SPI没任何速度提升?

为避开国庆假开始的拥堵,这两天测试了
8H8K64U的DMA_SPI驱动ST7789P3的240*320的IPS彩屏,
本以为会有性能的大幅提升,没想到相差无几,不知是何原因,求大神指教!
主频:24MHz
SPI频率:主频/4
DMA_SPI实现思路:双缓存,每个缓存256字节,写满一路缓存启动发送后写第二路缓存。
采用中断方式,一旦传送结束,马上释放SPI总线以供其他共享部件使用。

测试思路:
设置Timer0每1ms中断进行用时计算,然后调用纯硬件的SPI进行全屏填纯色3次,停止timer0计时,显示所用时间。
复位计时变量和timer0,重新启动timer0计时,调用DMA_SPI进行全屏填纯色3次,停止timer0计时,显示所用时间。
结果纯硬件SPI 3次全屏刷新用时1782ms,DMA_SPI 3次全屏刷新用时1781ms,这个还是在只有一种颜色时的理想结果。
在根据字模输出字色或背景色时,由于每个点都多了一次if判断,并根据结果选择不同颜色填充缓存时,3次刷屏用时比纯硬件SPI还多400多ms。
想请教一下,8H系列的PDF文档中只有DMA_SPI_AMT这一个发送数量寄存器,没有高8位的数量?是否一次最多只能发256字节?

下面贴代码:










查阅了AI8H.H头文件关于DMA_SPI的相关寄存器好像真只有DMA_SPI_AMT这一个是控制传送数量的。


个人感觉如果真只能这样的话,那增加那么些代码来实现就没必要了。
希望有经验的大神和官方工程师指点迷津。



神农鼎 发表于 2025-10-5 02:08:17

参照下面管脚兼容的 STC32G12K128的
软件 双缓冲 乒乓 技术,
256字节的 DMA缓冲区,比无限深度的 DMA缓冲区,
只是牺牲 0.26% 的 CPU时间而已。
当然 STC32G12K128的 DMA缓冲区是 8K xdata 深度。
AI8051U的 DMA 缓冲区是 32K xdata 深度,
===还支持 DMA-P2P, 外设直接送外设





https://www.stcaimcu.com/data/download/Datasheet/STC32G.pdf



https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf

神农鼎 发表于 2025-10-5 02:50:22

STC32G144K246-视频级动画效果演示 - 老梁亲测 AI33-ARM 内部平台系列讲座 国芯人工智能技术交流网站 - AI32位8051交流社区

STC32G144K246-LQFP100/64,刷彩屏的能力
120MHz-CPU, 极限 140MHz
53MHz以上的 I/O 输出速度,比 AI8051U的 I/O输出快4倍以上
DAC + OP 已验证

AI8051U, 40MHz,13.5MHz-I/O 速度,@3.3V
320*240, AI8051U 刷彩屏
==》 320*240*2 = 153,600;    28帧/S

480*320, AI8051U 刷彩屏
==》 480*320*2 = 307,200;    14帧/S

800*480, AI8051U 刷彩屏
==》 800*480*2 = 768,000;    5.6帧/S

STC32G144K246-LQFP100/64, 刷彩屏是AI8051U的4倍以上的速度
120MHz-CPU, 极限 140MHz
53MHz-I/O 速度,
===>刷彩屏是 AI8051U 4倍的速度

STC32G144K246-LQFP100/64, QSPI-4线读FLASH, DMA-i8080并口-TFT接口 刷彩屏
===4倍AI8051U的 I/O 输出速度
320*240*2 = 153,600;    i8080-8位或16位并口刷彩屏,28帧/S * 4 = 112 帧/S;   
===改成 SPI-刷彩屏 要除4 = 28 帧/S;
480*320*2 = 307,200;    i8080-8位或16位并口刷彩屏,14帧/S * 4 = 56 帧/S;   
===改成 SPI-刷彩屏要除4 = 14 帧/S;
800*480*2 = 768,000;    i8080-8位或16位并口刷彩屏,5.6帧/S * 4 = 22.4 帧/S;
===改成 SPI-刷彩屏要除4 = 5.6 帧/S;

1024*600*2 = 1,228,800;    i8080-8位或16位并口刷彩屏
===320*240*2 = 153,600的,28帧/S / 8 / 4 = 3.5 帧/S * 4 = 14 帧/S;

1024*768*2 = 1,572,864;    i8080-8位或16位并口刷彩屏
===320*240*2 = 153,600的,28帧/S / 10.24 / 4 = 2.73 帧/S * 4 = 11 帧/S;

现在的 STC32G144K246的I/O输出速度实际应在 53MHz ~ 64MHz附近
===正在设计 120MHz 输出速度的 I/O, 将刷屏速度再 * 2

神农鼎 发表于 2025-10-2 17:28:56

DMA只是解放 CPU, 让CPU去干更重要的事。SPI的速度是SPI控制的,和 DMA无关

eanry 发表于 2025-10-2 17:47:00

神农鼎 发表于 2025-10-2 17:28
DMA只是解放 CPU, 让CPU去干更重要的事。SPI的速度是SPI控制的,和 DMA无关

在没看人工智能的分析前我就感觉缓存太小了,所以在思考是不是我阅读PDF不认真遗漏了某些信息。但反复查阅后没有找到更多的资料了,所以上来求助,希望得到官方的确认。

eanry 发表于 2025-10-2 17:49:22

如果我阅读的信息已完整,这个系列的DMA单次传输数据量是否可以提高到1K,甚至更多呢?

ercircle 发表于 2025-10-2 18:08:46

eanry 发表于 2025-10-2 17:49
如果我阅读的信息已完整,这个系列的DMA单次传输数据量是否可以提高到1K,甚至更多呢? ...


传输量由这个单字节寄存器控制,所以需要按最大256分批传输。如果需要单次更大可以考虑STC32G\Ai8051U系列




eanry 发表于 2025-10-2 19:28:01

ercircle 发表于 2025-10-2 18:08
传输量由这个单字节寄存器控制,所以需要按最大256分批传输。如果需要单次更大可以考虑STC32G\Ai8051U系 ...
感谢大神假期的关注。目前已经是按这个思路实现。
并在调试中发现程序的耗时主要是在准备数据中,
当写一块新缓存到大约0x6A-0x70个字节时,dma_spi就已经中断,
表示256字节的发送时间占数据准备时间的一半不到。
一会准备把数据准备中的字节操作改成字操作,把数据准备时间减少。

神农鼎 发表于 2025-10-2 21:25:22

让 STC8H8K64U工作在 40MHz, 40MHz/4 = 10MHz 比 24M/4 = 6M快
另外,双缓冲乒乓技术,高效刷屏

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

另外 AI8051U的 DMA缓冲区是 64K, 还可以外设直接到外设,要刷 TFT彩屏,AI8051U更合适。

eanry 发表于 2025-10-3 08:54:28

神农鼎 发表于 2025-10-2 21:25
让 STC8H8K64U工作在 40MHz, 40MHz/4 = 10MHz 比 24M/4 = 6M快
另外,双缓冲乒乓技术,高效刷屏 ...

感谢!算法上已经是双缓冲乒乓运作了,具体可以看文字说明或图片代码。调试发现不是算法问题,是芯片的dma单次传输数据量成为了瓶颈。不知道是不是8位机的限制。
通过算法优化原则,把运算量最大的数据准备(循环体)过程再优化了,性能有少量提升。后面再单纯的提高主频的意义,对dma比纯硬件的比率并无高。

eanry 发表于 2025-10-3 09:38:46

另外,习惯了电脑上的32位甚至是64位编程,对8位编程真是不习惯。16位变量的++运算,编译成机器字节码竟然也要8-12个字节,更不要说数组或指针寻址等运算,基本上都要30个字节指令组合起步,这让我无言。记得30年前用的286汇编都没有这么庞大的代码。所以,算法优化也难以弥补机器代码的细碎。看来选型对性能影响深远啊!
页: [1] 2
查看完整版本: 为什么 8H8K64U的DMA_SPI比纯硬件SPI没任何速度提升?