在許多情況下需要優(yōu)化嵌入式系統(tǒng)特性,這些特性包括系統(tǒng)時序、代碼大小、RAM 使用和能耗。優(yōu)化每個特性通常需要不同的方法和技術(shù),但嵌入式開發(fā)人員可以遵循幾個通用技巧來優(yōu)化他們的嵌入式軟件。
技巧1 – 始終創(chuàng)建一個基線進行比較
創(chuàng)建一個基線來比較優(yōu)化結(jié)果是顯而易見的?;€測量很重要,因為每個優(yōu)化周期的回報都會遞減。例如,第一次優(yōu)化能源可能會導(dǎo)致 20% 的改進。第二個,10%,然后是 5%,以此類推。開發(fā)人員需要能夠看到這一趨勢,并量化他們在系統(tǒng)中看到的改進,以投入時間。
技巧2 – 設(shè)置優(yōu)化目標(biāo)
每一次優(yōu)化都需要越來越多的時間來從系統(tǒng)中擠出最小的改進,團隊需要仔細(xì)平衡他們的時間投入,并確定由此產(chǎn)生的改進是否值得花時間。在優(yōu)化開始之前,團隊?wèi)?yīng)該設(shè)定一個目標(biāo)水平,一旦達到就足以滿足當(dāng)前應(yīng)用程序的需要,并表明優(yōu)化過程已經(jīng)完成。
技巧3 – 使用正確的工具進行測量
如果沒有正確的測量工具,優(yōu)化系統(tǒng)可能會非常困難。如果沒有準(zhǔn)確的方法來測量系統(tǒng)和微控制器的能量消耗,就無法進行能量優(yōu)化。在許多情況下,團隊無法將這兩種不同的能量測量值分開,并在微控制器能量無法降低時嘗試將其最小化。如果沒有可以準(zhǔn)確測量或允許嵌入式開發(fā)人員查看系統(tǒng)行為的工具,那么嘗試優(yōu)化系統(tǒng)是沒有意義的。
技巧4 – 使用優(yōu)化工具
嵌入式軟件可以在許多領(lǐng)域進行優(yōu)化,以減少代碼大小或提高性能,在某些情況下,可以使用單獨的或附加的工具鏈來執(zhí)行優(yōu)化。一個示例優(yōu)化工具是 Somnium DRT 優(yōu)化器,可與 GCC 一起使用以優(yōu)化代碼大小、能源使用和性能。有時可能不需要外部工具,而只是選擇正確的工具鏈。
技巧5 – 使用編譯器屬性和#pragma
更改編譯器,開發(fā)人員突然不得不返回并重新處理所有這些代碼行。屬性和#pragmas 通常是不可移植的,并且在更改編譯器時可能導(dǎo)致軟件錯誤。但是,在微調(diào)嵌入式軟件時,開發(fā)人員通常別無選擇。使用屬性和#pragma 可以提高速度,選擇性地將優(yōu)化應(yīng)用于單個函數(shù)等等。因此,出于這些原因,打算優(yōu)化軟件的開發(fā)人員應(yīng)該熟悉它們,同時閱讀用 C 編寫可移植優(yōu)化,這樣他們就能明白自己是如何寫出仍然可移植的優(yōu)化。
技巧6 – 不要猶豫去嘗試
優(yōu)化系統(tǒng)沒有一成不變的做法,嵌入式開發(fā)人員不應(yīng)該感到受限于遵循任何技術(shù)。有時學(xué)習(xí)和優(yōu)化系統(tǒng)的最佳方法是將實驗放在一起,然后看看會發(fā)生什么。通過實驗和記錄結(jié)果,能夠弄清楚什么有效,什么無效,什么是資源和時間的浪費。一個簡單的例子是如何充分利用 printf。
通過嘗試不同的驅(qū)動程序模型,有一些方法可以顯著提高開發(fā)人員在使用 printf 時獲得的實時性能,這通常被認(rèn)為比實際情況要好得多。
技巧7 – 深入了解編譯器生成的指令
在一些資源極度受限的應(yīng)用程序中,有時開發(fā)人員只需要深入研究編譯器生成的指令。選擇三元運算符而不是 if/else 可能是正在執(zhí)行的三個或四個額外指令之間的差異,這會導(dǎo)致應(yīng)用程序崩潰。雖然 C 等語言是標(biāo)準(zhǔn)語言,但每個編譯器優(yōu)化和生成機器指令的方式略有不同,了解編譯器在做什么的唯一真正方法是查看程序集。
結(jié)論
應(yīng)用程序的優(yōu)化需求將大不相同,一些小批量生產(chǎn)的應(yīng)用程序可能根本不需要優(yōu)化。在其他情況下,納安的每個時鐘周期都很重要,可能會花費大量時間來試圖從系統(tǒng)中榨取每一滴性能或能量。雖然每個系統(tǒng)都不同,但這些技巧為嵌入式開發(fā)人員和團隊提供了一個起點,可以讓他們走上更高效的系統(tǒng)之路。