|
本帖最后由 sunnyqd 于 2014-9-14 21:55 编辑
终于搞好了IAR和CW平台的配置
KEIL编译器为ARMCC
IAR编译器为IAR C/C++ Compiler for ARM
CW编译器为GNU C Compiler
据说KDS也为GNU C Compiler,那这里就不列出KDS了
以上三个平台采用速度最大优化,禁止内联
这只是一个简短的比较,难免有疏漏之处,只供参考
比较的函数为默认的库函数里的memcpy()和如下的函数
- void intmemcpy(int32_t* dest, const int32_t* src, const int32_t size)
- {
- int32_t i;
- for(i=0;i<size;i++)
- {
- dest[i] = src[i];
- }
- }
- void intmemcpy2(int32_t* dest, const int32_t* src, int32_t size)
- {
- while(size--)
- {
- dest[size]=src[size];
- }
- }
- void intmemcpy3(int32_t* dest, const int32_t* src, uint32_t size)
- {
- while(size--)
- {
- dest[size]=src[size];
- }
- }
- void intmemcpy4(int32_t* dest, const int32_t* src, const int32_t size)
- {
- int32_t i;
- for(i=0;i<size;i++)
- {
- *dest++ = *src++;
- }
- }
- void charmemcpy(char* dest, const char* src, const int32_t size)
- {
- int32_t i;
- for(i=0;i<size;i++)
- {
- dest[i] = src[i];
- }
- }
- void duffcpy(uint32_t* dest, const uint32_t* src, const uint32_t size)
- {
- uint32_t n = (size + 7u) >>3;
- switch (size % 8)
- {
- case 0: do { *dest++ = *src++;
- case 7: *dest++ = *src++;
- case 6: *dest++ = *src++;
- case 5: *dest++ = *src++;
- case 4: *dest++ = *src++;
- case 3: *dest++ = *src++;
- case 2: *dest++ = *src++;
- case 1: *dest++ = *src++;
- } while (--n > 0);
- }
- }
- void duffcpy2(uint32_t* dest, const uint32_t* src, const uint32_t size)
- {
- uint32_t n = (size + 7u) >>3;
- uint32_t i = 0;
- switch (size % 8)
- {
- case 0: do { *dest++ = *src++;
- case 7: *dest++ = *src++;
- case 6: *dest++ = *src++;
- case 5: *dest++ = *src++;
- case 4: *dest++ = *src++;
- case 3: *dest++ = *src++;
- case 2: *dest++ = *src++;
- case 1: *dest++ = *src++;
- } while (++i < n);
- }
- }
复制代码
测试数据为
- int32_t Buf0[101];\\放置在0x20000800;
- int32_t Buf1[101];\\放置在0x20000A00;
- int32_t Buf2[101];\\放置在0x1FFFFD00;
- const int32_t Buf3[101];\\放置在0xF410;
复制代码
平台配置为:
KEIL:
IAR:
CW:
这里插上一句,虽然选择了CW里的do not inline,但是编译后还是被inline,无奈,只好将上述函数放到另一个文件里才解决
以下为测试结果
KEIL:
IAR:
CW:
很有意思的结果,KEIL和IAR的速度分布比较类似,自带库memcpy的效率最高,其中IAR的memcpy最快为356个时钟周期
但是CW的结果很难令人理解自带memcpy速度最慢,而charmemcpy函数居然比intmemcpy函数快,也就是分单字节拷贝比用int拷贝的速度快,很奇怪
下面是部分分析
KEIL默认的memcpy为
IAR默认的memcpy为
按结果来,IAR更快一点
CW默认的memcpy速度慢的原因可能是与它的使用的库有关,这个memcpy默认使用了一个.c文件里的内容,反汇编为
难怪CW你这么慢呢。。。。我尝试了宏_EMBEDDED_WARRIOR_MEMFUNCS,但是看反汇编的结果不起作用,无语,对你失望了
CW的charmemcpy被编译成了好长的一段,如下
无语
继续,Keil下的intmemcpy为
IAR的intmemcpy为
可见IAR将循环展开了许多,这么卖力,难怪比Keil快
但是,对于duffcopy
Keil为
IAR为
CW为
KEIL和CW都比较老实的用了STM和LDM
IAR难怪这里你最慢了
按着三个平台搭建项目的体会是,Keil最简便,搭建的过程中没有任何问题,CW问题最多,需要手动更改好几个地方才可以
可能是与我Keil用的比较多也有一定的关系
按操作体验来说,Keil最便捷,CW最繁琐,IAR居中
按界面来看,IAR最简洁,但是比较难看,Keil居中,CW虽然在eclipse下面比较华丽,但是相对来说臃肿一些
所以对于Cortex我还是喜欢选择Keil,其次IAR,但不会选择使用CW,(KDS可能与CW类似,但是免费的,这是优势)
编辑原因:补充图片 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|