2012-03-02 138 views
2

在我的嵌入式應用程序中,這對內存非常敏感,我注意到一些使用大量堆棧空間的newlib函數。通過查看newlib的源代碼,特別是在這種情況下memmem.c,我注意到兩個定義,PREFER_SIZE_OVER_SPEED和__OPTIMIZE_SIZE__,它可以大大減少內存使用量。 據我所知,這些應該在編譯newlib時使用「優化大小」庫來定義。由於我使用的是cortex-M3微控制器,是否有任何ARM工具鏈使用「優化尺寸」newlib或提供使用它的選項,或者我應該自己嘗試構建它。 此外,在構建newlib時,我是否也應該構建GCC,或者可以只創建庫並將其用於當前工具鏈。目前我正在使用CoIDE和他們提供的工具鏈。針對代碼大小優化的Newlib

回答

1

你只需要建立庫,而不是編譯器。

但是,我期望任何大小優化與代碼大小而不是堆棧大小有關。如果自動變量的大小或數量減少,堆棧大小隻會減小,並且通常由所需的功能而不是算法的優化來確定。

雖然通過利用更多的內存可以加速涉及大量數據移動的高級操作,但我認爲在C標準庫級別這種機會是最小的,因此「比較喜歡大小超速「是關於代碼大小而不是數據存儲器使用情況。

+0

這只是我在做Z.T時注意到的事情。也建議。我知道對大小標記進行優化只會減小代碼的大小,而且它對這個特定函數使用較少的堆棧的事實只是一個令人高興的巧合。但就像我在我的評論中也說過的,我想知道還有什麼可以通過這個獲得,並且想要嘗試一下 – Merwe 2012-03-04 10:31:00

+0

我想說,要確定你知道圖書館是如何構建的,你要麼需要從庫提供者(如果包含可能提供線索的構建腳本),或者根據自己的需求自行構建它。 – Clifford 2012-03-04 19:40:17

0

您正在使用不是標準功能的memmem。這是glibc中的一個GNU擴展。你實際運行的代碼是在str-two-way.h中。我沒有研究它,但它說它是一個像Boyer-Moore這樣的子線性字符串搜索,並且提供了關於Boyer-Moore的維基百科文章。當然這會有一些內存成本。

因爲它甚至不是標準函數,所以如果你不喜歡它,沒有理由使用newlib的實現。只需使用您自己的子字符串搜索功能。如果您知道二次時間足夠好,只需使用memmem.c中的5行循環代碼即可。您可能想要檢查memcmp是否正確地使用未對齊的負載(如果您的架構支持這些負載)。如果沒有,手動嵌套循環可能比調用memcmp快。

+0

我實際上做了你的建議,使用來自memmem.c的簡短版本的代碼,但是這讓我想知道是否沒有任何其他優勢的建設與優化大小旗幟newlib。我還從uClibc的memmem中看到了根本不使用memcmp的源代碼。我並不是真的關心這個性能,因爲我在應用程序的初始化階段只使用memmem,但正如我所說的,我也想知道從「更小」的newlib中還能獲得什麼。 – Merwe 2012-03-04 09:59:08

+0

我建議對這些定義的源代碼進行清理,並在其郵件列表上詢問更多節省內存的方法。 :-) – 2012-03-07 00:41:34