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

單片機(jī)入門教程第14課-單片機(jī)指令(七)

單片機(jī)系統(tǒng)開發(fā)設(shè)計(jì)的七大規(guī)則
使用51單片機(jī)驅(qū)動(dòng)七段LED數(shù)碼管的代碼免費(fèi)下載

新唐單片機(jī)代碼評(píng)審總結(jié)

評(píng)論