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

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

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

關(guān)于如何提高單片機(jī)執(zhí)行效率的一些建議

j4AI_wujianying ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-07-27 16:24 ? 次閱讀

首先,什么是執(zhí)行效率?我們平常所說(shuō)的執(zhí)行效率就是使用相同的算法在相同輸入條件下完成相同計(jì)算所產(chǎn)生的系統(tǒng)開銷,目前來(lái)說(shuō)一般會(huì)更多關(guān)注執(zhí)行時(shí)間方面的開銷。所有語(yǔ)言編寫的代碼最終要運(yùn)行,都要轉(zhuǎn)化成機(jī)器碼。在更短的時(shí)間內(nèi)完成相同的事那么效率就高。

關(guān)于如何提高C語(yǔ)言程序的執(zhí)行效率,有如下建議:

1.盡量避免調(diào)用延時(shí)函數(shù)

沒(méi)有帶操作系統(tǒng)的程序只能在while(1)里面循環(huán)執(zhí)行,如果在這里面調(diào)用大量的延時(shí)這樣會(huì)很消耗CPU的資源,延時(shí)等于是讓他在這歇著不干事了,只有中斷里面的才會(huì)執(zhí)行。如果僅僅是做一個(gè)LED一秒閃爍一次的程序,那么很簡(jiǎn)單,可以直接調(diào)用延時(shí)函數(shù),但是實(shí)際的項(xiàng)目中往往在大循環(huán)里有很多事要做,對(duì)于實(shí)時(shí)性要求較高的場(chǎng)合就不行了。為了避免使用延時(shí),可以使用定時(shí)器中斷產(chǎn)生一個(gè)標(biāo)志位,到了時(shí)間標(biāo)志位置1,在主程序里面只需要檢測(cè)標(biāo)志位,置1了才執(zhí)行一次,然后清標(biāo)志。其他時(shí)間就去做別的事了,而不會(huì)在這等待了。最好的例子就是數(shù)碼管的顯示,使用中斷調(diào)顯示,在我們的例程里面有。然后是那個(gè)按鍵檢測(cè)的,一般的程序都是做的while(!key)等待按鍵釋放,如果按鍵一直按著,那后面的程序就永遠(yuǎn)得不到運(yùn)行死在這了,其實(shí)可以做一個(gè)按鍵標(biāo)志檢測(cè)下降沿和上升沿就可以避免這個(gè)問(wèn)題了。

2.寫出來(lái)的代碼要盡量簡(jiǎn)潔,避免重復(fù)

在10天學(xué)會(huì)單片機(jī)那本書上看到他寫的數(shù)碼管顯示那部分代碼,選中一個(gè)位,然后送數(shù)據(jù),再選中一個(gè)位,再送數(shù)據(jù),依次做完。代碼重復(fù)率太高了,不僅占用過(guò)多的類存,而且執(zhí)行效率差可讀性差,僅僅是實(shí)現(xiàn)了功能而已,實(shí)際的編程可以做一個(gè)循環(huán),for循環(huán)或者while循環(huán)。這樣的代碼看起來(lái)更有水平。

3.合理使用宏定義

在程序中如果某個(gè)變量或寄存器經(jīng)常用到,可以使用宏定義定義一個(gè)新的名代替他,這樣的好處是方便修改,比如液晶的數(shù)據(jù)端總線接的P1,現(xiàn)在想改到P0,那么只需要修改宏定義這里就可以了,編譯器編譯的時(shí)候,他會(huì)自動(dòng)的把定義的名替換成實(shí)際的名稱。

4.使用盡量小的數(shù)據(jù)類型

比如某個(gè)變量的值范圍是0-255,那么就定義成unsigned char,當(dāng)然也可以定義成unsigned int,但是這樣造成了內(nèi)存的浪費(fèi),而且運(yùn)算時(shí)效率要低一點(diǎn)。如果數(shù)據(jù)沒(méi)有負(fù)數(shù)的話,盡量定義成無(wú)符號(hào)的類型。應(yīng)盡量避免定義成浮點(diǎn)型數(shù)據(jù)類型或雙精度(占8個(gè)字節(jié))類型,這兩種類型運(yùn)算時(shí)很消耗CPU資源。比如采集電壓范圍是0-5v,精確到小數(shù)點(diǎn)后三位,可以把采集到的數(shù)據(jù)擴(kuò)大1000倍,即使最大也才到5000,然后多采集幾次做個(gè)濾波算法,最后電壓算出來(lái)后只需要在第一位后面加個(gè)小數(shù)點(diǎn)就可以了,變量定義成unsigned int 型變量就沒(méi)問(wèn)題了。

5.避免使用乘除法

乘除法很消耗CPU資源,查看匯編代碼會(huì)發(fā)現(xiàn),一個(gè)乘除法運(yùn)算會(huì)編譯出10幾甚至幾10行代碼。如果是乘以或除以2的n次方,可以用>來(lái)實(shí)現(xiàn),這種移位運(yùn)算在編譯時(shí)就已經(jīng)算好了,所以代碼很簡(jiǎn)潔,運(yùn)算效率就高。但是需要特別注意運(yùn)算符的優(yōu)先級(jí)問(wèn)題。

6.盡量使用復(fù)合賦值運(yùn)算符

a=a+b與a+=b 這兩個(gè)表達(dá)式有什么區(qū)別呢?前者是先計(jì)算a+b的值,然后保存到ACC寄存器,然后再把ACC寄存器的值賦給a,而后者是直接將a+b的值賦給a,節(jié)省一個(gè)步驟,雖然只節(jié)省了一條指令,但是當(dāng)這個(gè)運(yùn)算循環(huán)幾千次幾萬(wàn)次呢,那么效果很明顯了。像其他的-=、*=、/=、%=等都是一樣的。

7.盡量不要定義成全局變量

先來(lái)看一下局部變量,全局變量,靜態(tài)局部變量,靜態(tài)全局變量的異同:

(1)局部變量:在一個(gè)函數(shù)中或復(fù)合語(yǔ)句中定義的變量,在動(dòng)態(tài)存儲(chǔ)區(qū)分配存儲(chǔ)單元,在調(diào)用時(shí)動(dòng)態(tài)分配,在函數(shù)或復(fù)合語(yǔ)句結(jié)束時(shí)自動(dòng)釋放;

(2)靜態(tài)局部變量:在一個(gè)函數(shù)中定義局部變量時(shí),若加上static聲明,則此變量為靜態(tài)局部變量,在靜態(tài)存儲(chǔ)區(qū)分配存儲(chǔ)單元,在程序運(yùn)行期間都不釋放;靜態(tài)局部變量只能在該函數(shù)中使用;靜態(tài)局部變量在編譯時(shí)賦值(若在定義時(shí)未進(jìn)行賦值處理,則默認(rèn)賦值為0(對(duì)數(shù)值型變量)或空字符(對(duì)字符型變量));靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后不自動(dòng)釋放,保留函數(shù)調(diào)用結(jié)束后的值;

(3)全局變量:在函數(shù)外定義的變量稱為全局變量;全局變量在靜態(tài)存儲(chǔ)區(qū)分配存儲(chǔ)單元,在程序運(yùn)行期間都不釋放,在文件中的函數(shù)均可調(diào)用該全局變量,其他文件內(nèi)的函數(shù)調(diào)用全局變量,需加extern聲明;

(4)靜態(tài)全局變量:在函數(shù)外定義變量時(shí),若加上static聲明,則此變量為靜態(tài)全局變量;靜態(tài)全局變量在靜態(tài)存儲(chǔ)區(qū)分配存儲(chǔ)單元,在程序運(yùn)行期間都不釋放,靜態(tài)全局變量在編譯時(shí)賦值(若在定義時(shí)未進(jìn)行賦值處理,則默認(rèn)賦值為0(對(duì)數(shù)值型變量)或空字符(對(duì)字符型變量));只能在當(dāng)前文件中使用。

一般情況下就定義成局部變量,這樣不僅運(yùn)行更高效,而且很方便移植。局部變量大多定位于MCU內(nèi)部的寄存器中,在絕大多數(shù)MCU中,使用寄存器操作速度比數(shù)據(jù)存儲(chǔ)器快,指令也更多更靈活,有利于生成質(zhì)量更高的代碼,而且局部變量所的占用的寄存器和數(shù)據(jù)存儲(chǔ)器在不同的模塊中可以重復(fù)利用。

當(dāng)中斷里需要用到的變量時(shí),就需要定義成全局變量,并且加volatile修飾一下,防止編譯器優(yōu)化。如果數(shù)據(jù)是只讀的比如數(shù)碼管的斷碼、漢字取模的字庫(kù)需要放在ROM里,這樣可以節(jié)省RAM,51單片機(jī)是加code,高級(jí)點(diǎn)的單片機(jī)都是加const修飾。

8.選擇合適的算法和數(shù)據(jù)結(jié)構(gòu)

應(yīng)該熟悉算法語(yǔ)言,知道各種算法的優(yōu)缺點(diǎn),具體資料請(qǐng)參見(jiàn)相應(yīng)的參考資料,有很多計(jì)算機(jī)書籍上都有介紹。將比較慢的順序查找法用較快的二分查找或亂序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序執(zhí)行的效率。.

選擇一種合適的數(shù)據(jù)結(jié)構(gòu)也很重要。 指針是一個(gè)包含地址的變量,可對(duì)他指向的變量進(jìn)行尋址。使用指針可以很容易的從一個(gè)變量移到下一個(gè)變量,故特別適合對(duì)大量變量進(jìn)行操作的場(chǎng)合。數(shù)組與指針語(yǔ)句具有十分密切的關(guān)系,一般來(lái)說(shuō),指針比較靈活簡(jiǎn)潔,而數(shù)組則比較直觀,容易理解。對(duì)于大部分的編譯器,使用指針比使用數(shù)組生成的代碼更短,執(zhí)行效率更高。但是在Keil中則相反,使用數(shù)組比使用的指針生成的代碼更短。

9.使用條件編譯

一般情況下對(duì)C語(yǔ)言程序進(jìn)行編譯時(shí),所有的程序都參加編譯,但是有時(shí)希望對(duì)其中一部分內(nèi)容只在滿足一定條件才編譯,這就是條件編譯。條件編譯可以根據(jù)實(shí)際情況,選擇不同的編譯范圍,從而產(chǎn)生不同的代碼。

10.嵌入?yún)R編---殺手锏

匯編語(yǔ)言是效率最高的計(jì)算機(jī)語(yǔ)言,在一般項(xiàng)目開發(fā)當(dāng)中一般都采用C 語(yǔ)言來(lái)開發(fā)的,因?yàn)榍度雲(yún)R編 之后會(huì)影響平臺(tái)的移植性和可讀性,不同平臺(tái)的匯編指令是不兼容的。但是對(duì)于一些執(zhí)著的程序員要求程序獲得極致的運(yùn)行的效率,他們都在C 語(yǔ)言中嵌入?yún)R編,即“混合編程”。

注意:如果想嵌入?yún)R編,一定要對(duì)匯編有深刻的了解。不到萬(wàn)不得已的情況,不要使用嵌入?yún)R編。

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

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631996
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135864

原文標(biāo)題:如何提高單片機(jī)程序執(zhí)行效率

文章出處:【微信號(hào):wujianying_danpianji,微信公眾號(hào):?jiǎn)纹瑱C(jī)精講吳鑒鷹】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    上傳一些關(guān)于單片機(jī)的論文

    上傳一些關(guān)于單片機(jī)的論文,希望對(duì)大家有用
    發(fā)表于 08-08 22:35

    學(xué)習(xí)單片機(jī)一些技巧

    單片機(jī)應(yīng)用開發(fā)中,代碼的使用效率問(wèn)題、單片機(jī)抗干擾性和可靠性等問(wèn)題仍困擾著工程師。為幫助工程師解決單片機(jī)設(shè)計(jì)上的難題,納出單片機(jī)開發(fā)中應(yīng)掌
    發(fā)表于 11-15 20:38

    單片機(jī)學(xué)習(xí)需要掌握的一些技巧

    抗干擾性和可靠性等問(wèn)題仍困擾著工程師。那怎樣解決單片機(jī)設(shè)計(jì)上的難題?這里為大家整理出單片機(jī)開發(fā)中應(yīng)掌握的幾個(gè)基本技巧。中國(guó)IC交易網(wǎng)、 如何提高C語(yǔ)言編程代碼的
    發(fā)表于 07-29 11:54

    MCS 51單片機(jī)一些疑難指令的解析

    本文介紹了學(xué)習(xí)和運(yùn)用MCS51系列單片機(jī)中的一些技巧,特別針對(duì)MCS51單片機(jī)一些疑難指令
    發(fā)表于 11-17 16:09 ?19次下載

    單片機(jī)教程二十六:關(guān)于單片機(jī)一些基本概念

    單片機(jī)教程二十六:關(guān)于單片機(jī)一些基本概念 隨著電子技術(shù)的迅速發(fā)展,計(jì)算機(jī)已深入地滲透到我們的生活中,許多電子愛(ài)好者開始學(xué)習(xí)單片機(jī)
    發(fā)表于 05-15 23:24 ?619次閱讀

    關(guān)于單片機(jī)一些基本概念

    關(guān)于單片機(jī)一些基本概念  隨著電子技術(shù)的迅速發(fā)展,計(jì)算機(jī)已深入地滲透到我們的生活中,許多電子愛(ài)好者開始學(xué)習(xí)單片機(jī)知識(shí),但單片機(jī)
    發(fā)表于 03-18 16:54 ?1091次閱讀

    單片機(jī)一些開發(fā)技巧

      很多朋友正在學(xué)習(xí)單片機(jī)開發(fā)技術(shù),但開發(fā)中免不了要碰到這樣、那樣的問(wèn)題,有些問(wèn)題可能無(wú)礙大局,但有一些問(wèn)題卻直接影響到產(chǎn)品的成本、體積、性能。這里介紹筆者的幾個(gè)
    發(fā)表于 06-13 17:18 ?3023次閱讀
    <b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>一些</b>開發(fā)技巧

    關(guān)于單片機(jī)一些按鍵問(wèn)題和代碼詳細(xì)資料總結(jié)

    本文檔的主要內(nèi)容詳細(xì)介紹的是關(guān)于單片機(jī)一些按鍵問(wèn)題和代碼詳細(xì)資料總結(jié)免費(fèi)下載。
    發(fā)表于 06-18 17:44 ?2次下載
    <b class='flag-5'>關(guān)于</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>一些</b>按鍵問(wèn)題和代碼詳細(xì)資料總結(jié)

    關(guān)于學(xué)習(xí)Linux的一些建議

    不管是在生活還是工作中,每個(gè)人都會(huì)逐漸養(yǎng)成一些小習(xí)慣。壞習(xí)慣旦形成就很難改正,所在在系統(tǒng)學(xué)習(xí) Linux 之前,給大家一些建議,刻意去培養(yǎng)一些
    發(fā)表于 07-14 14:22 ?581次閱讀

    單片機(jī)程序防破解的一些建議資料下載

    電子發(fā)燒友網(wǎng)為你提供單片機(jī)程序防破解的一些建議資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-04 08:41 ?23次下載
    <b class='flag-5'>單片機(jī)</b>程序防破解的<b class='flag-5'>一些</b><b class='flag-5'>建議</b>資料下載

    關(guān)于51的一些看法

    51單片機(jī):我覺(jué)得51的架構(gòu)是分為:它的硬件結(jié)構(gòu)+指令集:CPU,ROM,RAM,片外ROM,片外RAM,總線,IO,中斷,定時(shí)器,串口我學(xué)了后面的ARM重新來(lái)對(duì)51單片機(jī)一些簡(jiǎn)單的回顧,程序
    發(fā)表于 11-23 16:20 ?9次下載
    <b class='flag-5'>關(guān)于</b>51的<b class='flag-5'>一些</b>看法

    關(guān)于藍(lán)橋杯單片機(jī)開發(fā)板矩陣鍵盤的一些

    關(guān)于藍(lán)橋杯單片機(jī)開發(fā)板矩陣鍵盤的一些
    發(fā)表于 11-23 17:36 ?2次下載
    <b class='flag-5'>關(guān)于</b>藍(lán)橋杯<b class='flag-5'>單片機(jī)</b>開發(fā)板矩陣鍵盤的<b class='flag-5'>一些</b>坑

    學(xué)習(xí)單片機(jī),其實(shí)有一些技巧的

    單片機(jī)應(yīng)用開發(fā)中,代碼的使用效率問(wèn)題、單片機(jī)抗干擾性和可靠性等問(wèn)題仍困擾著工程師。為幫助工程師解決單片機(jī)設(shè)計(jì)上的難題,這里給大家歸納出單片機(jī)
    發(fā)表于 12-08 09:21 ?0次下載
    學(xué)習(xí)<b class='flag-5'>單片機(jī)</b>,其實(shí)有<b class='flag-5'>一些</b>技巧的

    如何提高單片機(jī)程序執(zhí)行效率

    更短的時(shí)間內(nèi)完成相同的事那么效率就高。 關(guān)于如何提高C語(yǔ)言程序的執(zhí)行效率,有如下建議: 1.盡量
    發(fā)表于 02-11 15:42 ?6次下載
    如何<b class='flag-5'>提高</b><b class='flag-5'>單片機(jī)</b>程序<b class='flag-5'>執(zhí)行</b><b class='flag-5'>效率</b>

    單片機(jī)“低耦合”的一些方法

    單片機(jī)“低耦合”的一些方法
    的頭像 發(fā)表于 10-17 18:30 ?469次閱讀