我需要优化代码以为一些新代码腾出空间。我没有空间进行所有更改。我无法使用代码库切换(80c31 与 64k)。

有帮助吗?

解决方案

您还没有真正给予了很多去这里,但也有您可以考虑优化的两个主要层次:

<强>微优化:   例如。 XOR A代替MOV A,0   亚当已覆盖其中的一些很好早。

<强>宏观优化:   看看你的程序的结构,数据结构和算法中使用时,执行的任务,并认为很难有关如何解决这些重新安排,甚至删除。是实际未使用的代码有全块?是您的代码完全是用户永远不会看到调试输出语句?是否有功能的具体到一个客户,你可以离开了一个总的释放?

要得到一个好的手柄,你需要在您的内存被使用到工作了。链接器的地图是开始一个很好的地方。宏观优化是其中BIG胜可。

顺便说一句,你可以 - seriously-尝试重写代码的零件具有良好的优化C编译器。你可能会在怎样的代码紧可惊讶。一个真正的汇编能手也许能改善它,但它可以很容易地比大多数程序员更好。我大约20年前使用的 IAR 之一,它吹我的袜子。

其他提示

使用汇编语言,你必须手工优化。这里有一些技术:

注意:IANA8051P(我不是8501程序员,但我已经做了很多组件的其他8个芯片)

通过代码去寻找任何重复位,不管多么小,使它们的功能。

了解一些更不寻常的说明,看看是否可以使用它们来优化,例如。一个很好的技巧是使用XOR A以清除累加器代替MOV A,0。 - 它节省了字节

另一个绝招是不是如果您在返回之前调用的函数,只跳给它如:

CALL otherfunc
RET

只要做到:

JMP otherfunc

务必确保在可能的情况,他们使用的不是绝对的跳跃内存少,你正在做的相对转移和跳转。

这是所有我能想到的把我的头顶部的时刻。

对不起,我来这么晚,但是我曾经有过完全一样的问题,它成为了萦绕在我重复的问题。在我的情况下,该项目是一个电话,在8051系列处理器,和我完全累坏了的ROM(代码)内存。它不停地回来给我,因为管理层不断要求新的功能,所以每个新功能成为了两个步骤。 1)优化旧的东西,以腾出空间2)实现新的功能,使用起来我只是做了房间。

有两种方法来优化。战术和战略。战术优化在与微优化思路一时间节省几个字节。我认为你需要它涉及你是怎么做的事情更彻底重新思考战略的优化。

东西我记得为我工作,并可能为你工作;

看的什么你的代码必须做,并试图提炼出一些真正强大灵活的基本操作的精髓。然后,使其不执行任何操作水平低,在所有除对原语呼叫重建的顶级代码。理想的情况下使用基于表的方法,你的表中包含的东西等;输入状态,事件,输出状态,原语....换句话说,当一个事件发生时,查找表中的一个小区中的当前状态的事件。该单元格告诉你什么新的状态更改为(可选),什么原语(S)(如果有的话)来执行。您可能需要多套州/事件/表/不同层/子系统的图元。

一个这种方法的许多好处是,你可以把它作为构建定制的语言为您的特定问题,您可以非常有效地(即用最少的额外代码),只需通过修改表中创建新的功能。

对不起我月中下旬,你可能没有时间做一些这种激进的反正。对于所有我知道你已经在使用类似的方法!但是我的回答可以帮助别人哪天谁知道。

在疲惫不堪出部门,你也可以考虑压缩你的代码的一部分,只保留当前正在使用。在任何特定的时间点解某一部分。我很难相信,对于压缩/解压缩系统所需的代码将是足够小,8051的内存极小的一部分,使这个值得的,但对稍大系统创造了奇迹。

另一种方法是把一个字节码格式或一种表驱动的代码,一些国家的机床产量 - 有一台机器了解你的应用程序在做什么,产生完全不可实现可以是一个伟大的的方式来保存室:)

最后,如果代码是用C编译的确,我建议用各种不同的选项编译,看看会发生什么。此外,我在2001年写了紧凑型C编码为ESC一块回仍然是相当的电流。请参阅文本等各种花样的小机器。

1)如果可能节省I数据的变量不是在扩展数据结果 2)看看你的JMP报表 - 利用SJMP和AJMP的

我假设您知道它不适合,因为您编写/遵守并收到“内存不足”错误。:) 看来答案非常准确地解决了您的问题;缺少代码示例。

然而,我想推荐一些额外的想法;

  1. 确保所有代码都是 真的正在使用——代码覆盖率测试?一 未使用的潜艇是一个巨大的胜利 - 这是一个 艰难的一步——如果你是原来的 作者,可能更容易——(好吧,也许):)
  2. 确保“验证”水平 和初始化 -- 有时我们 有过度热心的倾向 在保险中,我们已经初始化 变量/内存,果然如此 没错,我们有多少次了 被它咬了一口。不说不要 初始化(呃),但如果我们正在做 记忆的移动,目的地 不 需要 首先归零 -- 这与

    1 --

  3. 评估新功能 -- 可以 现有子将得到增强以涵盖 两者都是函数,或者可能是 现有功能已替换?
  4. 分解大代码,如果一段 大代码可以节省 创造 一个新的 小代码。

或者也许现在有关于硬件版本 2.0 的争论......:)

问候

除了已经提到的(或多或少)明显的优化,这里是一个非常奇怪的(而且几乎不可能实现)之一:代码重用。并与代码重用我不意味正常的重用,但是到了)重用代码数据或b)重用代码为其他代码。也许你可以创建,它可以通过ASM十六进制表示操作码(在这里你必须看看哈佛VS冯·诺依曼架构)一个LUT(或任何静态数据)。

在其它将通过给出的代码,当你处理它不同的含义不同重用代码。下面一个例子来阐明我的意思。如果你的代码的字节是这样的:在AABCCCDDEEFFGGHH地址X,其中每个字母代表一个操作码,想象你现在会跳转到X + 1。也许你会得到一个完整的不同功能,在现在的空间分隔字节形成新的操作码:ABC CCD DE EF GH。

但要注意:这不仅是棘手的,以实现(也许它不可能的),但它的一个恐怖维护。所以,如果你不是一个演示代码(或类似的东西异国情调的),我会建议使用已经上述其他方法来节省MEM。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top