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