日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
C51編寫優(yōu)化的代碼
C51編寫優(yōu)化的代碼
 更新時間:2009-12-25 16:43:03  點擊數(shù):0
【字體: 字體顏色

Keil Software — C51 Compiler User’s Guide 341
C附錄C. 編寫優(yōu)化的代碼
    本文列舉了一些針對8051單片機及其C51編譯器的可以提高軟件效能的方法(如:生成更小的
代碼,獲得更快的運行速度等)。在大多數(shù)情況下,這些方法都可以起到很好的作用。存儲器模式
/Memory Model 減少代碼尺寸和提高運行速度的最有效的方式是將編譯器的存儲器模式設(shè)定為小模
式。該模式下,編譯器可以生成最小的代碼。
    使用小模式的關(guān)鍵字是 SMALL。 在小模式下,所有的變量(除非是顯式地進行了存儲位置申
明),都存放在8051芯片的內(nèi)部存儲器中。而8051對內(nèi)部存儲器的訪問速度是最快的(典型情況下
為1或2個時鐘周期),并且產(chǎn)生的訪問這些變量的代碼也是最少的,指令是最短的。請參看下面的
循環(huán)代碼:
    for (i = 0; i < 100; i++)
    {
        do_nothing ();
    }
    在不同的編譯模式下(小模式和巨模式),將生成不同的目標代碼。
stmt level source
1 #pragma small
2
3 void do_nothing (void);
4
5
6 void func (void)
7 {
8 1 unsigned char i;
9 1
10 1 for (i = 0; i < 100; i++)
11 1 {
12 2     do_nothing ();
13 2 }
14 1 }
; FUNCTION func (BEGIN)
; SOURCE LINE #10
0000 E4             CLR A
0001 F500 R         MOV i,A
0003            ?C0001:
0003 E500 R         MOV A,i
0005 C3             CLR C
0006 9464           SUBB A,#064H
0008 5007           JNC ?C0004
; SOURCE LINE #12
000A 120000 E       LCALL do_nothing
; SOURCE LINE #13
000D 0500 R         INC i
000F 80F2           SJMP ?C0001
; SOURCE LINE #14
0011            ?C0004:
0011 22             RET
; FUNCTION func (END)
    在小模式下,變量I被放置在內(nèi)部數(shù)據(jù)存儲器中。訪問變量I的指令,如:

        MOV     A,i
 和     INC     I
    只需要2字節(jié)。每條指令運行只需要1個時鐘周期。整個代碼長度只有17字節(jié)。
下面是同樣的代碼在巨模式下的編譯結(jié)果:
; FUNCTION func (BEGIN)
; SOURCE LINE #10
0000 E4             CLR A
0001 900000 R       MOV DPTR,#i
0004 F0             MOVX @DPTR,A
0005            ?C0001:
0005 900000 R       MOV DPTR,#i
0008 E0             MOVX A,@DPTR
0009 C3             CLR C
000A 9464           SUBB A,#064H
000C 500B           JNC ?C0004
; SOURCE LINE #12
000E 120000 E       LCALL do_nothing
; SOURCE LINE #13
0011 900000 R       MOV DPTR,#i
0014 E0             MOVX A,@DPTR
0015 04             INC A
0016 F0             MOVX @DPTR,A
0017 80EC           SJMP ?C0001
; SOURCE LINE #14
0019            ?C0004:
0019 22             RET
; FUNCTION func (END)
    在巨模式下,變量i被放置在外部數(shù)據(jù)存儲器中。為訪問變量I,編譯器必須首先加載數(shù)據(jù)指針
指向正確的地址(參見偏移0001h到0004h)。這2條指令就需要4個時鐘周期。使變量i 增量的操
作需要6 字節(jié)的存儲空間及7個時鐘周期?偟拇a大小達到25 字節(jié)。變量定位原則是將需要頻繁
訪問的數(shù)據(jù)對象放置在8051的內(nèi)部數(shù)據(jù)存儲器中。硬件訪問內(nèi)部數(shù)據(jù)存儲器要比訪問外部數(shù)據(jù)存儲
器有效的多。內(nèi)部數(shù)據(jù)存儲器由寄存器組、位變量區(qū)域、堆棧和其它用戶自定義變量共享?梢允
用關(guān)鍵字data來指定。
    由于受存儲容量的限制(內(nèi)部數(shù)據(jù)存儲器為128字節(jié),最多256字節(jié))。 在整個軟件中使用的
所有該類型變量都將占據(jù)這個區(qū)域,并且總的尺寸不能超過相應(yīng)芯片的物理限制。在某些情況下,
就不得不將一些數(shù)據(jù)對象放置到外部數(shù)據(jù)存儲器中。有2種辦法可以進行該操作。

一是:改變存儲模式,讓編譯器來自動完成該操作。這是最簡單的方法,但需要產(chǎn)生更多的代碼并
     降低運行速度。
二是:手工將需要放置在外部數(shù)據(jù)存儲器中的數(shù)據(jù)對象使用關(guān)鍵字xdata進行申明。這種方式不會
     產(chǎn)生額外的代碼。

變量尺寸
    8051系列是8位的CPU。使用8位的數(shù)據(jù)類型將比使用其它類型的數(shù)據(jù)要有效的多(如:char
和unsigned char就比使用int或long類型有效)。所以,在任何情況下應(yīng)該首先使用最短的數(shù)
據(jù)類型。
    C51編譯器直接支持所有的字節(jié)操作指令。除非特別指明,否則字節(jié)類型不會被轉(zhuǎn)換成整數(shù)類
型來操作。參見INTPROMOTE關(guān)鍵字。
例如:兩個字節(jié)類型的數(shù)據(jù)乘操作,將直接使用8051的單指令MUL AB。而如果使用其它類型的數(shù)
據(jù),則會導(dǎo)致對編譯器庫函數(shù)的調(diào)用。

無符號類型Unsigned
    8051系列的處理器并不直接支持浮點數(shù)的運算。因此,編譯器必須對浮點數(shù)運算產(chǎn)生額外的
代碼。因此,任何時候都必須首先考慮使用無符號數(shù)據(jù)類型。

局部變量
    在遇到循環(huán)或其它臨時計算操作時,應(yīng)盡可能地使用局部變量。作為編譯器優(yōu)化處理過程的一
部分,臨時變量將被編譯器盡可能地放置在寄存器中。而寄存器訪問是最快速的。在具體程序中,
可以申明為unsigned char和unsigned int變量類型。

其它原因
    通常最影響程序代碼質(zhì)量的原因并不是編譯器生成代碼的效率,而是軟件本身為解決其目標問
題而使用的算法類型。采用更有效的算法,通常比其它方式來達到減少代碼尺寸和提高運行速度的
目的更為有效。例如:heap排序算法總是比bubble算法更有效。

參考鏈接:http://www.picavr.com/news/2009-11/1719.htm

  • 上一篇: 51單片機鍵盤接口電路(含源程序)
  • 下一篇: 沒有了
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1