2012-10-16 85 views
0

我最近一直在开发一些C语言的嵌入式软件,用于微控制器,它只有2kB的闪存。即将结束编程,我一直在触及代码限制。直到现在,当这种情况发生时,我一直在提高编译器优化的水平,重新测试,然后愉快地继续。但是,最近我达到了优化的极限,并增加了最后一点功能,再次耗尽内存。结果,我不得不让乔治福尔曼出现在我的源代码中,并耗尽一些脂肪。通过分解无效指针大幅降低编译代码大小

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

void process_event(Event event, void *data); 

其作为它的参数来处理事件和可以用来传递额外的数据呼叫空指针。如果我不需要任何额外的数据,我通过了NULL。这个功能很早就写在开发中,我意识到我从来没有使用过data,所以我将它分解了。这一个改变给我编译的代码大小节省了我需要的(〜100字节),我想知道为什么,特别是考虑到我通常在调用process_event时通过NULL

+2

函数调用了多少次?通过删除参数实现的代码节省是多少? – simonc

+0

该功能被称为相当数量(> 10倍)。 –

+2

这可能很大程度上取决于“事件”,它的大小和结构。您可能会遇到您的体系结构的边界,其中额外的参数会对调用约定进行更改。没有'数据'“全部在寄存器中”,“溢出堆栈”或类似的东西。 –

回答

1

大概100个字节可能符合这样一个事实,即每次调用函数时,您的调用站点都必须传递一个额外的参数 - 这至少会涉及一个清除寄存器,并且根据您的芯片,在通话之前将其存储在堆栈中。

也可以这样简单地减少每个调用的一条指令可能会导致更多的代码被删除,具体取决于如何实现跳转,因为您可能会发现某些代码现在处于使用跳转指令的范围短的相对偏移而不是长的偏移。尝试加载常量时可以进行类似的保存。