色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

對嵌入式C語言優化技巧詳細教學

GReq_mcu168 ? 來源:CSDN技術社區 ? 作者:求佛_ce123 ? 2021-04-07 11:30 ? 次閱讀

嵌入式系統是指完成一種或幾種特定功能的計算機系統,具有自動化程度高,響應速度快等優點,目前已廣泛應用于消費電子工業控制等領域。嵌入式系統受其使用的硬件以及運行環境的限制,非常注重代碼的時間和空間效率,因此選擇一種合適的開發語言十分重要。

目前,在嵌入式系統開發中可使用的語言很多,其中 C語言應用得最廣泛。雖然用 C 語言編程具有許多優點,但基于嵌入式系統的C語言和標準 C語言又有很大區別。接下來小編結合嵌入式系統的特點和高手們的一些積累,給大家整理出在程序設計中代碼優化的一些小技巧。

1、嵌入式C語言的特點

作為一種結構化程序設計語言,C 語言兼顧多種高級語言的特點,具有很強的功能性和可移植性。但在嵌入式系統開發中,出于對低價產品的需求,系統的計算能力和存儲容量都非常有限,因此如何利用好這些資源就顯得十分重要。開發人員應注意嵌入式 C語言和標準 C 語言的區別,減少生成代碼長度,提高程序執行效率,在程序設計中對代碼進行優化。

2、C代碼在程序中的優化

現在的 C 編譯器會自動對代碼進行優化,但這些優化是對執行速度和代碼長度的平衡。如果要獲得更小且執行效率更高的代碼,需要程序員手工對代碼進行優化。

3、變量類型的定義

不同的數據類型所生成的機器代碼長度相差很多,變量類型選取的范圍越小運行速度越快,占用的內存越少。能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(long int),能不使用浮點型(float)變量就不要使用浮點型變量。相同類型的數據類型,有無符號對機器代碼長度也有影響。因此我們應按照實際需要合理的選用數據類型。當然,在定義變量后不要超過變量的作用范圍,如果超過變量的范圍賦值,C編譯器并不報錯,但程序運行結果卻錯了,而且這樣的錯誤很難發現。

4、算法優化

算法優化指對程序時空復雜度的優化:在 PC 機上進行程序設計時一般不必過多關注程序代碼的長短,只需考慮功能的實現,但嵌入式系統就必須考慮系統的硬件資源,在程序設計時,應盡量采用生成代碼短的算法,在不影響程序功能實現的情況下優化算法。

5、適當的使用宏

在C程序中使用宏代碼可以提高程序的執行效率。宏代碼本身不是函數,但使用起來像函數。函數調用要使用系統的棧來保存數據,同時 CPU 在函數調用時需要保存和恢復當前的現場,進行進棧和出棧操作,所以函數調用也需要 CPU時間。而宏定義就沒有這個問題:宏定義僅僅作為預先寫好的代碼嵌入到當前程序中,不產生函數調用,所占用的僅僅是一些空間,省去了參數壓棧,生成匯編語言的 call 調用,返回參數,執行 return等過程,從而提高了程序的執行速度。雖然宏破壞了程序的可讀性,使排錯更加麻煩,但對于嵌入式系統,為了達到要求的性能,嵌入代碼常常是必須的做法。

此外,我們還要避免不必要的函數調用,請看下面的代碼:

[plain] view plain copy print?void str_print( char *str ){int i;for ( i = 0; i 《 strlen ( str ); i++ ){ printf(“%c”,str[ i ] ); } }void str_print1 ( char *str ){int len;len = strlen ( str );for ( i = 0; i 《 len; i++ ){printf(“%c”,str[ i ] );}}

請注意,這兩個函數的功能相似。然而,第一個函數調用strlen函數多次,而第二個函數只調用函數strlen一次。因此第二個函數性能明顯比第一個好。

6、內嵌匯編

程序中對時間要求苛刻的部分可以用內嵌匯編來重寫,以帶來速度上的顯著提高。但是,開發和測試匯編代碼是一件辛苦的工作,它將花費更長的時間,因而要慎重選擇要用匯編的部分。在程序中,存在一個80-20原則,即20%的程序消耗了80%的運行時間,因而我們要改進效率,最主要是考慮改進那20%的代碼。

7、提高循環語言的效率

在 C 語言中循環語句使用頻繁,提高循環體效率的基本辦法就是降低循環體的復雜性:

(1) 在多重循環中,應將最長的循環放在最內層,最短的循環放在最外層。這樣可以減少 CPU跨切循環的次數。如例 1-1 的效率比 1-2 的效率要低:

[plain] view plain copy print?for (j = 0; j 《 30; j++){for (i = 0; i 《 10; i++){……}} // 例子 1-1 for (i = 0; i 《 10; i++){for (j = 0; j 《 30; j++) {……}} // 例子 2-2 程序部簡潔但效率高

8、提高 switch 語句的效率

switch 語句是 C 語言中常用的選擇語句, 在編譯時會產生if- else- if 嵌套代碼,并按照順序進行比較,發現匹配時,就跳轉到滿足條件的語句執行。

當 switch 語句中的 case 標號很多時,為了減少比較的次數,可以把發生頻率相對高的條件放到第一位或者把整個 switch 語句轉化嵌套 switch 語句。把發生頻率高的 case 標號放在最外層的 switch 語句中,發生相對頻率相對低的 case 標號放在另外的 switch 語句中。如例 3 中,把發生率高的case 標號放在外層的 switch 語句中,把發生頻率低的放在缺省的(default)內層 switch 語句中。

[plain] view plain copy print? switch (表達式) { case 值1:語句1: break;case 值2:語句2:break; ……/*把發生頻率低的放在內層的switch語句中*/default:switch (表達式) {case 值n:語句n: break;case 值m:語句m: break;……}}例子3 使用嵌套switch語句提高程序執行效率。

9、避免使用標準庫

使用 C語言標準庫可以加快開發進度,但由于標準庫需要設法處理用戶所有可能遇到的情況,所以很多標準庫代碼很大。比如標準庫中的 sprintf函數非常大。這個龐大的代碼中有很大一部分用于處理浮點數,如果程序中不需要格式化浮點數值( 如%f),程序設計人員就可以根據實際情況用少量的代碼實現這個功能。

10、采用數學方法優化程序

數學是計算機之母,沒有數學的依據和基礎,就沒有計算機的發展,所以在編寫程序的時候,采用一些數學方法會對程序的執行效率有數量級的提高。有時候這個問題常常被大家忽略, 對于沒有經驗的程序員來說更是如此。例如:求 1~100 的和:

sum = 100*(100+1)/2;數學公式: (a1 + an)*n/2

使用C語言的位操作可以減少除法和取模的運算。在計算機程序中數據的位是可以操作的最小數據單位,理論上可以用“位運算”來完成所有的運算和操作。因而,靈活的位操作可以有效地提高程序運行的效率。比如用用位操作區代替除法:比如:128 / 8 -》》 128 》》 3;

優化算法和數據結構對提高代碼的效率有很大的幫助。當然有時候時間效率和空間效率是對立的,此時應分析哪個更重要, 做出適當的折中。另外,在進行優化的時候不要片面的追求緊湊的代碼,因為緊湊的代碼并不能產生高效率的機器碼。

11、存儲器分配

由于成本限制,嵌入式系統存儲器容量有限。程序中所有的變量,包含的庫函數以及堆棧等都使用有限的內存:全局變量在整個程序范圍內都有效。程序執行完后才會釋放;靜態變量的作用范圍也是整個程序,只有局部變量中的動態變量在函數執行完后會釋放。因此, 在程序中應盡量使用局部變量,提高內存使用效率。程序中堆的大小受限于所有全局數據和棧空間都分配后的剩余量,如果堆太小,程序不能夠在需要的時候分配內存。因此在使用 malloc 函數申請內存之后一定要用 free 函數進行釋放, 防止內存泄露。

12、選擇好的無限循環

在編程中,我們常常需要用到無限循環,常用的兩種方法是while (1) 和 for (;;)。這兩種方法效果完全一樣,但那一種更好呢?然我們看看它們編譯后的代碼:

編譯前:

while (1);

編譯后:

mov eax,1test eax,eaxje foo+23hjmp foo+18h

編譯前:

for (;;);

編譯后:

jmp foo+23h

顯然,for (;;)指令少,不占用寄存器,而且沒有判斷,跳轉,比while (1)好。

13、使用Memoization,以避免遞歸重復計算

考慮Fibonacci(斐波那契)問題,Fibonacci問題是可以通過簡單的遞歸方法來解決:

[plain] view plain copy print?int fib ( n ){if ( n == 0 || n == 1 ){return 1;}else{return fib( n - 2 ) + fib ( n - 1 );}}

注:在這里,我們考慮Fibonacci 系列從1開始,因此,該系列看起來:1,1,2,3,5,8,…

注意:從遞歸樹,我們計算fib(3)函數2次,fib(2)函數3次。這是相同函數的重復計算。如果n非常大,fib函數的效率會比較低。Memoization是一個簡單的技術,可以被用在遞歸,加強計算速度。fibonacci 函數Memoization的代碼如下:

[plain] view plain copy print?int calc_fib ( int n ){int val[ n ] , i;for ( i = 0; i 《=n; i++ ){val[ i ] = -1; // Value of the first n + 1 terms of the fibonacci terms set to -1}val[ 0 ] = 1; // Value of fib ( 0 ) is set to 1val[ 1 ] = 1; // Value of fib ( 1 ) is set to 1return fib( n , val );}

int fib( int n , int* value ){if ( value[ n ] != -1 ){return value[ n ]; // Using memoization}else{value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value ); // Computing the fibonacci term}return value[ n ]; // Returning the value}

除了編程上的技巧外,為提高系統的運行效率,我們通常也需要最大可能地利用各種硬件設備自身的特點來減小其運轉開銷,例如減小中斷次數,利用DMA傳輸方式等。

對于嵌入式系統,C語言在開發速度,軟件可靠性以及軟件質量等方面都有著明顯的優勢。本文就嵌入式C語言在系統開發中,如何更好的利用系統資源,對代碼進行優化進行了討論。當然代碼優化的方法還有很多,這里只是寫出了一部分,希望能為開發人員提供一些幫助,也歡迎大家留言交流。
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5089

    文章

    19170

    瀏覽量

    306794
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137396
  • 代碼
    +關注

    關注

    30

    文章

    4819

    瀏覽量

    68879
  • 算法優化
    +關注

    關注

    0

    文章

    4

    瀏覽量

    6274

原文標題:手把手教你嵌入式C語言優化技巧

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    新手怎么學嵌入式?

    的運行機制。例如,了解數據結構中的鏈表、棧和隊列,對于在嵌入式編程中管理數據非常有幫助。 2. 選擇合適的編程語言 嵌入式開發中常用的編程語言
    發表于 12-12 10:51

    【「嵌入式系統設計與實現」閱讀體驗】+ 初步印象

    感謝電子發燒友論壇和電子工業出版社的贈書。 我自己從事嵌入式系統的教學工作,也指導過學生參加嵌入式相關的比賽并獲得過一些獎項。《嵌入式系統設計與實現——第六屆全國大學生
    發表于 12-02 21:17

    嵌入式學習建議

    原理的嵌入式操作系統進行學習。不要一開始就學習幾種操作系統,理解了基本原理,實踐中確有實際需要再學習也不遲。人總是要不斷學習的。 ⑨關于匯編語言C語言的取舍。隨著:MCU對
    發表于 10-22 11:41

    嵌入式常用總線有哪些

    嵌入式系統中常用的總線種類繁多,它們各自具有不同的特點和應用場景。以下將詳細介紹幾種嵌入式開發中常用的總線,包括UART、I2C、SPI、RS-232、RS-485、CAN以及USB等
    的頭像 發表于 09-10 11:34 ?717次閱讀

    七大嵌入式GUI盤點

    LCD設計提供高級支持,極大簡化了LCD設計。它是使用比較廣泛的一款GUI,配合GUI Builder或App Wizard上位機軟件,用起來也比較方便。emWin以C語言源代碼提供,使其成為嵌入式
    發表于 09-02 10:58

    嵌入式機電一體化系統設計與實現》讀后感

    更為深刻的理解。這本書不僅理論扎實,而且實踐性強,通過詳細的案例分析和操作步驟,為讀者展現了一個完整的設計和實現流程。 首先,本書開篇即對嵌入式系統進行了全面的概述,讓我對“嵌入”這一概念有了更深
    發表于 08-21 08:45

    嵌入式C編程常用的異常錯誤處理

    嵌入式C編程中,異常錯誤處理是確保系統穩定性和可靠性的重要部分。以下是一些常見的異常錯誤處理方法及其詳細說明和示例: 1. 斷言 (Assertions) 斷言用于在開發階段捕獲程序中的邏輯錯誤
    發表于 08-06 14:32

    嵌入式系統怎么學?

    一系列課程和技術,包括但不限于以下內容: 1、基礎知識:學習計算機組成原理、數字電路、模擬電路等基礎知識,建立對計算機硬件的認知與理解。 2、編程語言:掌握至少一種嵌入式系統常用的編程語言,如
    發表于 07-02 10:10

    如何提升嵌入式編程能力?

    /C++:大多數嵌入式系統使用CC++編程語言,因此深入學習這兩種語言是非常重要的。 8. 理
    發表于 06-21 10:01

    高校嵌入式教學實驗箱,開啟智慧教學新篇章

    高校嵌入式教學實驗箱,開啟智慧教學新篇章
    的頭像 發表于 05-23 08:32 ?543次閱讀
    高校<b class='flag-5'>嵌入式</b><b class='flag-5'>教學</b>實驗箱,開啟智慧<b class='flag-5'>教學</b>新篇章

    C語言嵌入式開發中的關鍵編譯器角色

    嵌入式程序開發跟硬件密切相關,需要使用C語言來讀寫底層寄存器、存取數據、控制硬件等,C語言和硬件之間由編譯器來聯系,一些
    發表于 04-26 14:53 ?674次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>嵌入式</b>開發中的關鍵編譯器角色

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統是當今科技領域的核心,而C語言則是
    發表于 04-07 16:03

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統是當今科技領域的核心,而C語言則是
    發表于 03-25 14:12

    嵌入式人工智能的就業方向有哪些?

    的發展方向有很多,門檻高低不一樣。下面給大家列舉一些相應崗位所需具備的技能: 一:嵌入式Linux,C語言開發工程師,Linux軟件開發工程師 LinuxC語言開發 LinuxC
    發表于 02-26 10:17

    嵌入式學習步驟

    開發。 嵌入式學習步驟總結如下: (1).確定目標平臺:選擇適合您要開發的嵌入式系統的硬件平臺。這取決于您要控制的設備以及您需要執行的任務。 (2).選擇編程語言嵌入式系統通常使用
    發表于 02-02 15:24
    主站蜘蛛池模板: 午夜天堂一区人妻| 又亲又揉摸下面视频免费看| 在线视频免费国产成人| 国产精品久久久久久久久久影院| 欧美人与动牲交A免费| 中文字幕在线免费观看视频| 久草在线新是免费视频| 亚洲欧洲日韩天堂无吗| 天天看学生视频| JIZZ学生13| 热九九99香蕉精品品| 成年人深夜福利| 日本学生VIDEOVIDEOS更新| 草莓视频在线看免费高清观看 | 中文字幕在线久热精品| 狼人射综合| 99国内精品| 色狠狠色综合吹潮| 国产成人一区免费观看| 久久综合一个色综合网| 在线视频免费国产成人| 男女性杂交内射妇女BBWXZ| freevideoshd| 日韩高清一区二区三区不卡| 国产99r视频精品免费观看| 小s现场抛胸挤奶| 换脸国产AV一区二区三区| 真实农村女人野外自拍照片| 男宿舍里的呻吟h| 国产扒开美女双腿屁股流白浆| 亚洲高清国产拍精品5g| 久久久久999| 99精品国产第一福利网站| 人人听力网mp3下载| 国产人成无码视频在线观看| 一区二区不卡在线视频| 内射无码AV-区二区在线观看| 高跟丝袜岳第一次| 亚洲欧美一区二区三区久久| 免费看欧美一级特黄a大片| 国产WW久久久久久久久久|