我需要优化代码以获得一些新代码的空间.我没有所有变化的空间.我不能使用代码库切换(80c31与64k).
你还没有真正花很多钱去做,但你可以考虑两个主要的优化级别:
微优化: 例如.XOR A而不是MOV A,0亚当早些时候很好地涵盖了其中的一些.
宏优化: 查看程序的结构,使用的数据结构和算法,执行的任务,并非常认真地考虑如何重新排列甚至删除它们.是否存在实际未使用的整个代码块?您的代码是否充满了用户从未看到的调试输出语句?是否存在特定于单个客户的功能,您可以将其从一般版本中删除?
为了更好地处理它,你需要找出你的内存正在耗尽的地方.Linker地图是一个很好的开始.宏优化是BIG获胜的地方.
顺便说一句,您可以 - 认真地尝试使用优秀的C编译器重写代码的一部分.您可能对代码的紧密程度感到惊讶.真正的汇编程序可能能够改进它,但它可以比大多数编码器更容易.大约20年前我使用了IAR,它吹掉了我的袜子.
使用汇编语言,您必须手动优化.以下是一些技巧:
注意:IANA8051P(我不是8501程序员,但我在其他8位芯片上进行了大量组装).
通过代码查找任何重复的位,无论多小,并使它们成为函数.
学习一些更不寻常的指令,看看你是否可以使用它们进行优化,例如.一个很好的技巧是使用XOR A清除累加器而不是MOV A,0 - 它保存一个字节.
另一个巧妙的技巧是,如果你在返回之前调用一个函数,只需跳转到它,而不是:
CALL otherfunc RET
做就是了:
JMP otherfunc
始终确保您尽可能地进行相对跳跃和分支,它们使用的内存少于绝对跳跃.
这就是我能想到的最重要的一切.
对不起,我迟到了,但我曾经遇到过完全相同的问题,而且这个问题一直存在,并且不断回复给我.在我的情况下,该项目是8051系列处理器上的电话,我完全消耗了ROM(代码)内存.它一直回到我身边,因为管理层不断要求新功能,所以每个新功能都变成了两个步骤.1)优化旧东西以腾出空间2)实现新功能,耗尽我刚刚制作的房间.
有两种优化方法.战术与战略.通过微优化思想,战术优化一次可以节省几个字节.我认为你需要进行战略优化,这需要更加彻底地重新思考你是如何做事的.
我记得的东西为我工作,可以为你工作;
看看代码必须做的事情的本质,并尝试提炼出一些非常强大的灵活原始操作.然后重建你的顶级代码,这样除了调用基元之外它根本不会做任何低级别的代码.理想情况下使用基于表格的方法,你的表格包含的东西; 输入状态,事件,输出状态,基元....换句话说,当事件发生时,在表中查找当前状态中该事件的单元格.该单元格告诉您要更改的新状态(可选)以及要执行的基元(如果有).对于不同的层/子系统,您可能需要多组状态/事件/表/基元.
这种方法的许多好处之一是您可以将其视为为您的特定问题构建自定义语言,您可以非常有效地(即使用最少的额外代码)通过修改表来创建新功能.
对不起,我已经迟到了几个月,你可能没有时间做这个激进的事情了.据我所知,你已经使用了类似的方法!但是我的回答可能有一天会帮助其他人.