【学习笔记四】原创申精,欢乐的比较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类似,但是免费的,这是优势)

编辑原因:补充图片
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。