发新帖我要提问
12
返回列表
打印

数据拷贝的最快方法

[复制链接]
楼主: 午夜霓虹
手机看帖
扫描二维码
随时随地手机跟帖
21
xwj| | 2011-7-15 08:48 | 只看该作者 回帖奖励 |倒序浏览
是的,3楼的算法是为了如减少循环判断次数,属于空间换时间的灵活用法

选8 是因为8是2的整数次方,二进制下求余只要用 与运算 即可,便于CPU计算。
也可以选16、32、64、128...等2的n次方

使用特权

评论回复
22
xwj| | 2011-7-15 08:51 | 只看该作者
虽然设置循环条件多花了点时间,但明显减少了内循环判断次数,数据量越大优化效果越明显


当然,还是没有DMA快,更不可能比 零内存拷贝 更快

使用特权

评论回复
23
caner_hn| | 2011-7-15 08:54 | 只看该作者
IAR FOR STM8S编译表示木鸭梨。
IAR FOR ARM编译表示木鸭梨。
VC6.0编译表示木鸭梨。
LINUX下GCC编译表示木鸭梨(size_t n;提到函数最前面)。
说明千里马不多,伯乐也不多。

使用特权

评论回复
24
上官金虹| | 2011-7-15 09:00 | 只看该作者
LINUX下GCC编译表示木鸭梨(size_t n;提到函数最前面)。
说明千里马不多,伯乐也不多。 ...
caner_hn 发表于 2011-7-15 08:54


用C99,函数定义变量不用放在最前面。

使用特权

评论回复
25
午夜霓虹|  楼主 | 2011-7-15 09:03 | 只看该作者
昨天用iar实验了一下,memcpy这个函数在编译的时候效率上来了,也是400多个指令周期,说明MDK对STM32有非常深的意见,不给它优化,呵呵。

使用特权

评论回复
26
seawwh| | 2011-7-15 09:04 | 只看该作者
虽然设置循环条件多花了点时间,但明显减少了内循环判断次数,数据量越大优化效果越明显


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


其实STM32F10x 中的DMA 内存拷贝并不快,它不是阵发连续的。但是STM32F20x 可以连续传送(burst support)。

使用特权

评论回复
27
yjsstk| | 2011-7-15 09:04 | 只看该作者
算是看懂三楼的算法了

使用特权

评论回复
28
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能力不亚于单纯搞软件开发的.
很多优化也是在嵌入式这种苛刻的条件下才有用武之地

使用特权

评论回复
29
yinyangdianzi| | 2011-7-15 09:27 | 只看该作者
等答案

使用特权

评论回复
30
香水城| | 2011-7-15 10:00 | 只看该作者
STM32内部的数据总线是32位的,但3楼的程序却进行8位的数据传输,没有充分地利用32位的优势,如果能够改进一下才能说是真正高效。

使用特权

评论回复
31
午夜霓虹|  楼主 | 2011-7-15 10:33 | 只看该作者
三楼的代码已经改了,香主,stm32的dma传输是连续的吗,楼上这么说(其实STM32F10x 中的DMA 内存拷贝并不快,它不是阵发连续的。)对不对呢,另外,dma传输0.3k的数据,在0.1ms内完成,72m的频率。在0.1ms内没有cpu访问该内存。

使用特权

评论回复
32
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的风格。

使用特权

评论回复
33
香水城| | 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交替的方式快很多,但是否能比优化过的程序还快,就要详细分析指令序列的执行周期了。

使用特权

评论回复
34
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板块的斑竹。

使用特权

评论回复
35
午夜霓虹|  楼主 | 2011-7-17 00:09 | 只看该作者
唉,不知道怎么嵌入汇编,只好用最悲惨的办法,一个一个复制,累死我了。
这样还是用了600多个指令周期。

使用特权

评论回复
36
xwj| | 2011-7-17 08:10 | 只看该作者
哈哈,对于LZ的问题,要最快的话直接写72个
* to ++ = * from ++ ;

:lol

使用特权

评论回复
37
xianqiangxiao| | 2011-7-17 08:16 | 只看该作者
受教

使用特权

评论回复
38
午夜霓虹|  楼主 | 2011-7-18 12:34 | 只看该作者
没人知道嵌入汇编怎么搞嘛,嵌入了汇编就300多个指令周期搞定了,唉。用iar是可以的,但mdk这个编译器自己实现不了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则