本帖最后由 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:
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类似,但是免费的,这是优势)
编辑原因:补充图片
uint和int为什么要分别处理?不是都按32位来处理么,对MCU来说应该没什么区别呀
一周热门 更多>