久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1603|回復: 0
收起左側

8位單片機的程序優化11條

[復制鏈接]
ID:105323 發表于 2016-3-4 16:42 | 顯示全部樓層 |閱讀模式
1 采用短變量一個提高代碼效率的最基本的方式就是減小變量的長度。使用 C 編程時,我們都習慣于對循環控制變量使用 int 類型,這對 8位的單片機來說是一種極大的浪費,你應該仔細考慮你所聲明的變量值可能的范圍,然后選擇合適的變量類型,很明顯,經常使用的變量應該是unsignedchar,只占用一個字節。

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

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

4 使用位變量
對于某些標志位應使用位變量而不是 unsignedchar,這將節省你的內存,你不用多浪費7位存儲區,而且位變量在RAM中訪問他們只需要一個處理周期。

5 用局部變量代替全局變量
把變量定義成局部變量比全局變量更有效率,編譯器為局部變量在內部存儲區中分配存儲空間,而為全局變量在外部存儲區中分配存儲空間,這會降低你的訪問速度,另一個避免使用全局變量的原因是你必須在你系統的處理過程中調節使用全局變量,因為在中斷系統和多任務系統中,不止一個過程會使用全局變量。

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

7 使用特定指針
當你在程序中使用指針時,你應指定指針的類型確定它們指向哪個區域如 XDATA 或CODE區,這樣你的代碼會更加緊湊,因為編譯器不必去確定指針所指向的存儲區,因為你已經進行了說明。

8 使用調令
對于一些簡單的操作,如變量循環位移,編譯器提供了一些調令供用戶使用,許多調令直接對應著匯編指令,而另外一些比較復雜并兼容ANSI 所有這些調令都是再入函數,你可在任何地方安全的調用他們和單字節循環位移指令 RL A 和 RR A相對應的調令是_crol_ 循環左移 和_cror_(循環右移)。如果你想對 int 或 long類型的變量進行循環位移,調令將更加復雜而且執行的時間會更長 對于 int 類型調令為_irol_,_iror_ ,對于 long類型調令為_lrol_,_lror_。在 C 中也提供了像匯編中 JBC 指令那樣的調令_testbit_,如果參數位置位他將返回1,否則將返回 0 這條調令在檢查標志位時十分有用,而且使 C 的代碼更具有可讀性調令將直接轉換成 JBC指令。
#include <instrins.h>
void serial_intr(void) interrupt 4 {
if (!_testbit_(TI)) {   //是否是發送中斷
   P0=1;                // 翻轉 P0.0
  _nop_();              // 等待一個指令周期
   P0=0;
  ...                  
}
if (!_testbit_(RI)) {
   test=_cror_(SBUF, 1); // 將SBUF中的數據循環
                        // 右移一位
   ...                  
}
}

8 使用宏替代函數
對于小段代碼,像使能某些電路或從鎖存器中讀取數據,你可通過使用宏來替代函數使得程序有更好的可讀性你可把代碼定義在宏中,這樣看上去更像函數。編譯器在碰到宏時,按照事先定義的代碼去替代宏,宏的名字應能夠描述宏的操作,當需要改變宏時,你只要修該宏定義處。
#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 )
宏能夠使得訪問多層結構和數組更加容易,可以用宏來替代程序中經常使用的復雜語句以減少你打字的工作量且有更好的可讀性和可維護性。

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

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

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












回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久精| 激情欧美一区二区三区中文字幕 | 国产免费拔擦拔擦8x高清 | 亚洲狠狠 | 二区高清 | 成人乱人乱一区二区三区软件 | 国产人成精品一区二区三 | 久热电影| 操人网站 | 欧美操操操 | 蜜桃av人人夜夜澡人人爽 | 国产良家自拍 | 91极品欧美视频 | 欧美日韩亚洲一区 | 蜜臀av日日欢夜夜爽一区 | 国产黄色av电影 | 特级丰满少妇一级aaaa爱毛片 | 色婷综合网 | 亚洲精品粉嫩美女一区 | 亚洲欧美综合网 | 欧美精品综合 | 亚洲精品成人av久久 | 国产精品久久亚洲 | 午夜精品视频在线观看 | www.久草.com| 日韩亚洲一区二区 | 男人av的天堂 | 久久综合一区二区三区 | 99热精品国产 | 黄色高清视频 | 奇米影视在线 | 国产成人艳妇aa视频在线 | 成人精品一区 | 欧美日韩国产欧美 | 日韩精品一区二区三区老鸭窝 | 久操av在线 | 日韩欧美三级 | 欧美日韩国产一区二区三区 | 亚洲精品电影在线观看 | 紧缚调教一区二区三区视频 | 午夜婷婷激情 |