LAOXU
发表于 2023-1-16 11:11:49
楼主用的是结构体, 我不知道楼主的结构体内容, 故用数组代替, 执行效率和结果相同.
QQ624353765
发表于 2023-1-16 11:17:42
LAOXU 发表于 2023-1-16 11:07
用 STC8H 芯片仿真, 数据处理 用 DMA传输 和 纯软件模拟传输 两种方法, 然后计时, 对比执行时间, 得出传 ...
等我芯片回来我也测试下
zhp
发表于 2023-1-16 12:07:06
LAOXU 发表于 2023-1-15 22:22
DMA 的传输速度, 竟然干不过纯软件.
想不到啊......
对于您的测试结果,其实一点都不意外
首先,DMA(Direct Memory Access)直接存储器访问,即存储器读写不需要CPU的参与,DMA过程中可以释放CPU处理其它紧急事件
这才是DMA存在的意义,而不是说DMA就一定会更快
其次,对于Memory到Memory的DMA操作与直接软件读写操作相比,在速度上DMA确实没有什么优势
STC32G系列对于EDATA是1T读写速度,对于XDATA是2T写3T读的速度,这个速度本身就就非常快了
而DMA虽然是存储器直接访问,但需要进行XRAM总线仲裁,也就是当CPU在访问XDATA时,DMA操作需要等待
而您的测试代码中,由于采用的查询方式,导致DMA进行读写的过程中,CPU一直在和DMA硬件抢总线
如果您将这里代码改为中断方式,我估计硬件DMA的数据传输时间应该会减少一些
最后还有一点,硬件DMA的设计电路中,在进行Memory到Memory的数据搬移时,有状态机的处理
这也是需要时间的
LAOXU
发表于 2023-1-16 13:03:08
zhp 发表于 2023-1-16 12:07
对于您的测试结果,其实一点都不意外
好的, 我改为中断方式再试试,
至于你说的 Memory到Memory的数据搬移时,有状态机的处理, 这也是需要时间的, 而纯软件依靠指针间接寻址读取, 也是需要时间的, 处理数据短肯定 纯软件快, 现在的问题是, 数据长度已设定到 DMA充许传输的最大值了,这个时候 DMA传输效率应该是最高的了, 现在DMA传输效率在最高时 PK 不过纯软件, 那在数据量少时, 和纯软件传输相比, 差据会拉的更大效率会更低.
神农鼎
发表于 2023-1-16 14:08:35
DMA 是 让 CPU 干其他重要的事,能 DMA干的,CPU 就暂时退出干其他事,减轻 CPU的压力;
STC32G的 DMA缓冲区是 XDATA, CPU 尽量用 EDATA, 这样效率最高;
当几个外设同时用DMA, 会出现DMA缓冲区/XDATA使用竞争,就要进行 DMA缓冲区-XDATA谁先用的硬件自动仲裁;
===仲裁就会有时间的浪费,这是合理的时间!CPU使用edata, CPU 还可以全速运行
CPU也来用DMA缓冲区/XDATA, 就会增加 DMA硬件自动仲裁的压力
当然 edata 不够用时,你也只能不够的部分用xdata
LAOXU
发表于 2023-1-16 15:11:32
神农鼎 发表于 2023-1-16 14:08
DMA 是 让 CPU 干其他重要的事,能 DMA干的,CPU 就暂时退出干其他事,减轻 CPU的压力;
STC32G的 DMA缓冲区 ...
现在讨论的是 STC8H .
STC32DMA当然功能强劲, 缓冲区长达 64K
LAOXU
发表于 2023-1-18 10:37:20
zhp 发表于 2023-1-16 12:07
对于您的测试结果,其实一点都不意外
DMA传输, 改为中断方式, 测试了, 速度提升一点点, 不明显.
神农鼎
发表于 2023-1-18 10:55:02
DMA 是 让 CPU 干其他重要的事,能 DMA干的,CPU 就暂时退出干其他事,减轻 CPU的压力;
STC8H8K64U 的 DMA缓冲区是 xdata, CPU 尽量用 idata, 这样效率最高;
当几个外设同时用DMA, 会出现DMA缓冲区/xdata使用竞争,就要进行 DMA缓冲区-xdata谁先用的硬件自动仲裁;
===仲裁就会有时间的浪费,这是合理的时间!CPU使用idata, CPU 还可以全速运行
CPU也来用DMA缓冲区/XDATA, 就会增加 DMA硬件自动仲裁的压力
当然 idata 不够用时,你也只能不够的部分用xdata
神农鼎
发表于 2023-1-18 10:59:16
如用 DMA支持 :
4组串口同时工作,各自用 256字节的idata 缓冲区;
15 个 ADCn 通道轮流采样转换
SPI
===这种场合就极大的减轻了 CPU 的压力,DMA 是简化程序设计
===减少了研发人员任务调度的压力,减少了 CPU 的压力
LAOXU
发表于 2023-1-20 06:29:32
总结:
1. 由楼主贴出的 C?COPY 反汇编代码可看出, 楼主用的是 STC8H系列
2. 按照楼主的思路, 用 DMA 和 纯软件 方式, 分别 测试了 数据交换 和 数据移动, 这两项功能.数据长度为 DMA传输充许的最大值 256字节, 这时 DMA的 传输效率应该是最高的.
3. DMA传输, 分别测试了 查询方式 和 中断方式, 结论是 执行时间影响不大, 即 DMA执行, 不占用CPU的正常程序运行时间.
4. DMA进行读写的过程中,和CPU执行程序, 几乎没什么交叉干扰, 可通俗理解为 DMA传输, 是一个专门用于读写传输XRAM内存的专用CPU内核,
即 2核 CPU, 一个 通用CPU主核 用于一切操作, 另一个 专用CPU核 仅限于数据搬家传输. 用于在实时性要求不高的情况下, 减轻 通用CPU主核 的 工作负担.
5. 对实时性要求高的, 个人建议还是以纯软件 方式为佳, 时间容易精确控制.
例如1, 需通过 ADC定时采样 N个点, 以便通过 FFT计算各种输入数据, 如 ADC无定时采样功能, 只能通过外界干扰采样时间, 以取得精确的时间间隔, 这时 DMA基本没用.
例如2, HMI刷屏, 通常对速度无要求的, 以 DMA刷屏为佳, 但想获得更好的动态动画效果, 个人觉得还是以纯软件 方式为佳, 这时刷屏速度更快反应更灵敏, DMA速度上做不到.