【学习笔记四】原创申精,欢乐的比较KEIL、IAR、CW数据拷贝

2020-02-20 21:04发布

本帖最后由 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()和如下的函数

  1. void intmemcpy(int32_t* dest, const int32_t* src,  const int32_t size)
  2. {
  3.   int32_t i;
  4.   for(i=0;i<size;i++)
  5.   {
  6.     dest[i] = src[i];
  7.   }
  8. }
  9. void intmemcpy2(int32_t* dest, const int32_t* src,  int32_t size)
  10. {
  11.   while(size--)
  12.   {
  13.     dest[size]=src[size];
  14.   }
  15. }
  16. void intmemcpy3(int32_t* dest, const int32_t* src,  uint32_t size)
  17. {
  18.   while(size--)
  19.   {
  20.     dest[size]=src[size];
  21.   }
  22. }
  23. void intmemcpy4(int32_t* dest, const int32_t* src,  const int32_t size)
  24. {
  25.   int32_t i;
  26.   for(i=0;i<size;i++)
  27.   {
  28.     *dest++ = *src++;
  29.   }
  30. }
  31. void charmemcpy(char* dest, const char* src, const int32_t size)
  32. {
  33.   int32_t i;
  34.   for(i=0;i<size;i++)
  35.   {
  36.     dest[i] = src[i];
  37.   }
  38. }
  39. void duffcpy(uint32_t* dest, const uint32_t* src, const uint32_t size)
  40. {
  41.   uint32_t n = (size + 7u) >>3;
  42.   switch (size % 8)
  43.   {
  44.       case 0:    do { *dest++ = *src++;
  45.       case 7:     *dest++ = *src++;
  46.       case 6:     *dest++ = *src++;
  47.       case 5:     *dest++ = *src++;
  48.       case 4:     *dest++ = *src++;
  49.       case 3:     *dest++ = *src++;
  50.       case 2:     *dest++ = *src++;
  51.       case 1:     *dest++ = *src++;
  52.       } while (--n > 0);
  53.   }
  54. }
  55. void duffcpy2(uint32_t* dest, const uint32_t* src, const uint32_t size)
  56. {
  57.   uint32_t n = (size + 7u) >>3;
  58.   uint32_t i = 0;
  59.   switch (size % 8)
  60.   {
  61.       case 0:    do { *dest++ = *src++;
  62.       case 7:     *dest++ = *src++;
  63.       case 6:     *dest++ = *src++;
  64.       case 5:     *dest++ = *src++;
  65.       case 4:     *dest++ = *src++;
  66.       case 3:     *dest++ = *src++;
  67.       case 2:     *dest++ = *src++;
  68.       case 1:     *dest++ = *src++;
  69.       } while (++i < n);
  70.   }
  71. }
复制代码
测试数据为
  1. int32_t Buf0[101];\放置在0x20000800;
  2. int32_t Buf1[101];\放置在0x20000A00;
  3. int32_t Buf2[101];\放置在0x1FFFFD00;
  4. const int32_t Buf3[101];\放置在0xF410;
复制代码

平台配置为:
KEIL: CW duffcpy.jpg (182.91 KB, 下载次数: 0) 下载附件 2014-9-14 21:19 上传

KEIL和CW都比较老实的用了STM和LDM
IAR难怪这里你最慢了

按着三个平台搭建项目的体会是,Keil最简便,搭建的过程中没有任何问题,CW问题最多,需要手动更改好几个地方才可以
可能是与我Keil用的比较多也有一定的关系

按操作体验来说,Keil最便捷,CW最繁琐,IAR居中

按界面来看,IAR最简洁,但是比较难看,Keil居中,CW虽然在eclipse下面比较华丽,但是相对来说臃肿一些

所以对于Cortex我还是喜欢选择Keil,其次IAR,但不会选择使用CW,(KDS可能与CW类似,但是免费的,这是优势)

编辑原因:补充图片
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
浪里白条
1楼-- · 2020-02-20 21:58
 精彩回答 2  元偷偷看……
sunnyqd
2楼-- · 2020-02-21 01:59
上面结果还可以发现一个有趣的现象
对于四个intmemcpy函数,均是intmemcpy和intmemcpy4的写法是最快的
对于
Keil:intmemcpy和intmemcpy4一样的速度
IAR:  intmemcpy4较intmemcpy快
CW:intmemcpy较intmemcpy4快

其中IAR的intmemcpy4最快
sunnyqd
3楼-- · 2020-02-21 05:50
浪里白条 发表于 2014-9-14 21:50
很有意思的测试,问一下,这个Ticks计数是如何实现的?

看我上一个帖子,http://www.amobbs.com/forum.php? ... p;extra=#pid7890315
使用systick,里面有说tick的获取方式是tick1-tick2-(tick0-tick1),其中(tick0-tick1)是调用systick函数时的开销
fengyunyu
4楼-- · 2020-02-21 10:25
学习了。通过lz的分析,对汇编有了感性的认识。
浪里白条
5楼-- · 2020-02-21 12:42
查了下汇编手册,没看懂这俩的区别

QQ截图20140914220128.jpg (59.13 KB, 下载次数: 0)

下载附件

2014-9-14 22:00 上传



寻址方式不一样?
sunnyqd
6楼-- · 2020-02-21 13:11
 精彩回答 2  元偷偷看……

一周热门 更多>