技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 一文搞懂單片機程序該如何優(yōu)化

一文搞懂單片機程序該如何優(yōu)化

時間:2025-10-13 14:11:59來源:21ic電子網(wǎng)

導語:?對程序進行優(yōu)化,通常是指優(yōu)化程序代碼或程序執(zhí)行速度。優(yōu)化代碼和優(yōu)化速度實際上是一個予盾的統(tǒng)一。一般是優(yōu)化了代碼的尺寸,就會帶來執(zhí)行時間的增加;如果優(yōu)化了程序的執(zhí)行速度,通常會帶來代碼增加的副作用。很難魚與熊掌兼得,只能在設(shè)計時掌握一個平衡點。

  01

  程序結(jié)構(gòu)的優(yōu)化

  1、程序的書寫結(jié)構(gòu)

  雖然書寫格式并不會影響生成的代碼質(zhì)量,但是在實際編寫程序時還是應該尊循一定的書寫規(guī)則,一個書寫清晰、明了的程序,有利于以后的維護。在書寫程序時,特別是對于While、for、do…while、if…else、switch…case 等語句或這些語句嵌套組合時,應采用“縮格”的書寫形式。

  2、標識符

  程序中使用的用戶標識符除要遵循標識符的命名規(guī)則以外,一般不要用代數(shù)符號(如a、b、x1、y1)作為變量名,應選取具有相關(guān)含義的英文單詞(或縮寫)或漢語拼音作為標識符,以增加程序的可讀性,如:count、number1、red、work 等。

  3、程序結(jié)構(gòu)

  C 語言是一種高級程序設(shè)計語言,提供了十分完備的規(guī)范化流程控制結(jié)構(gòu)。因此在采用C 語言設(shè)計單片機應用系統(tǒng)程序時,首先要注意盡可能采用結(jié)構(gòu)化的程序設(shè)計方法,這樣可使整個應用系統(tǒng)程序結(jié)構(gòu)清晰,便于調(diào)試和維護。

  對于一個較大的應用程序,通常將整個程序按功能分成若干個模塊,不同模塊完成不同的功能。各個模塊可以分別編寫,甚至還可以由不同的程序員編寫,一般單個模塊完成的功能較為簡單,設(shè)計和調(diào)試也相對容易一些。在C 語言中,一個函數(shù)就可以認為是一個模塊。

  所謂程序模塊化,不僅是要將整個程序劃分成若干個功能模塊,更重要的是,還應該注意保持各個模塊之間變量的相對獨立性,即保持模塊的獨立性,盡量少使用全局變量等。對于一些常用的功能模塊,還可以封裝為一個應用程序庫,以便需要時可以直接調(diào)用。但是在使用模塊化時,如果將模塊分成太細太小,又會導致程序的執(zhí)行效率變低(進入和退出一個函數(shù)時保護和恢復寄存器占用了一些時間)。

  4、定義常數(shù)

  在程序化設(shè)計過程中,對于經(jīng)常使用的一些常數(shù),如果將它直接寫到程序中去,一旦常數(shù)的數(shù)值發(fā)生變化,就必須逐個找出程序中所有的常數(shù),并逐一進行修改,這樣必然會降低程序的可維護性。因此,應盡量當采用預處理命令方式來定義常數(shù),而且還可以避免輸入錯誤。

  5、減少判斷語句

  能夠使用條件編譯(ifdef)的地方就使用條件編譯而不使用if 語句,有利于減少編譯生成的代碼的長度。

  6、表達式

  對于一個表達式中各種運算執(zhí)行的優(yōu)先順序不太明確或容易混淆的地方,應當采用圓括號明確指定它們的優(yōu)先順序。一個表達式通常不能寫得太復雜,如果表達式太復雜,時間久了以后,自己也不容易看得懂,不利于以后的維護。

  7、函數(shù)

  對于程序中的函數(shù),在使用之前,應對函數(shù)的類型進行說明,對函數(shù)類型的說明必須保證它與原來定義的函數(shù)類型一致,對于沒有參數(shù)和沒有返回值類型的函數(shù)應加上“void”說明。如果果需要縮短代碼的長度,可以將程序中一些公共的程序段定義為函數(shù)。如果需要縮短程序的執(zhí)行時間,在程序調(diào)試結(jié)束后,將部分函數(shù)用宏定義來代替。注意,應該在程序調(diào)試結(jié)束后再定義宏,因為大多數(shù)編譯系統(tǒng)在宏展開之后才會報錯,這樣會增加排錯的難度。

  8、盡量少用全局變量,多用局部變量

  因為全局變量是放在數(shù)據(jù)存儲器中,定義一個全局變量,MCU 就少一個可以利用的數(shù)據(jù)存儲器空間,如果定義了太多的全局變量,會導致編譯器無足夠的內(nèi)存可以分配;而局部變量大多定位于MCU 內(nèi)部的寄存器中,在絕大多數(shù)MCU 中,使用寄存器操作速度比數(shù)據(jù)存儲器快,指令也更多更靈活,有利于生成質(zhì)量更高的代碼,而且局部變量所的占用的寄存器和數(shù)據(jù)存儲器在不同的模塊中可以重復利用。

  9、設(shè)定合適的編譯程序選項

  許多編譯程序有幾種不同的優(yōu)化選項,在使用前應理解各優(yōu)化選項的含義,然后選用最合適的一種優(yōu)化方式。通常情況下一旦選用最高級優(yōu)化,編譯程序會近乎病態(tài)地追求代碼優(yōu)化,可能會影響程序的正確性,導致程序運行出錯。因此應熟悉所使用的編譯器,應知道哪些參數(shù)在優(yōu)化時會受到影響,哪些參數(shù)不會受到影響。

  02

  代碼的優(yōu)化

  1、選擇合適的算法和數(shù)據(jù)結(jié)構(gòu)

  應熟悉算法語言。將比較慢的順序查找法用較快的二分查找法或亂序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,這樣可以大大提高程序執(zhí)行的效率。

  選擇一種合適的數(shù)據(jù)結(jié)構(gòu)也很重要,比如在一堆隨機存放的數(shù)據(jù)中使用了大量的插入和刪除指令,比使用鏈表要快得多。數(shù)組與指針具有十分密切的關(guān)系,一般來說指針比較靈活簡潔,而數(shù)組則比較直觀,容易理解。對于大部分分的編譯器,使用指針比使用數(shù)組生成的代碼更短,執(zhí)行效率更高。

  但是在Keil 中則相反,使用數(shù)組比使用的指針生成的代碼更短。

  2、使用盡量小的數(shù)據(jù)類型

  能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。當然,在定義變量后不要超過變量的作用范圍,如果超過變量的范圍賦值,C 編譯器并不報錯,但程序運行結(jié)果卻錯了,而且這樣的錯誤很難發(fā)現(xiàn)。

  3、使用自加、自減指令

  通常使用自加、自減指令和復合賦值表達式(如a-=1 及a+=1 等)都能夠生成高質(zhì)量的程序代碼,編譯器通常都能夠生成inc 和dec 之類的指令,而使用a=a+1 或a=a-1之類的指令,有很多C 編譯器都會生成2~3個字節(jié)的指令。

  4、減少運算的強度

  可以使用運算量小但功能相同的表達式替換原來復雜的的表達式。

  在單片機開發(fā)中優(yōu)化代碼是一個重要的環(huán)節(jié),它可以幫助提高程序的運行效率,減少資源消耗,并提升整體性能。以下是一些優(yōu)化代碼的方法:

  1. 代碼精簡:避免冗余代碼,去除不必要的注釋和未使用的變量,這樣可以減少程序的體積,降低內(nèi)存占用。

  2. 算法優(yōu)化:選擇高效的算法和數(shù)據(jù)結(jié)構(gòu),減少不必要的計算和內(nèi)存操作,尤其是在處理復雜邏輯時,優(yōu)化算法可以顯著提升性能。

  3. 循環(huán)優(yōu)化:在循環(huán)中避免使用復雜的計算和函數(shù)調(diào)用,盡量使用簡單的操作,這樣可以減少每次迭代的執(zhí)行時間。

  4. 中斷服務程序優(yōu)化:中斷服務程序應該盡可能簡短,避免在中斷中執(zhí)行耗時的操作,這樣可以減少中斷響應時間。

  5. 位操作:在處理位級操作時,使用位操作符(如位與、位或、位異或等)可以比使用算術(shù)操作更快。

  6. 使用宏定義:對于常量值和重復的代碼塊,使用宏定義可以減少代碼量,并且提高代碼的可讀性。

  7. 內(nèi)存管理:合理分配內(nèi)存,避免內(nèi)存泄漏和不必要的內(nèi)存分配,這樣可以提高內(nèi)存使用效率。

  8. 條件編譯:使用條件編譯指令來排除調(diào)試代碼或者在不同配置下選擇不同的代碼執(zhí)行路徑。

  9. 代碼重構(gòu):定期對代碼進行重構(gòu),以提高代碼的可維護性和可擴展性,同時去除代碼中的壞味道。

  10. 性能分析:使用性能分析工具來識別程序中的瓶頸,針對性地進行優(yōu)化。

  我們可以通過以下幾個方面實現(xiàn)代碼的簡化和高效。

  1、使用模塊化結(jié)構(gòu):分解功能塊

  模塊化編程讓代碼更清晰,并能提高代碼的復用性。

  例如,對于電子時鐘程序,可以將代碼分為顯示模塊、按鍵處理模塊、計時模塊、定時器中斷服務程序等。

  每個模塊處理相對獨立的任務,這樣既能減少代碼重復,也便于維護和調(diào)試。

  計時模塊:利用單片機的定時器,精確控制時鐘的秒脈沖。

  顯示模塊:用循環(huán)或查表法來實現(xiàn)不同的時間顯示,這能減少不必要的分支跳轉(zhuǎn)指令。

  按鍵模塊:按鍵去抖和按鍵事件處理可以用一個中斷和簡單的邏輯實現(xiàn),而不是每個按鍵都獨立編寫邏輯。

  2、指令優(yōu)化與循環(huán)結(jié)構(gòu)

  在匯編中,循環(huán)和條件跳轉(zhuǎn)往往會消耗更多指令周期,因此優(yōu)化循環(huán)結(jié)構(gòu)和減少分支跳轉(zhuǎn)很關(guān)鍵。

  例如:

  查表法:可以用查表代替復雜的計算或條件判斷,例如在秒數(shù)到分的進位處理時,通過預設(shè)查表減少計算操作。

  延遲程序優(yōu)化:如果需要用延遲實現(xiàn)定時,可以考慮定時器中斷而非簡單的循環(huán)延時。循環(huán)延時不僅增加代碼量,運行效率也低。

  3、利用宏指令和子程序

  宏指令和子程序能夠節(jié)省代碼行數(shù)并提高復用性。

  在匯編中,你可以把常用的指令集合定義成宏或子程序,如數(shù)碼管的顯示刷新代碼,每次需要時直接調(diào)用即可,避免重復編寫。

  宏指令:編寫重復代碼塊時,把它封裝為宏指令,并用傳參簡化,比如顯示數(shù)字(數(shù)碼管號, 數(shù)值)。這樣能讓代碼更簡潔。

  子程序調(diào)用:像時鐘顯示刷新這種邏輯,可以寫成子程序調(diào)用。每次調(diào)用完后程序自動返回,避免重復書寫。

  4、巧用單片機的硬件資源

  單片機自帶一些硬件資源可以幫助簡化代碼、提升效率。

  可以用硬件定時器實現(xiàn)秒脈沖的計數(shù),這樣省去大量延時循環(huán)。

  比如按鍵去抖和計時邏輯,可以通過中斷方式來完成,在中斷服務程序中處理各個事件,而不需要在主程序里繁瑣地處理。

  例如某些單片機的寄存器可以直接進行簡單運算,而不需要額外指令,提高執(zhí)行效率。

  5、精簡指令和內(nèi)存管理

  盡量減少多余的指令,充分利用寄存器,避免頻繁的數(shù)據(jù)搬移指令。

  例如:

  常量操作優(yōu)化:對固定數(shù)值的操作,可以通過寄存器直接操作。比如固定加1操作可以用自增指令,而不是多步加法。

  數(shù)據(jù)段和代碼段優(yōu)化:減少不必要的數(shù)據(jù)搬移,盡量將頻繁用到的數(shù)據(jù)放在CPU易訪問的內(nèi)存區(qū)域。

  6、調(diào)試與性能測試

  因為匯編程序編寫的核心就是“效率優(yōu)先”,在程序?qū)懞煤?,調(diào)試和優(yōu)化就尤為重要。

  你可以用以下方法來測試和優(yōu)化性能:

  逐步測試:各個模塊分別調(diào)試,確保它們的功能和性能,最后再把各個模塊組合在一起。

  耗時分析:分析程序在哪些地方消耗了較多指令,是否可以進一步優(yōu)化。用硬件調(diào)試工具分析時鐘頻率和響應時間也非常有效。

  代碼的行數(shù)多并不一定意味著效率低。

  關(guān)鍵在于寫代碼時避免冗余,靈活運用模塊化設(shè)計和單片機資源。

  最終程序既要高效運轉(zhuǎn),又不失結(jié)構(gòu)清晰。

標簽: 工控機

點贊

分享到:

上一篇:方形電池是什么?方形電池和圓...

下一篇:二次鋰電池組是什么,一次電...

傳動網(wǎng)版權(quán)與免責聲明:凡本網(wǎng)注明[來源:傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為傳動網(wǎng)(surachana.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責任。

網(wǎng)站簡介|會員服務|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務平臺

網(wǎng)站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號