電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 23|回復(fù): 0
收起左側(cè)

如何提升單片機(jī)代碼執(zhí)行效率?

[復(fù)制鏈接]

613

主題

613

帖子

1765

積分

三級會員

Rank: 3Rank: 3

積分
1765
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 昨天 08:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
提升單片機(jī)代碼執(zhí)行效率并不是一個單一的優(yōu)化操作,而是一個多層次、多角度的過程。

歸納一下,這其中不僅涉及代碼結(jié)構(gòu)和算法的優(yōu)化,還包括編譯器設(shè)置的調(diào)優(yōu)、硬件特性的充分利用、內(nèi)存管理的精細(xì)化、以及在任務(wù)調(diào)度上的科學(xué)分配。



1
精簡代碼與算法優(yōu)化
代碼效率首先源自算法本身,減少不必要的計(jì)算與循環(huán)次數(shù)是關(guān)鍵。這里有幾個常用的策略:
  • 選擇合適的數(shù)據(jù)類型:在單片機(jī)(尤其是內(nèi)存資源受限的MCU)中,盡量選擇最小的數(shù)據(jù)類型。例如,用uint8_t代替int存儲小數(shù)值,因?yàn)檩^小的數(shù)據(jù)類型不僅占用內(nèi)存少,處理速度也快。
  • 使用位運(yùn)算替代常規(guī)運(yùn)算:位運(yùn)算在單片機(jī)中執(zhí)行速度快且耗能低。對于多次乘除2、4、8之類的操作,直接用移位來實(shí)現(xiàn)會更高效,例如x >> 1比x / 2更快。
  • 減少函數(shù)調(diào)用開銷:在頻繁調(diào)用的地方,考慮將小函數(shù)內(nèi)聯(lián)(inline),避免頻繁的棧操作和指令跳轉(zhuǎn)。此外,減少遞歸,使用迭代替代遞歸,避免在嵌入式系統(tǒng)中耗費(fèi)寶貴的?臻g。
  • 使用查表法:對于一些需要頻繁計(jì)算的值,可以提前將它們存儲在查找表中,讀取效率會比實(shí)時(shí)計(jì)算更高,例如正弦、余弦等運(yùn)算,直接讀取表值往往更快。

    2
    善用編譯優(yōu)化
    單片機(jī)的編譯器通常提供各種優(yōu)化選項(xiàng),但也有一些需要注意的權(quán)衡:
  • 優(yōu)化等級選擇:大部分編譯器有不同的優(yōu)化級別(如-O1, -O2, -Os)。-O2一般在速度和大小間找到一個折中,而-Os會特別壓縮代碼體積。實(shí)際選擇時(shí),可以針對性能和存儲需求分別嘗試不同優(yōu)化等級,看哪個適合項(xiàng)目需求。
  • 避免不必要的“volatile”:volatile告訴編譯器不優(yōu)化相關(guān)代碼,但在頻繁訪問的變量上使用volatile會影響性能。因此,在寄存器操作和中斷處理以外,避免給變量加volatile修飾,以減少額外的內(nèi)存訪問。
  • 啟用鏈?zhǔn)奖磉_(dá)式:利用編譯器的鏈?zhǔn)奖磉_(dá)式(例如GCC的-fstrict-aliasing)可以讓編譯器優(yōu)化相鄰變量的內(nèi)存布局,使得數(shù)據(jù)讀取更為高效。

    3
    利用硬件特性
    許多單片機(jī)都有一些特殊的硬件加速特性,善加利用可以大大提升執(zhí)行效率:
  • DMA(直接存儲器訪問):許多MCU支持DMA,它可以在不占用CPU的情況下傳輸數(shù)據(jù)。通過DMA處理大批量數(shù)據(jù)傳輸(如ADC讀取數(shù)據(jù)到內(nèi)存),可以在不打斷CPU執(zhí)行的前提下完成數(shù)據(jù)移動。
  • 硬件外設(shè):例如,使用單片機(jī)的定時(shí)器進(jìn)行精確延時(shí),而不是用for循環(huán)消耗CPU;如果有CRC校驗(yàn)?zāi)K,可以直接利用而非編寫復(fù)雜的算法計(jì)算。
  • 多通道ADC和PWM:在傳感器數(shù)據(jù)采集或電機(jī)控制等應(yīng)用中,使用多通道ADC和PWM模塊可以實(shí)現(xiàn)并行采集和輸出,減少等待時(shí)間。

    4
    精品專欄控制流程與任務(wù)分配
    代碼執(zhí)行的瓶頸常常出現(xiàn)在控制流程和任務(wù)調(diào)度上,以下幾種策略能幫助優(yōu)化:
  • 中斷優(yōu)先級合理設(shè)置:使用中斷來處理時(shí)間敏感的任務(wù),避免輪詢。并且,在一些實(shí)時(shí)性要求高的場景下,可以適當(dāng)調(diào)整中斷優(yōu)先級,確保關(guān)鍵中斷優(yōu)先得到響應(yīng)。
  • 優(yōu)化任務(wù)調(diào)度:如果使用RTOS,合理配置任務(wù)優(yōu)先級和堆棧大小,避免上下文切換過于頻繁。并且盡量避免高頻任務(wù)阻塞CPU,確保每個任務(wù)在合適的時(shí)間片內(nèi)完成。
  • 避免長時(shí)間占用總線:單片機(jī)上的I/O總線訪問較慢,盡量避免長時(shí)間的I/O操作。比如可以將數(shù)據(jù)批量緩存,待CPU空閑時(shí)集中處理,從而更好地分配CPU時(shí)間。

    5
    關(guān)注內(nèi)存與緩存
    內(nèi)存資源的使用也會影響代碼執(zhí)行效率,以下是幾種優(yōu)化內(nèi)存的方法:
  • 靜態(tài)內(nèi)存分配:在RAM較小的系統(tǒng)中,盡量避免使用動態(tài)內(nèi)存分配,改用全局或靜態(tài)變量。動態(tài)分配(如malloc)不僅消耗資源,還增加了碎片化的風(fēng)險(xiǎn)。
  • Cache優(yōu)化:雖然大部分MCU沒有專用的L1、L2緩存,但一些高端單片機(jī)(如ARM Cortex-M7)可能帶有數(shù)據(jù)和指令緩存。要合理規(guī)劃數(shù)據(jù)結(jié)構(gòu),使訪問的內(nèi)存區(qū)域集中,以便更有效利用緩存。

    6
    常見開發(fā)誤區(qū)與小技巧
    提升代碼效率往往是對細(xì)節(jié)的把握。這里是一些容易忽略的小技巧:
  • 合理使用調(diào)試功能:許多開發(fā)者會將調(diào)試代碼留在正式代碼中,像printf一類的函數(shù)會拖慢執(zhí)行速度?梢詫⒄{(diào)試代碼通過宏定義包裹,便于調(diào)試開關(guān)。
  • 注意功耗與性能的平衡:在電池供電的單片機(jī)應(yīng)用中,功耗與執(zhí)行效率的平衡十分關(guān)鍵?梢岳肕CU的低功耗模式,或在不使用時(shí)關(guān)閉外設(shè)(如UART、ADC等)來降低能耗。
  • 頻率與電壓調(diào)整:很多MCU允許動態(tài)調(diào)整工作頻率和電壓,可以根據(jù)當(dāng)前任務(wù)的需求動態(tài)調(diào)整。例如在空閑時(shí)降頻,節(jié)省功耗;在高計(jì)算負(fù)載時(shí)提升頻率,提高處理能力。

    經(jīng)過這些綜合優(yōu)化,你的單片機(jī)代碼執(zhí)行效率一定能顯著提升,同時(shí)讓整體系統(tǒng)更加流暢高效。


    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    關(guān)閉

    站長推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表