PICC 代码优化技巧.docVIP

  • 13
  • 0
  • 约2.12万字
  • 约 12页
  • 2017-06-11 发布于湖北
  • 举报
PICC 代码优化技巧

常用优化技巧: ? 要减少bank切换,把在不同bank里的变量放到一起。 ? 在初始化代码里,在程序的开头,注意初始化的顺序-一开始所有的变量放在bank0,然后放bank1,接着bank2,bank3。 ? 在初始化代码里-可能有些变量不需要初始化。 ? 在可能的地方,掉换操作数的顺序来使编译器避免多余使用W寄存器或临时位置。 ? 对于数学运算,表达式里的变量尽量要在同一个bank里,以避免过多的bank切换。 ? 如果可能,尽可能地采用字节byte运算代替字word运算。 ? 如果可能,对于数组元素的访问尽量采用指针而不是用下标索引。注意在一个小的循环里使用指针时,管理循环多出的代码抵销了使用指针节省下来的代码,所以使用两种方法差不多。 ? 一系列的: if else if else if ... 通常会比case语句产生更小的代码。 ? 在switch – case里,改变常量为有顺序的数据,不要有间隔。 ? 依靠bank切换必需的:Depending on the bank switching required: var = value1; if (!flag) var = value2; 产生更理想的代码: if (flag) var = value1; else var = value2; 只是要确认在该代码执行时不要在中断里使用这个var。 ? 清零,递增,以及递减一个字节byte是单指令的操作。给一个字节赋值需要两条指令(value - W, and W - byte). ? 只要可能,尽量使用bits代替unsigned chars。置位Bit sets,清零clears,以及位测试跳转等都是单条指令。 因为不能在函数里申明位变量,你可以全局声明位变量。 ? 调用函数会产生一些管理代码。尝试着用一些宏marcro代替你的一些小一点的函数。 ? 如果堆栈空间允许,大块的重复代码应该由函数及函数调用来替代。 ? 当前逻辑的优化。我还只是刚接到一个固定要求的项目,于是我尝试着把代码写得非常灵活。当我快接近项目结束时,我发现一些弹性代码不再需要了,这样可以删除它来节省代码。 优化提示1:Signed vs. Unsigned变量 比较使用signed和unsigned变量的汇编代码,你会发现在比较有符号signed变量时会多出一些指令。 结论1: 尽可能地使用unsigned的int或char。 优化提示2: 基于字节Byte的循环Loops 这里有两块代码,它们做的完全是同样的事情。但是其中一个要完成得快25%,并且使用更小的RAM空间,你能挑出是哪一个吗? unsigned char i; for(i=0;i250;i++) do_func(); //executes do_func() 250 times, in 3.25ms for(i=250;i!=0;i--) do_func(); //executes do_func() 250 times, in 2.5ms 要找出这个,我们来看一下产生的汇编代码 for(i=0;i250;i++) do_func(); //executes 250 times in 3251 cy 1617 01B8 clrf 0x38 1618 260F call 0x60F 1619 0AB8 incf 0x38 161A 3008 movlw 0xFA 161B 0238 subwf 0x38,W 161C 1C03 btfss 0x3,0x0 161D 2E18 goto 0x618 for(i=250;i!=0;i--) do_func(); //executes 250 times in 2502 cy 1621 3008 movlw 0xFA 1622 00B8 movwf 0x38 1623 260F call 0x60F 1624 0BB8 decfsz 0x38 1625 2E23 goto 0x623 结论2: 如果可能,让你的循环递减到零。检查一个ram变量是否为零会更快一些。 但是,注意在递增循环里,do_func()要早一个时钟周期被调用。如果你希望进入函数的速度快些,可选择递增循环。 优化提示3: Integer Timeout Loops 如果你想查询一个端口,或者在timeout“时间到”之前执行一个函数一定的次数,你需要一个定时循环timeout loop. unsigned int timeout; #define hibyte(x) ((unsigned char)(x8)) #define lobyte(x) ((unsigned char)(x0xff)) //the optimizer ta

文档评论(0)

1亿VIP精品文档

相关文档