打印

数据拷贝的最快方法

[复制链接]
8269|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
午夜霓虹|  楼主 | 2011-7-14 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
arm芯片支持数据的最快拷贝,可是到了C这边以后,不知道怎么能更高速度的拷贝了,比如从一段内存,拷贝72个长整型数据到另外一段内存,不知道大家有什么高招没有。现在72mhz的时候用了699个指令周期。
沙发
香水城| | 2011-7-14 10:56 | 只看该作者
DMA

使用特权

评论回复
板凳
uc_stm8| | 2011-7-14 11:09 | 只看该作者
本帖最后由 uc_stm8 于 2011-7-14 14:23 编辑

8位BYTE节复制
void __memcpy_fast( uint8 * to, uint8 * from, size_t count) 
{
if(count==0)
{
return ;
}

size_t n = (count + 7 ) / 8 ;

switch (count % 8 )
{
case 0 :
do { * to ++ = * from ++ ;
case 7 : * to ++ = * from ++ ;
case 6 : * to ++ = * from ++ ;
case 5 : * to ++ = * from ++ ;
case 4 : * to ++ = * from ++ ;
case 3 : * to ++ = * from ++ ;
case 2 : * to ++ = * from ++ ;
case 1 : * to ++ = * from ++ ;
} while ( -- n > 0 );
}
}


32位DWORD复制
void __memcpy_uint32_fast( uint32 * to, uint32 * from, size_t count) 
{
if(count==0)
{
return ;
}

size_t n = (count + 7 ) / 8 ;

switch (count % 8 )
{
case 0 :
do { * to ++ = * from ++ ;
case 7 : * to ++ = * from ++ ;
case 6 : * to ++ = * from ++ ;
case 5 : * to ++ = * from ++ ;
case 4 : * to ++ = * from ++ ;
case 3 : * to ++ = * from ++ ;
case 2 : * to ++ = * from ++ ;
case 1 : * to ++ = * from ++ ;
} while ( -- n > 0 );
}
}

使用特权

评论回复
地板
yinyangdianzi| | 2011-7-14 11:53 | 只看该作者
.........

使用特权

评论回复
5
icecut| | 2011-7-14 12:06 | 只看该作者
3楼代码好怪....

使用特权

评论回复
6
香水城| | 2011-7-14 12:31 | 只看该作者
本帖最后由 香水城 于 2011-7-14 12:32 编辑
3楼代码好怪....
icecut 发表于 2011-7-14 12:06


3楼的代码不但怪而且效率低下,同时还隐藏了一个大的BUG;另外是否能通过编译都难说。

使用特权

评论回复
7
午夜霓虹|  楼主 | 2011-7-14 13:09 | 只看该作者
同意楼上各位的说法,三楼的代码的确怪异的不得了。不符合实事求是的原则。

使用特权

评论回复
8
香水城| | 2011-7-14 13:43 | 只看该作者
同意楼上各位的说法,三楼的代码的确怪异的不得了。不符合实事求是的原则。
午夜霓虹 发表于 2011-7-14 13:09


三楼的思路还是不错的。

使用特权

评论回复
9
lxyppc| | 2011-7-14 13:53 | 只看该作者
三楼的是一个达夫设备
是一个关于速度优化的经典算法

使用特权

评论回复
10
uc_stm8| | 2011-7-14 14:06 | 只看该作者
本帖最后由 uc_stm8 于 2011-7-14 14:13 编辑

大数据COPY是有速度优势的。
楼上几位说不行的,先到编译器上试试。

使用特权

评论回复
11
午夜霓虹|  楼主 | 2011-7-14 15:16 | 只看该作者
呵呵,比较了一下,拷贝144个整形变量,3楼的代码需要700多个指令周期,用for循环需要1200多个,二用memcpy却很奇怪,在stm32上也是1200多个,而在lpc1754上却只有400多个指令周期,优化了很多。

使用特权

评论回复
12
午夜霓虹|  楼主 | 2011-7-14 15:24 | 只看该作者
arm汇编指令是支持数据的快速拷贝的,在nxp的单片机中库函数很好的实现了,而在stm32上却没有进行优化,不知道是什么原因。

使用特权

评论回复
13
mcu5i51| | 2011-7-14 15:28 | 只看该作者
3L代码好像是用一次多字节复制来减少循环(判断)次数

使用特权

评论回复
14
午夜霓虹|  楼主 | 2011-7-14 15:36 | 只看该作者
LDMIA R0!,{R3-R9}   用这种方法就会更快。

使用特权

评论回复
15
午夜霓虹|  楼主 | 2011-7-14 15:59 | 只看该作者
刚试过了,nxp的arm7也是编译成这条指令的,速度快了很多,不知道是stm32不支持这条指令,还是mdk对stm32有意见呢。

使用特权

评论回复
16
原野之狼| | 2011-7-14 17:47 | 只看该作者
呵呵 大千世界无奇不有啊
不过 现在的处理器很多都有块拷贝的硬件级实现

使用特权

评论回复
17
cheng105| | 2011-7-14 20:33 | 只看该作者
三楼的拷贝算法,很好,

使用特权

评论回复
18
z1111| | 2011-7-14 21:54 | 只看该作者
围观学习……

使用特权

评论回复
19
hdp7891000| | 2011-7-15 08:24 | 只看该作者
三楼的除以8,和对8求余应该也是可以换成9,10等等其它数吧?为什么偏偏选8,是不是有什么理论依据?

使用特权

评论回复
20
walnutcy| | 2011-7-15 08:36 | 只看该作者
19# hdp7891000
用8的编译器多会优化为>>3,&0x07,不会真的有除法;

3楼的思想很好,

使用特权

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

本版积分规则

57

主题

461

帖子

1

粉丝