数据拷贝的最快方法

[复制链接]
11934|37
xwj 发表于 2011-7-15 08:48 | 显示全部楼层
是的,3楼的算法是为了如减少循环判断次数,属于空间换时间的灵活用法

选8 是因为8是2的整数次方,二进制下求余只要用 与运算 即可,便于CPU计算。
也可以选16、32、64、128...等2的n次方
xwj 发表于 2011-7-15 08:51 | 显示全部楼层
虽然设置循环条件多花了点时间,但明显减少了内循环判断次数,数据量越大优化效果越明显


当然,还是没有DMA快,更不可能比 零内存拷贝 更快
caner_hn 发表于 2011-7-15 08:54 | 显示全部楼层
IAR FOR STM8S编译表示木鸭梨。
IAR FOR ARM编译表示木鸭梨。
VC6.0编译表示木鸭梨。
LINUX下GCC编译表示木鸭梨(size_t n;提到函数最前面)。
说明千里马不多,伯乐也不多。
上官金虹 发表于 2011-7-15 09:00 | 显示全部楼层
LINUX下GCC编译表示木鸭梨(size_t n;提到函数最前面)。
说明千里马不多,伯乐也不多。 ...
caner_hn 发表于 2011-7-15 08:54


用C99,函数定义变量不用放在最前面。
 楼主| 午夜霓虹 发表于 2011-7-15 09:03 | 显示全部楼层
昨天用iar实验了一下,memcpy这个函数在编译的时候效率上来了,也是400多个指令周期,说明MDK对STM32有非常深的意见,不给它优化,呵呵。
seawwh 发表于 2011-7-15 09:04 | 显示全部楼层
虽然设置循环条件多花了点时间,但明显减少了内循环判断次数,数据量越大优化效果越明显


当然,还是没有DMA快,更不可能比 零内存拷贝 更快
xwj 发表于 2011-7-15 08:51


其实STM32F10x 中的DMA 内存拷贝并不快,它不是阵发连续的。但是STM32F20x 可以连续传送(burst support)。
yjsstk 发表于 2011-7-15 09:04 | 显示全部楼层
算是看懂三楼的算法了
lxyppc 发表于 2011-7-15 09:09 | 显示全部楼层
本帖最后由 lxyppc 于 2011-7-15 09:11 编辑
IAR FOR STM8S编译表示木鸭梨。
IAR FOR ARM编译表示木鸭梨。
VC6.0编译表示木鸭梨。
LINUX下GCC编译表示木鸭梨(size_t n;提到函数最前面)。
说明千里马不多,伯乐也不多。
caner_hn 发表于 2011-7-15 08:54

只能说明搞嵌入式的真正系统学习过算法和数据结构的不多

https://bbs.21ic.com/icview-245048-1-1.html
也就是这个贴子里面刘前辈在11楼说的
编程工作的人,应该自有优越感,美国只有1%不到的人从事编程高级工作。中国恐怕0.01%(万分之一)都不到。——所以,像我这样从事单片机控制已经达到顶尖级工作的人,根本入不了万分之一的编程层次的门。
     我要是会C++ ,早就不在这玩单片机了。—— 一点优越感,美感都没有。
刘前辈 发表于 2011-7-7 13:26

实际上搞嵌入式需要的algorithm能力不亚于单纯搞软件开发的.
很多优化也是在嵌入式这种苛刻的条件下才有用武之地
yinyangdianzi 发表于 2011-7-15 09:27 | 显示全部楼层
等答案
香水城 发表于 2011-7-15 10:00 | 显示全部楼层
STM32内部的数据总线是32位的,但3楼的程序却进行8位的数据传输,没有充分地利用32位的优势,如果能够改进一下才能说是真正高效。
 楼主| 午夜霓虹 发表于 2011-7-15 10:33 | 显示全部楼层
三楼的代码已经改了,香主,stm32的dma传输是连续的吗,楼上这么说(其实STM32F10x 中的DMA 内存拷贝并不快,它不是阵发连续的。)对不对呢,另外,dma传输0.3k的数据,在0.1ms内完成,72m的频率。在0.1ms内没有cpu访问该内存。
seawwh 发表于 2011-7-15 11:27 | 显示全部楼层
三楼的代码已经改了,香主,stm32的dma传输是连续的吗,楼上这么说(其实STM32F10x 中的DMA 内存拷贝并不快,它不是阵发连续的。)对不对呢,另外,dma传输0.3k的数据,在0.1ms内完成,72m的频率。在0.1ms内没有cpu ...
午夜霓虹 发表于 2011-7-15 10:33



100us 发 300Byte, 如果DMA使用32位宽度的话,1.3us 一次内存访问,这不应该是burst DMA的风格。
香水城 发表于 2011-7-15 11:39 | 显示全部楼层
三楼的代码已经改了,香主,stm32的dma传输是连续的吗,楼上这么说(其实STM32F10x 中的DMA 内存拷贝并不快,它不是阵发连续的。)对不对呢,另外,dma传输0.3k的数据,在0.1ms内完成,72m的频率。在0.1ms内没有cpu ...
午夜霓虹 发表于 2011-7-15 10:33


因为只有一条访问RAM的总线,因此DMA对内存的访问是与CPU交替进行的,而且DMA访问还要通过总线仲裁回避与其它总线主设备的冲突,这样看起来使用DMA做数据块拷贝确实不比优化过的程序快。

如果需要在STM32F10x中的DMA进行阵发连续,即排除CPU的干扰,可以使用WFI或WFE让CPU暂停运行,这样DMA传输应比与CPU交替的方式快很多,但是否能比优化过的程序还快,就要详细分析指令序列的执行周期了。
john_lee 发表于 2011-7-15 13:53 | 显示全部楼层
本帖最后由 john_lee 于 2011-7-15 13:58 编辑

关于duff's device(达夫设备)的话题,2005年时在本论坛(当时还是老论坛)的AVR板块讨论过,非常热,可惜21ic老论坛的资料已经找不到了,下面的链接是某网站抄录的整个帖子及全部跟帖: http://www.dzsc.com/dzbbs/20061211/200765193418406523.html
里面有详细的分析。
注:其中的zsmbj是当时AVR板块的斑竹。
 楼主| 午夜霓虹 发表于 2011-7-17 00:09 | 显示全部楼层
唉,不知道怎么嵌入汇编,只好用最悲惨的办法,一个一个复制,累死我了。
这样还是用了600多个指令周期。
xwj 发表于 2011-7-17 08:10 | 显示全部楼层
哈哈,对于LZ的问题,要最快的话直接写72个
* to ++ = * from ++ ;

:lol
xianqiangxiao 发表于 2011-7-17 08:16 | 显示全部楼层
 楼主| 午夜霓虹 发表于 2011-7-18 12:34 | 显示全部楼层
没人知道嵌入汇编怎么搞嘛,嵌入了汇编就300多个指令周期搞定了,唉。用iar是可以的,但mdk这个编译器自己实现不了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部