2012-10-16 88 views
0

我最近一直在開發一些C語言的嵌入式軟件,用於微控制器,它只有2kB的閃存。即將結束編程,我一直在觸及代碼限制。直到現在,當這種情況發生時,我一直在提高編譯器優化的水平,重新測試,然後愉快地繼續。但是,最近我達到了優化的極限,並增加了最後一點功能,再次耗盡內存。結果,我不得不讓喬治福爾曼出現在我的源代碼中,並耗盡一些脂肪。通過分解無效指針大幅降低編譯代碼大小

我在這裏和那裏減少了一些抽象層,這有點幫助了一些事情,但還不夠。我看到了接下來的事情是,我不得不函數原型

void process_event(Event event, void *data); 

其作爲它的參數來處理事件和可以用來傳遞額外的數據呼叫空指針。如果我不需要任何額外的數據,我通過了NULL。這個功能很早就寫在開發中,我意識到我從來沒有使用過data,所以我將它分解了。這一個改變給我編譯的代碼大小節省了我需要的(〜100字節),我想知道爲什麼,特別是考慮到我通常在調用process_event時通過NULL

+2

函數調用了多少次?通過刪除參數實現的代碼節省是多少? – simonc

+0

該功能被稱爲相當數量(> 10倍)。 –

+2

這可能很大程度上取決於「事件」,它的大小和結構。您可能會遇到您的體系結構的邊界,其中額外的參數會對調用約定進行更改。沒有'數據'「全部在寄存器中」,「溢出堆棧」或類似的東西。 –

回答

1

大概100個字節可能符合這樣一個事實,即每次調用函數時,您的調用站點都必須傳遞一個額外的參數 - 這至少會涉及一個清除寄存器,並且根據您的芯片,在通話之前將其存儲在堆棧中。

也可以這樣簡單地減少每個調用的一條指令可能會導致更多的代碼被刪除,具體取決於如何實現跳轉,因爲您可能會發現某些代碼現在處於使用跳轉指令的範圍短的相對偏移而不是長的偏移。嘗試加載常量時可以進行類似的保存。