在MCU工程中優化CPU工作效率的幾種方法

在嵌入式系統開發中,優化 CPU 工作效率對于提升系統性能、降低功耗、提高實時性至關重要。Keil 作為主流的嵌入式開發工具,提供了多種優化策略,包括 關鍵字使用、內存管理、字節對齊、算法優化 等。本文將從多個方面介紹如何在 Keil 工程中優化 CPU 運行效率。

一、關鍵字優化

1. 使用 static 關鍵字

  • 減少棧操作:static 變量存放在 靜態存儲區,避免函數調用時頻繁創建和銷毀局部變量,減少 CPU 訪問棧的開銷。

  • 優化函數調用:static 限定函數作用域,編譯器可以優化調用方式,如內聯優化或刪除未使用的函數。

示例:

static int counter = 0;  // 避免頻繁創建局部變量,提升性能

2. 使用 inline 關鍵字

  • 減少函數調用開銷:對于小的、頻繁調用的函數,使用 inline 讓編譯器展開函數,減少棧操作,提高執行效率。

示例:

inline int add(int a, int b) {return a + b;  // 直接展開,提高性能
}

3. 使用 const 關鍵字

  • 優化編譯器優化空間:const 變量不會被修改,編譯器可將其優化為常量表達式,減少 RAM 訪問,提高指令執行效率。

  • 避免全局變量占用 RAM:const 變量通常存儲在 Flash(只讀存儲區),減少 RAM 使用,提高運行效率。

示例:

const uint32_t baud_rate = 115200;  // 存放在 Flash 中,減少 RAM 占用

4. 使用 volatile 關鍵字

  • 防止編譯器優化:適用于 寄存器變量、外設寄存器、共享變量,避免編譯器優化導致的錯誤,確保每次都從實際地址讀取值。

  • 適用于中斷變量、硬件寄存器訪問等場景。

示例:

volatile uint8_t flag = 0;  // 確保每次讀取的值都是最新的

二、字節對齊(結構體優化)

嵌入式系統中,結構體成員若未對齊,CPU 可能需要額外的 總線周期 讀取數據,從而降低效率。

1. 使用 attribute((aligned(n))) 或 #pragma pack(n)

#pragma pack(4)  // 4字節對齊
typedef struct {uint32_t id;uint16_t value;uint8_t flag;
} __attribute__((aligned(4))) my_struct_t;
#pragma pack()
  • 盡量讓結構體成員按 32-bit (4字節) 對齊,提高訪問效率。

  • 結構體字段按照 uint32_t -> uint16_t -> uint8_t 順序排列,避免填充字節,減少存儲空間浪費。

三、內存管理優化

1. 減少堆(heap)使用

  • malloc/free 開銷大,容易導致碎片化,應避免在 實時任務 或 中斷 中使用。

  • 優先使用靜態內存 (static 變量) 代替堆內存分配,提高執行效率。

2. 使用 DMA(直接存儲訪問)

  • 減少 CPU 負擔,使用 DMA 傳輸數據(如 UART、SPI、I2C),CPU 僅需觸發 DMA 傳輸,不用參與整個數據搬運過程。

  • 適用于大數據量傳輸場景,如傳感器數據讀取、LCD 屏幕刷新等。

四、指令優化(算法層面)

1. 使用位運算代替乘除法

>> 代替除法,<< 代替乘法,減少 CPU 指令執行時間。

int x = a * 8;   // 慢
int y = a << 3;  // 快

2. 使用查表法

預計算常用值 存入查找表(LUT),避免實時計算,如 sin() 和 cos()。

const uint8_t sine_table[256] = { /* 預計算數據 */ };
uint8_t value = sine_table[angle];  // 直接查表,提高效率

3. 使用循環展開

for (int i = 0; i < 4; i++) {sum += arr[i];  // 常規循環
}// 進行循環展開
sum = arr[0] + arr[1] + arr[2] + arr[3];  // 提高 CPU 指令并行度

4. 減少浮點運算

  • 浮點運算 (float) 比整數運算 (int) 慢,盡量使用整數計算。

  • 使用 fixed-point 計算替代浮點計算(如 Q31、Q15 格式)。

五、其他優化措施

1. 使用 O3 級別優化

  • Keil 提供 優化選項 O0 ~ O3,O3 優化級別最高,可自動優化代碼執行效率,但可能影響調試。

  • O2 適用于大多數場景,O3 適用于對性能要求極高的任務。

2. 優化中斷

  • 減少 ISR 執行時間,避免在中斷中執行復雜運算。

  • 使用 __attribute__((interrupt)) 聲明中斷函數,優化編譯器生成的中斷代碼。

3. 使用 CMSIS 和 ARM DSP 庫

  • ARM 提供的 CMSIS-DSP 和 CMSIS-NN 庫 對 Cortex-M 內核進行了優化,加速數學運算。

  • 例如,使用 arm_math.h 中的 arm_sqrt_f32() 計算平方根,比 sqrt() 更快。


總結

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899597.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899597.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統下C語言fork函數使用案例

一、fork函數的作用 生成一個子進程&#xff0c;異步執行某個任務&#xff1b; 二、子進程的作用 1、子進程能復制一份父進程的變量、函數&#xff1b; 2、子進程可以和父進程同時并發執行&#xff1b; 函數語法&#xff1a; pid_t fork() 說明&#xff1a;調用后返回一個進程…

MySQL中的CREATE TABLE LIKE和CREATE TABLE SELECT

MySQL中的CREATE TABLE LIKE和CREATE TABLE SELECT CREATE TABLE LIKECREATE TABLE SELECT CREATE TABLE LIKE CREATE TABLE ... LIKE可以用來復制表結構&#xff0c;源表上的索引和約束也會復制。CREATE TABLE ... LIKE不能復制表數據。CREATE TABLE ... LIKE只能復制基表&…

Java開發者指南:深入理解HotStuff新型共識算法

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、全棧領域優質創作者、高級開發工程師、高級信息系統項目管理師、系統架構師&#xff0c;數學與應用數學專業&#xff0c;10年以上多種混合語言開發經驗&#xff0c;從事DICOM醫學影像開發領域多年&#xff0c;熟悉DICOM協議及…

opencv圖像處理之指紋驗證

一、簡介 在當今數字化時代&#xff0c;生物識別技術作為一種安全、便捷的身份驗證方式&#xff0c;正廣泛應用于各個領域。指紋識別作為生物識別技術中的佼佼者&#xff0c;因其獨特性和穩定性&#xff0c;成為了眾多應用場景的首選。今天&#xff0c;我們就來深入探討如何利…

wfs.js之h264轉碼mp4分析

準備源文件 下載源文件 git clone https://github.com/ChihChengYang/wfs.js.git編譯后得到wfs.js這個文件 調用 在demo/index.html中&#xff0c;前端對wfs.js進行了調用 var video1 document.getElementById("video1"), wfs new Wfs(); wfs.attachMedia…

協程 Coroutine

協程是 C20 引入的新特性。 文章目錄 基本概念std::coroutine_handlepromise 類型co_yield 基本用法 優勢異步 TCPco_await 基本概念 協程&#xff08;Coroutine&#xff09;是一種比線程更加輕量級的并發編程模型。協程的調度由程序員手動控制。 異步不是并行&#xff0c;但…

uniapp中的流式輸出

一、完整代碼展示 目前大多數的ai對話都是流式輸出&#xff0c;也就是對話是一個字或者多個字逐一進行顯示的下面是一個完整的流式顯示程序&#xff0c;包含的用戶的消息發出和ai的消息回復 <template><view class"chat-container"><view class&quo…

洛谷題單1-P5703 【深基2.例5】蘋果采購-python-流程圖重構

題目描述 現在需要采購一些蘋果&#xff0c;每名同學都可以分到固定數量的蘋果&#xff0c;并且已經知道了同學的數量&#xff0c;請問需要采購多少個蘋果&#xff1f; 輸入格式 輸入兩個不超過 1 0 9 10^9 109 正整數&#xff0c;分別表示每人分到的數量和同學的人數。 輸…

JS 手撕題高頻考點

前端面試中&#xff0c;JS 手撕題是高頻考點&#xff0c;主要考察 編程能力、算法思維、JS 核心知識。以下是最常見的手撕題分類 代碼示例&#xff1a; 目錄 &#x1f4cc; 1. 手寫函數柯里化&#x1f4cc; 2. 手寫 debounce&#xff08;防抖&#xff09;&#x1f4cc; 3. 手寫…

【STM32】知識點介紹一:硬件知識

文章目錄 一、電源引腳簡介二、電平信號三、電路分析 一、電源引腳簡介 VCC、GND、VDD和VSS是電子電路中常見的術語&#xff0c;代表著不同的電源引腳或電壓。 VCC&#xff08;Voltage at the Common Collector&#xff09;&#xff1a;VCC是指集電極&#xff08;Collector&am…

3. 列表元素替換

【問題描述】給定一個列表&#xff0c;將列表中所有的偶數替換為0 【輸入形式】輸入一行&#xff0c;包含若干個整數&#xff0c;用空格分隔 【輸出形式】輸出替換后的列表&#xff0c;每個元素用空格分隔 【樣例輸入】1 2 3 4 5 6 7 8 9 10 【樣例輸出】1 0 3 0 5 0 7 0 9…

問題的根源還是解題的方案

周末的早上照例是要早醒 debug 代碼的&#xff0c;仿佛又回到了 2014 年… 古人幾天甚至幾個月不洗澡&#xff0c;不會臭嗎&#xff1f;有沒有可能古人沒有化纖類衣服&#xff0c;且古人的純天然生活環境其身體菌群和現代人不同&#xff0c;古人就像健康的野生動物一樣即使不洗…

虛擬機安裝linux系統無法上網的解決方法

在虛擬環境中運行Linux系統時&#xff0c;有時會遇到網絡連接問題&#xff0c;特別是在使用虛擬機軟件如VMware或VirtualBox時。本文將詳細介紹一種針對“虛擬機安裝Linux系統無法上網”問題的解決方案&#xff0c;以CentOS 6.5為例&#xff0c;適用于其他基于NAT模式的虛擬機環…

子網劃分淺度解析

文章目錄 ip地址的組成不同類型ip地址的范圍子網掩碼默認子網掩碼子網掩碼如何作用的&#xff1f;默認子網掩碼怎么作用&#xff1f; ip地址的組成 ip地址一般寫作4位點分十進制&#xff08;x.x.x.x&#xff09;&#xff0c;他們由32位二進制組成&#xff0c;每個x由8位二進制…

什么是 SEO(搜索引擎優化)?

您有網站嗎&#xff0c;或者您正在考慮創建一個網站&#xff1f;您想吸引更多人加入您的業務嗎&#xff1f;如果答案是肯定的&#xff0c;那么毫無疑問&#xff1a;SEO 應該是您營銷工作的一部分。這是建立品牌和吸引用戶訪問您的網站的好方法。但它實際上意味著什么呢&#xf…

鴻蒙HarmonyOS NEXT設備升級應用數據遷移流程

數據遷移是什么 什么是數據遷移&#xff0c;對用戶來講就是本地數據的遷移&#xff0c;終端設備從HarmonyOS 3.1 Release API 9及之前版本&#xff08;單框架&#xff09;遷移到HarmonyOS NEXT&#xff08;雙框架&#xff09;后保證本地數據不丟失。例如&#xff0c;我在某APP…

【現代深度學習技術】現代卷積神經網絡04:含并行連接的網絡(GoogLeNet)

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上&#xff0c;結合當代大數據和大算力的發展而發展出來的。深度學習最重…

【ESP32】ESP32與MQTT通信:實現傳感器數據監測與設備控制

ESP32與MQTT通信 1 項目概覽2 硬件組成3 MQTT協議解析MQTT協議簡介MQTT核心概念本項目中的MQTT應用 4 MQTT Broker選擇EMQX Broker其他常用MQTT Broker 5 代碼解析初始化與配置MQTT消息處理發布傳感器數據 6 MQTT話題TOPIC設計7 EMQX的優勢在IoT項目中的體現8 MQTT通信流程9 應…

[特殊字符]《Curve DAO 系統學習目錄》

本教程旨在系統學習 Curve DAO 項目的整體架構、核心機制、合約設計、治理邏輯與代幣經濟等內容&#xff0c;幫助開發者全面理解其設計理念及運作方式。 目錄總覽&#xff1a; 1. Curve 項目概覽 ? 1.1 Curve 是什么&#xff1f;主要解決什么問題&#xff1f; ? 1.2 與其他…

每天一篇目標檢測文獻(六)——Part One

今天看的是《Object Detection with Deep Learning: A Review》 目錄 一、摘要 1.1 原文 1.2 翻譯 二、介紹 2.1 信息區域選擇 2.2 特征提取 2.3 分類 三、深度學習的簡要回顧 3.1 歷史、誕生、衰落和繁榮 3.2 CNN架構和優勢 一、摘要 1.1 原文 Due to object dete…