單片機的程序比軟開少一些,真正想編寫出高效的代碼,還是要積累很多年的。
在做研發(fā)工程師的10年里,我經(jīng)歷過幾個公司,看過很多工程師寫的代碼,但真正能讓我跪著看完的,極少。哪怕是大廠工程師,也會有讓人笑掉大牙的代碼。
高效的背后,有很多學問,需要有一定的數(shù)學功底,對編譯器有較深的了解,懂匯編。
具備這些能力,寫出來的代碼,才能讓cpu執(zhí)行這段代碼所花費的時間,以及占用的ROM和RAM資源更少。
然而,如果把項目每個細節(jié),都優(yōu)化到高效的程度,花費的時間,是平時的兩倍。
所以,我們在做項目時,一般只優(yōu)化核心功能,才能趕上項目的進度,除非經(jīng)驗相當豐富。
下面分享幾點高效代碼的技巧:1.使用位操作代替算術操作,因為位操作更快。
還有就是用左移、右移替代乘除法。 比如a=b*256,可以改成a = b<<8 比如a=b/256,可以改成a = b>>8
2.避免不必要的操作去除代碼中不必要的操作,如多余的變量賦值、函數(shù)調用等。
3.控制數(shù)據(jù)類型大小特別是盡量別用float,浮點運算通常需要更多的CPU周期和內存空間,因為浮點數(shù)的表示和運算比整數(shù)復雜,除非單片機內置了硬件浮點單元(FPU)。 能用unsigned就不用signed,無符號整數(shù)的運算可能比有符號整數(shù)更快,因為不需要處理符號位。 能用char就不用int,較小的數(shù)據(jù)類型在處理和傳輸時更快,因為它們占用的內存和帶寬更少。特別對于存儲大量數(shù)據(jù)的數(shù)組或緩沖區(qū),使用 char 類型可以顯著減少內存占用。
4.利用硬件資源比如說STM32單片機,可以利用DMA傳輸數(shù)據(jù),減少CPU負載。 5.代碼重用 一些重復的代碼,通過函數(shù)或宏來重用代碼。
6.自加、自減指令用i--、i-=1、i++、i+=1、去替代i = i-1,i=i+1的操作,有些編譯器對前者進行了優(yōu)化,效率更高。 7.優(yōu)化算法以計算1到100的和為例。 我們可能會首先想到使用循環(huán),來寫程序:
這種方法雖然直觀,但在效率上可能不是最優(yōu)的。那怎么去優(yōu)化?這時候就要考驗工程師的數(shù)學功底了。 可以根據(jù)等差數(shù)列求和公式,1到100的和可以表示為:
n是序列的最后一項,即100。將這個公式應用到代碼中:
對以上兩種實現(xiàn)代碼的總結:盡管程序都能得到相同的結果,但是第二種方法在運行效率上明顯優(yōu)于第一種。因為它避免了循環(huán)的開銷,直接通過數(shù)學公式計算出結果。 在編寫單片機代碼時,盡量通過數(shù)學方法,或其他算法技巧,提高程序的執(zhí)行效率。 這不僅可以減少了CPU的計算時間,還能減少程序占用的內存空間,從而提高整體性能。
插個題外話,之前很多老鐵問我,數(shù)學不好,可以學單片機嗎?
我覺得這就是一個很好的例子,數(shù)學不是門檻,而是天花板。
第一種實現(xiàn)方式,是小學算數(shù)低,但效率低。
第二種,則需要一定的數(shù)學能力,但效率高。
那同樣都能實現(xiàn)功能,效率低點就低點唄,有什么所謂?
其實這個會間接影響到硬件成本。
比如數(shù)學功底好的,可以用低端單片機去實現(xiàn)功能,而數(shù)學功底不好的,寫出來代碼效率低,則需要性能更強的單片機支撐。
不過,很多產品,對效率的要求并沒這么苛刻,哪怕用第一種方式,照樣沒問題。
-
單片機
+關注
關注
6035文章
44554瀏覽量
634614 -
程序
+關注
關注
117文章
3785瀏覽量
81001 -
代碼
+關注
關注
30文章
4779瀏覽量
68521
原文標題:讓單片機代碼性能起飛的七大技巧,從位操作到算法優(yōu)化
文章出處:【微信號:nanshuqg,微信公眾號:無際單片機編程】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論