0

我最近一直在用 C 语言为一个只有 2kB 闪存的微控制器开发一些嵌入式软件。在编程结束时,我一直在达到代码限制。到现在为止,当这种情况发生时,我一直在提高编译器优化的水平,重新测试,然后愉快地继续。但是,我最近达到了优化的极限,并且添加了最后一点功能,再次耗尽了内存。结果,我不得不让 George Foreman 了解我的源代码并消耗一些脂肪。

我在这里和那里减少了一些抽象层,这有点帮助但还不够。接下来我看到的是我有函数原型

void process_event(Event event, void *data);

它将要处理的事件和可用于将附加数据传递给调用的空指针作为其参数。如果我不需要任何额外的数据,我通过NULL. 这个函数是在开发的早期写的,我意识到我从来没有使用过data,所以我把它分解了。这一更改为我节省了所需的编译代码大小(~100 字节),我想知道为什么,特别是考虑到我通常NULLprocess_event被调用时通过?

4

1 回答 1

1

大约 100 个字节可能与您的调用站点在每次调用该函数时都必须传递一个额外参数这一事实相符——这至少需要清除一个寄存器,并且根据您的芯片,将其存储在调用前堆栈。

每次调用减少一条指令的这种简单减少也可能导致删除更多代码,这完全取决于跳转的实现方式,因为您可能会发现某些代码现在位于使用较短相对偏移量的跳转指令的范围内而不是一个长的。尝试加载常量时可以进行类似的节省。

于 2012-10-16T14:10:12.917 回答