|
发表于 2012-5-12 21:05:58
|
显示全部楼层
本帖最后由 twitter 于 2012-5-12 21:07 编辑
NJ8888 发表于 2012-5-12 06:41 ![](static/image/common/back.gif)
我一直没用过AVR ,还是抓图看IAR反汇编吧,第三种代码多了
你的IAR开优化了么?如果在avrgcc上开了-0s优化,编译器的优化能力非常强,两者代码完全一致。
可以看到像version[1]这种访问方式,其实是直接通过完整地址来访问了,不是间接或变址寻址了,所以指针用不用都没什么优化。
但是如果是像下面这样,通过变量间接访问或遍历数组的话,指针优势是很强的。
普通的变量遍历方式,消耗164个时钟周期:
指针方式遍历,消耗101个时钟周期,而且代码也小了不少:
达夫设备,代码空间换速度,消耗78个时钟周期:
- #include <avr/io.h>
- uint8_t version[10];
- uint8_t version2[10]={11,22,33,44,55,66,77,88,99,0xaa};
- void copy(void) __attribute__((noinline));
- void copy(void)
- {
- uint8_t i;
- uint8_t *s=version2;
- uint8_t *d=version;
- for(i=0;i<10;i++)
- {
- *d++=*s++;
- }
- }
- void duff(void)
- {
- uint8_t *from=version2;
- uint8_t *to=version;
- register uint8_t n = (10 + 7) / 8; /* count > 0 assumed */
- switch (10 % 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);
- }
- }
- int main(void)
- {
- uint8_t i;
- for(i=0;i<10;i++)
- {
- version[i]=version2[i];
- }
- for(i=0;i<10;i++)
- {
- version[i]=0;
- }
- copy();
- for(i=0;i<10;i++)
- {
- version[i]=0;
- }
- duff();
- while(1);
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|