C-通过将空隙指针分解为大大减少编译的代码大小



我最近在C中为Microcontroller开发了一些嵌入式软件,该软件只有2KB的闪存。在编程结束时,我一直在达到代码限制。到目前为止,当发生这种情况时,我一直在提高编译器优化水平,然后重新测试然后愉快地进行。但是,我最近达到了优化的极限,并且随着最后一位功能的添加,再次耗尽了内存。结果,我不得不将乔治·工头(George Foreman)放在源代码上并排出一些脂肪。

我四处乱逛,在这里和那里减少了一些抽象层,这有点重要,但还不够。我看到的接下来是我拥有功能原型

void process_event(Event event, void *data);

将其作为参数进行处理,并且可以使用的空隙指针将其他数据传递给呼叫。如果我不需要任何额外的数据,我将传递NULL。该功能是在开发中很早就写的,我意识到我从未使用过data,因此我将其算出来。这个更改给了我所需的编译代码大小(〜100个字节),我想知道为什么,尤其是考虑到我通常通过NULL时通过CC_3?

大约100个字节可能与您的呼叫站点必须每次调用函数时都必须传递额外的参数 - 这至少涉及到寄存器,而且,根据您的芯片,将其存储在呼叫之前的堆栈中。

也有可能完全根据如何实现跳跃的方式来删除每个呼叫的一个指令,这可能会导致更多代码,因为您可能会发现,现在有一些代码在使用A跳跃指令的范围内短相对偏移而不是长偏移。尝试加载常数时可以节省类似的节省。

相关内容

  • 没有找到相关文章

最新更新