国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

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

MCU開發(fā)加油站 ? 來源:MCU開發(fā)加油站 ? 2020-06-15 09:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1、采用短變量

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

2、使用無符號類型

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

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

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

4、使用位變量

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

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

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

6、為變量分配內(nèi)部存儲區(qū)

局部變量和全局變量可被定義在你想要的存儲區(qū)中,根據(jù)先前的討論,當(dāng)你把經(jīng)常使用的變量放在內(nèi)部 RAM 中時,可使你的程序的速度得到提高,除此之外,你還縮短了你的代碼,因為外部存儲區(qū)尋址的指令相對要麻煩一些考慮到存儲速度,按下面的順序使用存儲器DATA IDATA PDATA XDATA,當(dāng)然你要記得留出足夠的堆棧空間。

7、使用特定指針

當(dāng)你在程序中使用指針時,你應(yīng)指定指針的類型確定它們指向哪個區(qū)域如 XDATA 或CODE 區(qū),這樣你的代碼會更加緊湊,因為編譯器不必去確定指針?biāo)赶虻拇鎯^(qū),因為你已經(jīng)進(jìn)行了說明。

8、使用調(diào)令

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

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

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

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

#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 )

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

10、存儲器模式

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

11、混合存儲模式

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

12、運(yùn)行庫

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

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

    關(guān)注

    6076

    文章

    45495

    瀏覽量

    670459
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7402

    瀏覽量

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

    關(guān)注

    0

    文章

    616

    瀏覽量

    29508

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

文章出處:【微信號:mcugeek,微信公眾號:MCU開發(fā)加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    ST7LITE1xB 8 單片機(jī):功能特性與應(yīng)用解析

    ST7LITE1xB 8 單片機(jī):功能特性與應(yīng)用解析 在電子工程領(lǐng)域,單片機(jī)作為核心控制元件,廣泛應(yīng)用于各種嵌入式系統(tǒng)中。ST7LITE1xB 系列
    的頭像 發(fā)表于 03-02 15:10 ?113次閱讀

    LC87F1M16A:多功能8單片機(jī)的詳細(xì)剖析與應(yīng)用指南

    LC87F1M16A:多功能8單片機(jī)的詳細(xì)剖析與應(yīng)用指南 引言 在嵌入式系統(tǒng)設(shè)計領(lǐng)域,單片機(jī)作為核心控制部件,其性能和功能的多樣性直接影響著整個系統(tǒng)的表現(xiàn)。今天我們要深入探討
    的頭像 發(fā)表于 02-28 14:45 ?280次閱讀

    深入解析英飛凌XC835/836 8單片機(jī):特性、參數(shù)與應(yīng)用考量

    深入解析英飛凌XC835/836 8單片機(jī):特性、參數(shù)與應(yīng)用考量 在當(dāng)今的電子設(shè)計領(lǐng)域,單片機(jī)作為核心控制元件,廣泛應(yīng)用于各種電子設(shè)備中。英飛凌的XC835/836
    的頭像 發(fā)表于 02-10 11:05 ?430次閱讀

    瑞薩 8 單片機(jī) 740 族指令系統(tǒng)與設(shè)計要點(diǎn)解析

    瑞薩 8 單片機(jī) 740 族指令系統(tǒng)與設(shè)計要點(diǎn)解析 在電子工程領(lǐng)域,單片機(jī)的應(yīng)用廣泛且至關(guān)重要。瑞薩 8
    的頭像 發(fā)表于 02-09 16:40 ?138次閱讀

    中穎電子8單片機(jī)的I/O設(shè)置介紹

    在嵌入式系統(tǒng)設(shè)計中,單片機(jī)的I/O端口設(shè)置是基礎(chǔ)且關(guān)鍵的一環(huán)。今天我們來詳細(xì)解析中穎電子8單片機(jī)的I/O設(shè)置,幫助工程師更好地理解和應(yīng)用。
    的頭像 發(fā)表于 12-30 09:37 ?737次閱讀
    中穎電子<b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>的I/O設(shè)置介紹

    單片機(jī)位數(shù)的思考(8、16、32

    8、16、32是指單片機(jī)的“字長”,也就是一次運(yùn)算中參與運(yùn)算的數(shù)據(jù)長度,這個位是指二進(jìn)制
    發(fā)表于 11-21 08:31

    32單片機(jī)PY32F003的特性概述

    PY32F003是一款極具性價比的國產(chǎn)入門級32單片機(jī),基于ARM Cortex-M0+內(nèi)核,主頻最高32MHz。提供最大64KB的Flash存儲器和8KB的SRAM,這個容量對于大多數(shù)簡單的控制
    的頭像 發(fā)表于 11-07 16:02 ?1214次閱讀
    32<b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>PY32F003的特性概述

    高能效與靈活性能:Microchip分析8單片機(jī)的持久影響力

    隨著嵌入式系統(tǒng)的不斷發(fā)展,8單片機(jī)所獨(dú)有的性能表現(xiàn)、能效和開發(fā)簡便性,確保了其持久的重要性。無論是延長電池壽命,還是集成智能外設(shè),8
    發(fā)表于 09-04 09:10 ?850次閱讀
    高能效與靈活性能:Microchip分析<b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>的持久影響力

    浮思特 | ABOV 32單片機(jī)的技術(shù)演進(jìn)與行業(yè)應(yīng)用解析

    隨著科技的不斷進(jìn)步,單片機(jī)(MCU)已經(jīng)從最初的8和16時代,逐步邁向了32的時代。32
    的頭像 發(fā)表于 09-01 09:56 ?863次閱讀
    浮思特 | ABOV 32<b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>的技術(shù)演進(jìn)與行業(yè)應(yīng)用解析

    怎么測單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時的時鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測量系統(tǒng)頻率對單片機(jī)應(yīng)用開發(fā)、程序調(diào)試和性能
    的頭像 發(fā)表于 07-25 11:39 ?797次閱讀

    單片機(jī)怎么燒程序

    單片機(jī)程序是將編寫好的程序代碼寫入單片機(jī)內(nèi)部存儲單元,讓單片機(jī)按照預(yù)設(shè)邏輯工作的過程,是單片機(jī)
    的頭像 發(fā)表于 07-23 11:47 ?1310次閱讀

    STC單片機(jī)范例程序

    電子發(fā)燒友網(wǎng)站提供《STC單片機(jī)范例程序.zip》資料免費(fèi)下載
    發(fā)表于 06-04 16:27 ?10次下載

    你們還在用8單片機(jī)嗎?

    最近在公司接手了個挺讓人撓頭的活兒 —— 給一塊老板子換 MCU。說起來這板子還是近五年的產(chǎn)品,用的 STM8 單片機(jī),功能掰著手指頭都能數(shù)過來,估摸著稍微加點(diǎn)復(fù)雜度這 8
    的頭像 發(fā)表于 05-15 11:04 ?656次閱讀
    你們還在用<b class='flag-5'>8</b><b class='flag-5'>位</b><b class='flag-5'>單片機(jī)</b>嗎?