- *Exactitude_buffer = a;
- 3654 CE3D MOVFF 0xe3d, 0xfe9
- 3656 FFE9 NOP
- 3658 CE3E MOVFF 0xe3e, 0xfea
- 365A FFEA NOP
- 365C CFDE MOVFF 0xfde, 0xfee
- 365E FFEE NOP
- 3660 CFDD MOVFF 0xfdd, 0xfed
- 3662 FFED NOP
- TMR1L = LS_BYTE(a); // 这里也是指针操作
- 3742 50DF MOVF 0xfdf, W, ACCESS
- 3744 6ECE MOVWF 0xfce, ACCESS
- TMR1H = HS_BYTE(a);
- 3746 0E01 MOVLW 0x1
- 3748 50DB MOVF 0xfdb, W, ACCESS
- 374A 6ECF MOVWF 0xfcf, ACCESS
Exactitude_buffer =a 看起来的简单的多了3条语句。
若使用第一种简化了操作,第二种更快!
结论:若是16 32位的单片机,第一种速度肯定比第2种高,但在8位的单片机内…..
- 优化以下代码:
- Us = 0xffff-Us;
- Exactitude_buffer = Us;
- 1、通过比较我们知道Exactitude_buffer 很慢,我们改成TMR1L = LS_BYTE(Us); TMR1H = HS_BYTE(Us); 代码减少了3个指令。
- 2、Us = 0xffff-Us;作用是取余数,所以这里也可以优化一下。
- Us =~Us;
- 哇,又少了4个指令
- 3、我们已经知道了C18不擅长16位运算,那在优化一下Us =~Us;
- LS_BYTE(us)= ~LS_BYTE(us);
- HS_BYTE(us)= ~HS_BYTE(us);
- 但是结果出人意料,代码还是一样长。因为Us =~Us;所以我建议这里还是这么写不要优化了。
- 4、已经优化了7个指令了,还能优化吗?答案是肯定的!
- 直接8位取反赋值给相应变量。
- TMR1L = ~LS_BYTE(us);
- TMR1H = ~HS_BYTE(us);
- 这个优化是个漂亮的动作一下少了13个指令。
- //us =0xffff-us;
- //*Exactitude_buffer =us;
- TMR1L = ~LS_BYTE(us);
- TMR1H = ~HS_BYTE(us);
- 优化成下面写法 少了20条语句,若PIC18以4M晶振,执行时间减少了20us.
2、位域与普通变量
先前有用过51的单片机,位域会比变量运算多2-3条指令。
考虑新的程序功能比较多,可以放不下,就试一下C18位域,看看会多几条指令。
结果出乎我的预计,C18的位域比普通变量快!位域3条,变量4条!- if(Baudrate ==1)
- 34B8 0101 MOVLB 0x1
- 34BA 05F7 DECF 0xf7, W, BANKED
- 34BC E101 BNZ 0x34c0
- 125: Baudrate =0;
- 34BE 6BF7 CLRF 0xf7, BANKED
- if(b_RS485_StartRec ==1)
- 34B8 010E MOVLB 0xe
- 34BA B53C BTFSC 0x3c, 0x2, BANKED
- 128: b_RS485_StartRec =0;
- 34BC 953C BCF 0x3c, 0x2, BANKED
3、32位运算 - temp32 = (uint32)value*16384 ; //28条语句
- temp32 = (uint32)value<<13 ; //31条语句
这里告诉我们左右移不一定比*法高效。
RyanHsiung 2011-12-29原创,转载请说明