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

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

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

12條不可忽視的8位單片機(jī)的程序優(yōu)化

j4AI_wujianying ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-05-14 17:45 ? 次閱讀

1、采用短變量

一個(gè)提高代碼效率的最基本的方式就是減小變量的長(zhǎng)度。使用 C 編程時(shí),我們都習(xí)慣于對(duì)循環(huán)控制變量使用 int 類型,這對(duì) 8 位的單片機(jī)來(lái)說(shuō)是一種極大的浪費(fèi),你應(yīng)該仔細(xì)考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型,很明顯,經(jīng)常使用的變量應(yīng)該是unsigned char,只占用一個(gè)字節(jié)。

2、使用無(wú)符號(hào)類型

為什么要使用無(wú)符號(hào)類型呢?原因是8051不支持符號(hào)運(yùn)算,程序中也不要使用含有帶符號(hào)變量的外部代碼,除了根據(jù)變量長(zhǎng)度來(lái)選擇變量類型外,你還要考慮是否變量是否會(huì)用于負(fù)數(shù)的場(chǎng)合。如果你的程序中可以不需要負(fù)數(shù)那么把變量都定義成無(wú)符號(hào)類型的。

3、避免使用浮點(diǎn)指針

在 8 位操作系統(tǒng)上使用 32 位浮點(diǎn)數(shù)是得不償失的。你可以這樣做,但會(huì)浪費(fèi)大量的時(shí)間,所以當(dāng)你要在系統(tǒng)中使用浮點(diǎn)數(shù)的時(shí)候,你要問(wèn)問(wèn)自己這是否一定需要,可以通過(guò)提高數(shù)值數(shù)量級(jí)和使用整型運(yùn)算來(lái)消除浮點(diǎn)指針,處理ints和longs比處理doubles和floats要方便得多,你的代碼執(zhí)行起來(lái)會(huì)更快,也不用連接處理浮點(diǎn)指針的模塊。如果你一定要,采用浮點(diǎn)指針的話,你應(yīng)該采用西門子 80517 和達(dá)拉斯半導(dǎo)體公司的 80320 這些已經(jīng)對(duì)數(shù),處理進(jìn)行過(guò)優(yōu)化的單片機(jī)。如果你不得不在你的代碼中加入浮點(diǎn)指針,那么你的代碼長(zhǎng)度會(huì)增加程序執(zhí)行速度也會(huì)比較慢。如果浮點(diǎn)指針運(yùn)算能被中斷的話,你必須確保要么中斷中不會(huì)使用浮點(diǎn)指針運(yùn)算,要么在中斷程序前使用 fpsave 指令把中斷指針推入堆棧,在中斷程序執(zhí)行后使用 fprestore 指令把指針恢復(fù),還有一種方法是,當(dāng)你要使用像 sin()這樣的浮點(diǎn)運(yùn)算程序時(shí),禁止使用中斷,在運(yùn)算程序執(zhí)行完之后再使能它。

4、使用位變量

對(duì)于某些標(biāo)志位應(yīng)使用位變量而不是 unsigned char,這將節(jié)省你的內(nèi)存,你不用多浪費(fèi)7位存儲(chǔ)區(qū),而且位變量在RAM中訪問(wèn)他們只需要一個(gè)處理周期。

5、用局部變量代替全局變量

把變量定義成局部變量比全局變量更有效率,編譯器為局部變量在內(nèi)部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,而為全局變量在外部存儲(chǔ)區(qū)中分配存儲(chǔ)空間,這會(huì)降低你的訪問(wèn)速度,另一個(gè)避免使用全局變量的原因是你必須在你系統(tǒng)的處理過(guò)程中調(diào)節(jié)使用全局變量,因?yàn)樵谥袛嘞到y(tǒng)和多任務(wù)系統(tǒng)中,不止一個(gè)過(guò)程會(huì)使用全局變量。

6、為變量分配內(nèi)部存儲(chǔ)區(qū)方式就是減小變量的長(zhǎng)度。使用 C 編程時(shí),我們都習(xí)慣于對(duì)循環(huán)控制變量使用 int 類型,這對(duì) 8 位的單片機(jī)來(lái)說(shuō)是一種極大的浪費(fèi),你應(yīng)該仔細(xì)考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型,很明顯,經(jīng)常使用的變量應(yīng)該是unsigned char,只占用一個(gè)字節(jié)。

2、使用無(wú)符號(hào)類型

為什么要使用無(wú)符號(hào)類型呢?原因是8051不支持

當(dāng)你在程序中使用指針時(shí),你應(yīng)指定指針的類型確定它們指向哪個(gè)區(qū)域如 XDATA 或CODE 區(qū),這樣你的代碼會(huì)更加緊湊,因?yàn)榫幾g器不必去確定指針?biāo)赶虻拇鎯?chǔ)區(qū),因?yàn)槟阋呀?jīng)進(jìn)行了說(shuō)明。

8、使用調(diào)令

對(duì)于一些簡(jiǎn)單的操作,如變量循環(huán)位移,編譯器提供了一些調(diào)令供用戶使用,許多調(diào)令直接對(duì)應(yīng)著匯編指令,而另外一些比較復(fù)雜并兼容 ANSI 所有這些調(diào)令都是再入函數(shù),你可在任何地方安全的調(diào)用他們和單字節(jié)循環(huán)位移指令 RL A 和 RR A 相對(duì)應(yīng)的調(diào)令是_crol_ 循環(huán)左移 和_cror_(循環(huán)右移)。如果你想對(duì) int 或 long 類型的變量進(jìn)行循環(huán)位移,調(diào)令將更加復(fù)雜而且執(zhí)行的時(shí)間會(huì)更長(zhǎng) 對(duì)于 int 類型調(diào)令為_(kāi)irol_,_iror_ ,對(duì)于 long 類型調(diào)令為_(kāi)lrol_,_lror_。在 C 中也提供了像匯編中 JBC 指令那樣的調(diào)令_testbit_ ,如果參數(shù)位置位他將返回1,否則將返回 0 這條調(diào)令在檢查標(biāo)志位時(shí)十分有用,而且使 C 的代碼更具有可讀性調(diào)令將直接轉(zhuǎn)換成 JBC 指令。

#include void serial_intr(void) interrupt 4 {if (!_testbit_(TI)) { // 是否是發(fā)送中斷P0=1; // 翻轉(zhuǎn) P0.0_nop_(); // 等待一個(gè)指令周期P0=0;...}if (!_testbit_(RI)) {test=_cror_(SBUF, 1); // 將SBUF中的數(shù)據(jù)循環(huán)// 右移一位...}}

9、使用宏替代函數(shù)

對(duì)于小段代碼,像使能某些電路或從鎖存器中讀取數(shù)據(jù),你可通過(guò)使用宏來(lái)替代函數(shù)使得程序有更好的可讀性你可把代碼定義在宏中,這樣看上去更像函數(shù)。編譯器在碰到宏時(shí),按照事先定義的代碼去替代宏,宏的名字應(yīng)能夠描述宏的操作,當(dāng)需要改變宏時(shí),你只要修該宏定義處。

#define led_on() {\led_state=LED_ON; \XBYTE[LED_CNTRL] = 0x01;}#define led_off() {\led_state=LED_OFF; \XBYTE[LED_CNTRL] = 0x00;}#define checkvalue(val) \( (val < MINVAL || val > MAXVAL) ? 0 : 1 )

宏能夠使得訪問(wèn)多層結(jié)構(gòu)和數(shù)組更加容易,可以用宏來(lái)替代程序中經(jīng)常使用的復(fù)雜語(yǔ)句以減少你打字的工作量且有更好的可讀性和可維護(hù)性。

10、存儲(chǔ)器模式

C51提供了 3 種存儲(chǔ)器模式來(lái)存儲(chǔ)變量、過(guò)程參數(shù)和分配再入函數(shù)堆棧。你應(yīng)該盡量使用小存儲(chǔ)器模式,很少應(yīng)用系統(tǒng)需要使用其它兩種模式,像有大的再入函數(shù)堆棧系統(tǒng)那樣。一般來(lái)說(shuō)如果系統(tǒng)所需要的內(nèi)存數(shù)小于內(nèi)部RAM 數(shù)時(shí),都應(yīng)以小存儲(chǔ)模式進(jìn)行編譯。在這種模式下 DATA 段是所有內(nèi)部變量和全局變量的默認(rèn)存儲(chǔ)段,所有參數(shù)傳遞都發(fā)生在DATA 段中,如果有函數(shù)被聲明為再入函數(shù),編譯器會(huì)在內(nèi)部 RAM 中為他們分配空間,這種模式的優(yōu)勢(shì)就是數(shù)據(jù)的存取速度很快,但只有120個(gè)字節(jié)的存儲(chǔ)空間供你使用,總共有128個(gè)字節(jié),但至少有8個(gè)字節(jié)被寄存器組使用,你還要為程序調(diào)用開(kāi)辟足夠的堆棧。如果你的系統(tǒng)有 256 字節(jié)或更少的外部 RAM 你可以使用壓縮存儲(chǔ)模式。這樣一來(lái),如果不加說(shuō)明,變量將被分配在 PDATA 段中,這種模式將擴(kuò)充你能夠使用的 RAM 數(shù)量,對(duì)XDATA 段以外的數(shù)據(jù)存儲(chǔ)仍然是很快的,變量的參數(shù)傳遞將在內(nèi)部 RAM 中進(jìn)行,這樣存儲(chǔ)速度會(huì)比較快,對(duì) PDATA 段的數(shù)據(jù)的尋址是通過(guò) R0 和R1進(jìn)行間接尋址,比使用 DPTR 要快一些在大存儲(chǔ)模式中,所有變量的默認(rèn)存儲(chǔ)區(qū)是 XDATA 段 Keil C 盡量使用內(nèi)部寄存器組進(jìn)行參數(shù)傳遞,在寄存器組中可以傳遞參數(shù)的數(shù)量和和壓縮存儲(chǔ)模式一樣,再入函數(shù)的模擬棧將在 XDATA中 對(duì) XDATA 段數(shù)據(jù)的訪問(wèn)是最慢的,所以要仔細(xì)考慮變量應(yīng)存儲(chǔ)的位置使數(shù)據(jù)的存儲(chǔ)速度得到優(yōu)化。

11、混合存儲(chǔ)模式

Keil 允許使用混合的存儲(chǔ)模式,這點(diǎn)在大存儲(chǔ)模式中是非常有用的。在大存儲(chǔ)器模式下,有些過(guò)程對(duì)數(shù)據(jù)傳遞的速度要求很高。我就把過(guò)程定義在小存儲(chǔ)模式寄存器中,這使得編譯器為該過(guò)程的局部變量在內(nèi)部 RAM中分配存儲(chǔ)空間,并保證所有參數(shù)都通過(guò)內(nèi)部 RAM進(jìn)行傳遞。盡管采用混合模式后編譯的代碼長(zhǎng)度不會(huì)有很大的改變,但這種努力是值得的就像能在大模式下把過(guò)程聲明為小模式一樣,你像能在小模式下把過(guò)程聲明為壓縮?;虼竽J剑@一般使用在需要大量存儲(chǔ)空間的過(guò)程上,這樣過(guò)程中的局部變量將被存儲(chǔ)在外部存儲(chǔ)區(qū)中,你也可以通過(guò)過(guò)程中的變量聲明,把變量分配在 XDATA 段中。

12、運(yùn)行庫(kù)

運(yùn)行庫(kù)中提供了很多短小精悍的函數(shù),你可以很方便的使用他們,你自己很難寫(xiě)出更好的代碼了。值得注意的是庫(kù)中有些函數(shù)不是再入函數(shù),如果在執(zhí)行這些函數(shù)的時(shí)候被中斷,而在中斷程序中又調(diào)用了該函數(shù),將得到意想不到的結(jié)果。而且這種錯(cuò)誤很難找出來(lái),最好禁止使用這些函數(shù)的中斷。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    44498

    瀏覽量

    632156
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28310

原文標(biāo)題:8位單片機(jī)的程序優(yōu)化

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TM57PE12 8單片機(jī)使用手冊(cè)

    TM57PE12 8單片機(jī)使用手冊(cè)
    發(fā)表于 12-21 23:03 ?75次下載
    TM57PE<b class='flag-5'>12</b> <b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>使用手冊(cè)

    S12單片機(jī)模塊應(yīng)用及程序下載調(diào)試

    S12單片機(jī)模塊應(yīng)用及程序下載調(diào)試 本次智能車邀請(qǐng)賽采用的MC9S12DG128(以下簡(jiǎn)稱DG128)是Freescale公司推出的S12
    發(fā)表于 11-23 21:13 ?2803次閱讀

    PIC 8單片機(jī)的分類和特點(diǎn)

    PIC 8單片機(jī)的分類和特點(diǎn) PIC單片機(jī)教程 -PIC 8
    發(fā)表于 03-27 17:07 ?2086次閱讀

    8單片機(jī)的C語(yǔ)言優(yōu)化技巧

    8單片機(jī)的C語(yǔ)言優(yōu)化技巧 進(jìn)行優(yōu)化前,請(qǐng)切記: 完善的代碼好于任何優(yōu)化編譯器 編譯器生成的是您
    發(fā)表于 11-21 15:36 ?543次下載
    <b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>的C語(yǔ)言<b class='flag-5'>優(yōu)化</b>技巧

    8單片機(jī)中那個(gè)溢出問(wèn)題最容易被忽視

    本文檔的主要內(nèi)容詳細(xì)介紹的是8單片機(jī)中那個(gè)溢出問(wèn)題最容易被忽視。
    發(fā)表于 07-18 17:38 ?3次下載
    <b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>中那個(gè)溢出問(wèn)題最容易被<b class='flag-5'>忽視</b>

    如何使用51單片機(jī)實(shí)現(xiàn)8數(shù)碼管動(dòng)態(tài)顯示12數(shù)字程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用51單片機(jī)實(shí)現(xiàn)8數(shù)碼管動(dòng)態(tài)顯示12數(shù)字學(xué)號(hào)的C語(yǔ)言程序
    發(fā)表于 06-28 17:42 ?18次下載
    如何使用51<b class='flag-5'>單片機(jī)</b>實(shí)現(xiàn)<b class='flag-5'>8</b><b class='flag-5'>位</b>數(shù)碼管動(dòng)態(tài)顯示<b class='flag-5'>12</b><b class='flag-5'>位</b>數(shù)字<b class='flag-5'>程序</b>免費(fèi)下載

    8單片機(jī)和32單片機(jī)的應(yīng)用

     現(xiàn)在在單片機(jī)應(yīng)用市場(chǎng),仍然是以8單片機(jī)和32單片機(jī)為主導(dǎo)。在產(chǎn)品應(yīng)用上,當(dāng)然是物盡其用。那
    發(fā)表于 06-26 14:31 ?6391次閱讀

    單片機(jī)開(kāi)發(fā)小程序

    如何使用單片機(jī)開(kāi)發(fā)小程序單片機(jī)一般都是通過(guò)燒寫(xiě)hex或是bin文件來(lái)進(jìn)行程序升級(jí),這個(gè)方法是在8、16、32
    發(fā)表于 11-13 12:36 ?10次下載
    <b class='flag-5'>單片機(jī)</b>開(kāi)發(fā)小<b class='flag-5'>程序</b>

    8單片機(jī)程序優(yōu)化

    一個(gè)提高代碼效率的最基本的方式就是減小變量的長(zhǎng)度。使用 C 編程時(shí),我們都習(xí)慣于對(duì)循環(huán)控制變量使用 int 類型,這對(duì) 8 單片機(jī)來(lái)說(shuō)是一種極大的浪費(fèi),你應(yīng)該仔細(xì)考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型,很明顯
    發(fā)表于 02-09 10:42 ?3次下載
    <b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>程序</b><b class='flag-5'>優(yōu)化</b>

    基于89C51單片機(jī)8LED右移源程序

    基于89C51單片機(jī)8LED右移源程序
    發(fā)表于 05-16 10:50 ?3次下載

    基于89C51單片機(jī)8LED左移源程序

    基于89C51單片機(jī)8LED左移源程序
    發(fā)表于 05-12 16:50 ?1次下載

    基于89C51單片機(jī)8端口檢測(cè)8獨(dú)立按鍵源程序

    基于89C51單片機(jī)8端口檢測(cè)8獨(dú)立按鍵源程序
    發(fā)表于 05-16 10:49 ?1次下載

    8單片機(jī)和32單片機(jī)如何選擇?8單片機(jī)和32單片機(jī)的區(qū)別

    8和32單片機(jī)如何選擇適合,以及主要區(qū)別!
    的頭像 發(fā)表于 09-16 10:51 ?1374次閱讀

    為什么需要更多8單片機(jī)

    為什么需要更多8單片機(jī)?
    的頭像 發(fā)表于 10-17 17:02 ?713次閱讀
    為什么需要更多<b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>?

    如何優(yōu)化單片機(jī)項(xiàng)目的功耗

    在現(xiàn)代電子設(shè)計(jì)中,功耗優(yōu)化已成為一個(gè)不可忽視的重要議題。對(duì)于單片機(jī)(MCU)項(xiàng)目而言,功耗不僅關(guān)系到產(chǎn)品的能效比,還直接影響到電池壽命和熱管理。 硬件層面的功耗
    的頭像 發(fā)表于 11-01 14:16 ?142次閱讀