來實現(xiàn),這種移位運(yùn)算在編譯時就已經(jīng)算好了,所以代碼很簡潔,運(yùn)算效率就高。但是需要特別注意運(yùn)算符的優(yōu)先級問題。" />

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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

關(guān)于如何提高C語言程序的執(zhí)行效率

4bDk_HOLTEK_MCU ? 來源:未知 ? 作者:李倩 ? 2018-06-26 16:36 ? 次閱讀

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

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

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

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

2.寫出來的代碼要盡量簡潔,避免重復(fù)

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

3.合理使用宏定義

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

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

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

5.避免使用乘除法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9.使用條件編譯

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

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

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

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

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

    關(guān)注

    68

    文章

    10971

    瀏覽量

    214337
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4657

    瀏覽量

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

    關(guān)注

    180

    文章

    7622

    瀏覽量

    139009

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

文章出處:【微信號:HOLTEK_MCU,微信公眾號:至秦單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 0人收藏

    評論

    相關(guān)推薦

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

    首先什么是執(zhí)行效率。我們平常所說的執(zhí)行效率就是使用相同的算法在相同輸入條件下完成相同計算所產(chǎn)生的系統(tǒng)開銷,目前來說一般會更多關(guān)注執(zhí)行時間方面
    發(fā)表于 03-06 18:52 ?1948次閱讀

    為什么C語言執(zhí)行效率高,運(yùn)行快?

    都說C語言編寫的程序執(zhí)行效率比較高,那么到底高在哪里,我們一塊來學(xué)習(xí)學(xué)習(xí)。
    發(fā)表于 11-04 09:04 ?1153次閱讀

    如何提高C語言程序執(zhí)行效率

    的事那么效率就高。下面說說如何提高C語言程序執(zhí)行效率
    發(fā)表于 07-20 06:39

    MCS的C語言和標(biāo)準(zhǔn)C語言的區(qū)別

    MCS的C語言和標(biāo)準(zhǔn)C語言的區(qū)別MC9S12的C語言與標(biāo)準(zhǔn)C
    發(fā)表于 07-20 07:06

    如何提高C語言編程代碼的效率

    在單片機(jī)應(yīng)用開發(fā)中,代碼的使用效率問題、單片機(jī)抗干擾性和可靠性等問題仍困擾著工程師。為幫助工程師解決單片機(jī)設(shè)計上的難題,這里給大家歸納出單片機(jī)開發(fā)中應(yīng)掌握的幾個基本技巧。01 如何提高C語言
    發(fā)表于 02-11 07:30

    關(guān)于c語言編寫的算法程序

    關(guān)于c語言編寫的算法程序
    發(fā)表于 04-09 17:47 ?13次下載

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

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

    講解下C語言的內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)是C語言C++中借鑒過來的,適當(dāng)?shù)氖褂脙?nèi)聯(lián)函數(shù)可以提高程序執(zhí)行效率。
    的頭像 發(fā)表于 02-16 09:15 ?1611次閱讀

    C語言內(nèi)聯(lián)函數(shù),提升C技巧必備

    內(nèi)聯(lián)函數(shù)是C語言C++中借鑒過來的,適當(dāng)?shù)氖褂脙?nèi)聯(lián)函數(shù)可以提高程序執(zhí)行效率。本篇文章就來講解
    的頭像 發(fā)表于 02-16 09:16 ?875次閱讀

    C語言靈魂拷問: ++i為何比i++執(zhí)行效率高!

    當(dāng)然,就C語言代碼來看,i++ 和 ++i 都只有一行,看起來似乎二者的執(zhí)行效率一樣?其實不是的,在學(xué)習(xí)C
    的頭像 發(fā)表于 03-07 11:02 ?1147次閱讀

    如何把C++程序改寫成C語言

      由于C++解釋器比C語言解釋器占用的存儲空間要大500k左右。為了節(jié)省有限的存儲空間、降低成本,同時也為了提高效率,將用C++
    的頭像 發(fā)表于 04-21 10:12 ?3643次閱讀
    如何把<b class='flag-5'>C</b>++<b class='flag-5'>程序</b>改寫成<b class='flag-5'>C</b><b class='flag-5'>語言</b>

    簡單聊聊C語言執(zhí)行步驟

    我們初學(xué)C語言時老師肯定講過C語言執(zhí)行過程:預(yù)處理——編譯——匯編——鏈接。
    發(fā)表于 07-31 11:28 ?1512次閱讀
    簡單聊聊<b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>執(zhí)行</b>步驟

    c語言程序main函數(shù)的位置

    C語言程序中的main函數(shù)是程序的入口點,它被認(rèn)為是C語言
    的頭像 發(fā)表于 11-24 10:23 ?3038次閱讀

    怎么寫出效率高、思路清晰的C語言程序?

    要用C語言的思維方式來進(jìn)行程序的構(gòu)架構(gòu)建 要有良好的C語言算法基礎(chǔ),以此來實現(xiàn)程序的邏輯構(gòu)架
    的頭像 發(fā)表于 01-02 14:20 ?751次閱讀

    語言RPA中有哪些優(yōu)勢,可以提高開發(fā)效率?

    語言RPA提供了多種資源和工具來幫助用戶提高開發(fā)效率,以下是一些值得關(guān)注的點: 1、跨平臺兼容:火語言支持在Win, Mac, Linux上三端跨平臺運(yùn)行,一個腳本規(guī)則適配所有系統(tǒng)。
    的頭像 發(fā)表于 08-07 13:40 ?525次閱讀
    主站蜘蛛池模板: 美女张开腿露出尿口扒开来摸动漫 | 人妻久久久精品99系列AV | www.三级| 99久久香蕉 | 大肚婆孕妇网 | 色婷婷亚洲精品天天综合影院 | 妹妹我要色| 天堂在线亚洲精品专区 | 天美传媒在线完整免费观看网站 | 蜜芽无码亚洲资源网站 | 性白俄罗斯高清xxxxx | 天堂Av亚洲欧美日韩国产综合 | 亚洲第一免费播放区 | 亚洲伦理精品久久 | 午夜婷婷一夜七次郎 | 殴美黄色网 | 免费的好黄的漫画 | 久久久久毛片免费观看 | 动漫美女禁区 | 小草高清视频免费直播 | 国产成久久免费精品AV片天堂 | 亚洲狠狠97婷婷综合久久久久 | 波多久久亚洲精品AV无码 | 中文字幕午夜福利片 | 年轻老师毛茸茸自由性 | 亚洲色播永久网址大全 | 黄色三级三级三级免费看 | 日韩成人在线视频 | 东北老妇xxxxhd | 免费在线亚洲视频 | 久久久久久91香蕉国产 | 99爱在线精品视频网站 | 男女作爱在线播放免费网页版观看 | 亚洲精品乱码电影在线观看 | 被强J高H纯肉公交车啊 | 婷婷开心激情综合五月天 | 丝袜美腿美女被狂躁在线观看 | 高清国产激情视频在线观看 | 狠狠色狠狠色88综合日日91 | 精品亚洲永久免费精品 | 国产毛片女人高潮叫声 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品