首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言嵌入式系統性能優化實戰指南

     編輯:關於C語言

前言

嵌入式系統資源受限,性能優化往往決定產品成敗。遵循「二八原則」:20% 的代碼消耗 80% 運行時間,優化重點應集中在熱點路徑。本文總結五大優化技術。

1. 善用宏定義替代小函數

宏展開無函數調用開銷,適合極簡操作。但宏非函數,需注意參數副作用與括號保護。

錯誤寫法

#define MIN(A,B) (A <= B ? A : B)

正確寫法

#define MIN(A,B) ((A) <= (B) ? (A) : (B))

副作用陷阱

least = MIN(*p++, b);  // 展開為 ((*p++) <= (b) ? (*p++) : (b))  → p 可能自增兩次!

原則:絕不向宏傳遞有副作用的表達式(如 i++、函數調用)。

2. 使用寄存器變量

register 關鍵字建議編譯器將變量存入 CPU 寄存器,減少內存訪問。適用於循環計數器、頻繁讀寫的局部變量。

WORD Addition(BYTE n) {
    register int i, s = 0;
    for (i = 1; i <= n; i++) s += i;
    return s;
}

限制:僅限局部自動變量與參數;register 只是建議,編譯器可能忽略;不能取地址(&var 非法)。

3. 關鍵路徑內嵌匯編

對時間極其敏感的代碼段(如中斷服務程序、DSP 運算),可用內嵌匯編手工優化指令流水線、利用特殊指令集。

int result;
void Add(long a, long *b) {
    _asm {
        MOV AX, a
        MOV BX, b
        ADD AX, [BX]
        MOV result, AX
    }
}

代價:開發調試難度大、可移植性差、維護成本高。僅在證實為瓶頸且高級語言無法滿足時使用。

4. 充分利用硬件特性

  • 指令獲取優化:啟動時將 Flash/ROM 代碼拷貝至 RAM 執行(RAM 讀取速度 ≫ Flash)。
  • 中斷頻率控制:UART 等設備設置接收緩衝區水位觸發中斷,避免逐字節中斷淹沒 CPU。
  • DMA 傳輸:大塊數據傳輸優先用 DMA,釋放 CPU 並行處理其他任務。

5. 靈活運用位運算

位運算指令週期遠小於乘除法,可替換 2 的冪次乘除模運算。

乘除法替換

/* 方法1:乘除 */
i = 879 / 16;      // 除以 2^4
j = 562 % 32;      // 模 2^5

/* 方法2:位運算 */
i = 879 >> 4;      // 右移 4 位
j = 562 - (562 >> 5 << 5); // 或 j = 562 & 0x1F

硬件寄存器位操作模式

#define INT_I2_MASK 0x0040
// 開中斷:清零該位
wTemp = inword(INT_MASK);
outword(INT_MASK, wTemp & ~INT_I2_MASK);

// 關中斷:置位該位
outword(INT_MASK, wTemp | INT_I2_MASK);

// 判斷中斷狀態
if (wTemp & INT_I2_MASK) { /* 中斷被屏蔽 */ }

總結

  1. 聚焦熱點 20% 代碼,避免過度優化。
  2. 宏定義快但危險,嚴防副作用;期待 C 內聯函數普及。
  3. 寄存器變量、內嵌匯編、位運算是利器,需結合硬件手冊使用。
  4. 硬件層面優化(DMA、中斷合併、代碼搬運)往往收益超過純軟件技巧。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved