女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

對(duì)嵌入式C語言優(yōu)化技巧詳細(xì)教學(xué)

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

嵌入式系統(tǒng)是指完成一種或幾種特定功能的計(jì)算機(jī)系統(tǒng),具有自動(dòng)化程度高,響應(yīng)速度快等優(yōu)點(diǎn),目前已廣泛應(yīng)用于消費(fèi)電子工業(yè)控制等領(lǐng)域。嵌入式系統(tǒng)受其使用的硬件以及運(yùn)行環(huán)境的限制,非常注重代碼的時(shí)間和空間效率,因此選擇一種合適的開發(fā)語言十分重要。

目前,在嵌入式系統(tǒng)開發(fā)中可使用的語言很多,其中 C語言應(yīng)用得最廣泛。雖然用 C 語言編程具有許多優(yōu)點(diǎn),但基于嵌入式系統(tǒng)的C語言和標(biāo)準(zhǔn) C語言又有很大區(qū)別。接下來小編結(jié)合嵌入式系統(tǒng)的特點(diǎn)和高手們的一些積累,給大家整理出在程序設(shè)計(jì)中代碼優(yōu)化的一些小技巧。

1、嵌入式C語言的特點(diǎn)

作為一種結(jié)構(gòu)化程序設(shè)計(jì)語言,C 語言兼顧多種高級(jí)語言的特點(diǎn),具有很強(qiáng)的功能性和可移植性。但在嵌入式系統(tǒng)開發(fā)中,出于對(duì)低價(jià)產(chǎn)品的需求,系統(tǒng)的計(jì)算能力和存儲(chǔ)容量都非常有限,因此如何利用好這些資源就顯得十分重要。開發(fā)人員應(yīng)注意嵌入式 C語言和標(biāo)準(zhǔn) C 語言的區(qū)別,減少生成代碼長度,提高程序執(zhí)行效率,在程序設(shè)計(jì)中對(duì)代碼進(jìn)行優(yōu)化。

2、C代碼在程序中的優(yōu)化

現(xiàn)在的 C 編譯器會(huì)自動(dòng)對(duì)代碼進(jìn)行優(yōu)化,但這些優(yōu)化是對(duì)執(zhí)行速度和代碼長度的平衡。如果要獲得更小且執(zhí)行效率更高的代碼,需要程序員手工對(duì)代碼進(jìn)行優(yōu)化。

3、變量類型的定義

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

4、算法優(yōu)化

算法優(yōu)化指對(duì)程序時(shí)空復(fù)雜度的優(yōu)化:在 PC 機(jī)上進(jìn)行程序設(shè)計(jì)時(shí)一般不必過多關(guān)注程序代碼的長短,只需考慮功能的實(shí)現(xiàn),但嵌入式系統(tǒng)就必須考慮系統(tǒng)的硬件資源,在程序設(shè)計(jì)時(shí),應(yīng)盡量采用生成代碼短的算法,在不影響程序功能實(shí)現(xiàn)的情況下優(yōu)化算法。

5、適當(dāng)?shù)氖褂煤?/strong>

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

此外,我們還要避免不必要的函數(shù)調(diào)用,請(qǐng)看下面的代碼:

[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 ] );}}

請(qǐng)注意,這兩個(gè)函數(shù)的功能相似。然而,第一個(gè)函數(shù)調(diào)用strlen函數(shù)多次,而第二個(gè)函數(shù)只調(diào)用函數(shù)strlen一次。因此第二個(gè)函數(shù)性能明顯比第一個(gè)好。

6、內(nèi)嵌匯編

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

7、提高循環(huán)語言的效率

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

(1) 在多重循環(huán)中,應(yīng)將最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層。這樣可以減少 CPU跨切循環(huán)的次數(shù)。如例 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 語言中常用的選擇語句, 在編譯時(shí)會(huì)產(chǎn)生if- else- if 嵌套代碼,并按照順序進(jìn)行比較,發(fā)現(xiàn)匹配時(shí),就跳轉(zhuǎn)到滿足條件的語句執(zhí)行。

當(dāng) switch 語句中的 case 標(biāo)號(hào)很多時(shí),為了減少比較的次數(shù),可以把發(fā)生頻率相對(duì)高的條件放到第一位或者把整個(gè) switch 語句轉(zhuǎn)化嵌套 switch 語句。把發(fā)生頻率高的 case 標(biāo)號(hào)放在最外層的 switch 語句中,發(fā)生相對(duì)頻率相對(duì)低的 case 標(biāo)號(hào)放在另外的 switch 語句中。如例 3 中,把發(fā)生率高的case 標(biāo)號(hào)放在外層的 switch 語句中,把發(fā)生頻率低的放在缺省的(default)內(nèi)層 switch 語句中。

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

9、避免使用標(biāo)準(zhǔn)庫

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

10、采用數(shù)學(xué)方法優(yōu)化程序

數(shù)學(xué)是計(jì)算機(jī)之母,沒有數(shù)學(xué)的依據(jù)和基礎(chǔ),就沒有計(jì)算機(jī)的發(fā)展,所以在編寫程序的時(shí)候,采用一些數(shù)學(xué)方法會(huì)對(duì)程序的執(zhí)行效率有數(shù)量級(jí)的提高。有時(shí)候這個(gè)問題常常被大家忽略, 對(duì)于沒有經(jīng)驗(yàn)的程序員來說更是如此。例如:求 1~100 的和:

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

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

優(yōu)化算法和數(shù)據(jù)結(jié)構(gòu)對(duì)提高代碼的效率有很大的幫助。當(dāng)然有時(shí)候時(shí)間效率和空間效率是對(duì)立的,此時(shí)應(yīng)分析哪個(gè)更重要, 做出適當(dāng)?shù)恼壑小A硗猓谶M(jìn)行優(yōu)化的時(shí)候不要片面的追求緊湊的代碼,因?yàn)榫o湊的代碼并不能產(chǎn)生高效率的機(jī)器碼。

11、存儲(chǔ)器分配

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

12、選擇好的無限循環(huán)

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

編譯前:

while (1);

編譯后:

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

編譯前:

for (;;);

編譯后:

jmp foo+23h

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

13、使用Memoization,以避免遞歸重復(fù)計(jì)算

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

[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,…

注意:從遞歸樹,我們計(jì)算fib(3)函數(shù)2次,fib(2)函數(shù)3次。這是相同函數(shù)的重復(fù)計(jì)算。如果n非常大,fib函數(shù)的效率會(huì)比較低。Memoization是一個(gè)簡單的技術(shù),可以被用在遞歸,加強(qiáng)計(jì)算速度。fibonacci 函數(shù)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}

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5141

    文章

    19524

    瀏覽量

    314789
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140220
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70241
  • 算法優(yōu)化
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    6325

原文標(biāo)題:手把手教你嵌入式C語言優(yōu)化技巧

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開發(fā)入門指南:從零開始學(xué)習(xí)嵌入式

    特定功能的計(jì)算機(jī)系統(tǒng),廣泛應(yīng)用于智能家居、工業(yè)控制、醫(yī)療設(shè)備、車載系統(tǒng)等領(lǐng)域。 2. 學(xué)習(xí)嵌入式開發(fā)的前置知識(shí)熟悉C語言編程掌握基本的數(shù)據(jù)結(jié)構(gòu)與算法了解數(shù)字電路與微控制器原理熟悉Linux操作系統(tǒng)
    發(fā)表于 05-15 09:29

    嵌入式編程設(shè)計(jì)模式

    嵌入式編程設(shè)計(jì)模式,介紹如何使用設(shè)計(jì)模式為嵌入式系統(tǒng)創(chuàng)建高效且優(yōu)化C語言設(shè)計(jì)。 純分享貼,有需要可以直接下載附件獲取完整資料! (如
    發(fā)表于 04-15 14:47

    如何成為一名嵌入式軟件工程師?

    如何成為一名嵌入式軟件工程師? 01明確崗位的角色與定位 嵌入式軟件工程師主要負(fù)責(zé)開發(fā)運(yùn)行在特定硬件平臺(tái)上的軟件,這些軟件通常與硬件緊密集成,以實(shí)現(xiàn)特定的功能。 不僅需要精通編程語言(如C
    發(fā)表于 04-15 14:37

    嵌入式主板開發(fā)詳細(xì)指南

    嵌入式主板開發(fā)涉及硬件設(shè)計(jì)、軟件集成、系統(tǒng)優(yōu)化等多個(gè)環(huán)節(jié),需要結(jié)合具體應(yīng)用場(chǎng)景進(jìn)行深度定制。以下是嵌入式主板開發(fā)的詳細(xì)指南,涵蓋關(guān)鍵步驟、工具、挑戰(zhàn)及實(shí)際案例:一、開發(fā)流程與關(guān)鍵步驟1
    的頭像 發(fā)表于 04-02 11:35 ?389次閱讀
    <b class='flag-5'>嵌入式</b>主板開發(fā)<b class='flag-5'>詳細(xì)</b>指南

    Python在嵌入式系統(tǒng)中的應(yīng)用場(chǎng)景

    你想把你的職業(yè)生涯提升到一個(gè)新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于CC++語言
    的頭像 發(fā)表于 03-19 14:10 ?493次閱讀

    嵌入式主板選型與應(yīng)用指南

    嵌入式主板是專為嵌入式系統(tǒng)設(shè)計(jì)的核心硬件平臺(tái),廣泛應(yīng)用于工業(yè)控制、物聯(lián)網(wǎng)、醫(yī)療設(shè)備等領(lǐng)域。以下是關(guān)于嵌入式主板的詳細(xì)介紹:1.嵌入式主板的核
    的頭像 發(fā)表于 02-27 14:53 ?369次閱讀
    <b class='flag-5'>嵌入式</b>主板選型與應(yīng)用指南

    嵌入式系統(tǒng)中的代碼優(yōu)化與壓縮技術(shù)

    在當(dāng)今數(shù)字化時(shí)代,嵌入式系統(tǒng)廣泛應(yīng)用于各個(gè)領(lǐng)域,從智能家居設(shè)備到工業(yè)控制系統(tǒng),從汽車電子到可穿戴設(shè)備,它們無處不在。而在嵌入式系統(tǒng)開發(fā)中,代碼優(yōu)化與壓縮技術(shù)至關(guān)重要,直接影響著系統(tǒng)的性能、成本
    發(fā)表于 02-26 15:00

    新手怎么學(xué)嵌入式?

    的運(yùn)行機(jī)制。例如,了解數(shù)據(jù)結(jié)構(gòu)中的鏈表、棧和隊(duì)列,對(duì)于在嵌入式編程中管理數(shù)據(jù)非常有幫助。 2. 選擇合適的編程語言 嵌入式開發(fā)中常用的編程語言
    發(fā)表于 12-12 10:51

    嵌入式學(xué)習(xí)建議

    原理的嵌入式操作系統(tǒng)進(jìn)行學(xué)習(xí)。不要一開始就學(xué)習(xí)幾種操作系統(tǒng),理解了基本原理,實(shí)踐中確有實(shí)際需要再學(xué)習(xí)也不遲。人總是要不斷學(xué)習(xí)的。 ⑨關(guān)于匯編語言C語言的取舍。隨著:MCU對(duì)
    發(fā)表于 10-22 11:41

    嵌入式常用總線有哪些

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

    七大嵌入式GUI盤點(diǎn)

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

    嵌入式機(jī)電一體化系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)》讀后感

    更為深刻的理解。這本書不僅理論扎實(shí),而且實(shí)踐性強(qiáng),通過詳細(xì)的案例分析和操作步驟,為讀者展現(xiàn)了一個(gè)完整的設(shè)計(jì)和實(shí)現(xiàn)流程。 首先,本書開篇即對(duì)嵌入式系統(tǒng)進(jìn)行了全面的概述,讓我對(duì)“嵌入”這一概念有了更深
    發(fā)表于 08-21 08:45

    嵌入式C編程常用的異常錯(cuò)誤處理

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

    嵌入式系統(tǒng)怎么學(xué)?

    一系列課程和技術(shù),包括但不限于以下內(nèi)容: 1、基礎(chǔ)知識(shí):學(xué)習(xí)計(jì)算機(jī)組成原理、數(shù)字電路、模擬電路等基礎(chǔ)知識(shí),建立對(duì)計(jì)算機(jī)硬件的認(rèn)知與理解。 2、編程語言:掌握至少一種嵌入式系統(tǒng)常用的編程語言,如
    發(fā)表于 07-02 10:10

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

    /C++:大多數(shù)嵌入式系統(tǒng)使用CC++編程語言,因此深入學(xué)習(xí)這兩種語言是非常重要的。 8. 理
    發(fā)表于 06-21 10:01