- 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
您可能关注的文档
最近下载
- 项目研制工作总结报告.docx VIP
- 高质量盖板涵计算表新规范可算明涵.xlsx VIP
- 机床中心轴托架模具及其弯曲工艺设计(含全套图纸).doc VIP
- 2024-2025学年湖南省长沙市雅礼中学高二上学期期末物理试卷含答案 .pdf VIP
- 临床试验的基本流程与注意事项培训课件.pptx VIP
- 办公设备维护方案.docx VIP
- 工人文化宫学习资料集试题库答案及解析.docx VIP
- 硕世-新冠产品说明书-加注册证号版.pdf VIP
- 《中国共产党基层组织选举工作条例》应知应会知识学习测试题(含答案).doc VIP
- 2024年高一语文必修上册第六单元写作任务“‘劝学’新说”立意解析及学生范文4篇.docx VIP
原创力文档

文档评论(0)