關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 與編譯器開發商密切合作優化微控制器開發

        與編譯器開發商密切合作優化微控制器開發

        作者: 時間:2010-05-03 來源:網絡 收藏

        直接尋址
        如在指針位移一節所述, AVR原來有一個頁面直接尋址模式,但是,對于該模式難于使用,且效率較低。由于我們需要更多的編碼空間來增加位移量,因此取消了頁面直接尋址模式。不過,如果完全沒有直接尋址模式,代碼效率也會降低,因為在有些情況下需要訪問存放在數據存儲器中的變量。尤其是處理靜態字符時,代碼開銷將會很大(達到50%),因為靜態變量必須保存在數據存儲器中,不能自動放置到寄存器中。為了克服代碼效率低下的問題,我們占用一個16位地址來增加一些非頁面直接尋址指令。這樣,就可用一條指令來完成64KB數據空間的尋址。要訪問如此大的一個存儲器區域,訪問指令必須是兩個16位字。


        如果訪問的字節數少(例如讀取一個字符),使用這種尋址方式的效率高于指針方式。對于較大的區域,可能仍然是使用間接尋址比較有效(參見下面的示例)。


        Loading of a character:
          Indirect addressing (6 Bytes): Direct addressing (4 Bytes):
         LDI R30,LOW(CHARVAR) LDS R16,CHARVAR
         LDI R31,HIGH(CHARVAR)
           LD R16, Z
        Loading of a long integer:
         Indirect addressing (12 Bytes) Direct addressing (16 Bytes)
         LDI R30,LOW(LONGVAR) LDS R0,LONGVAR
        LDI R31,HIGH(LONGVAR) LDS R1,LONGVAR+1
           LDD R0,Z LDS R2,LONGVAR+2
           LDD R1,Z+1 LDS R3,LONGVAR+3
           LDD R2,Z+2
           LDD R3,Z+3


        零標志傳播
        為實現條件轉移,需要使用一些指令來操作由一些標志(flag)構成的AVR狀態寄存器。跟在這類指令之后的條件轉移指令(conditional branch instruction)是否執行轉移,取決于這些標志的設置。使用運算指令操作這些標志,就可檢查一個數A與另一個數B之間的大小關系。當被檢查的數為8位的數時,不存在什么問題,因為所有標志都依賴一條指令設置的標志值。當被檢查的數為16位或32位的數時(這在C語言中是常有的情況),問題就有點棘手了,例如一個32位減法操作就相當于要連續進行4個8位減法操作,而每做一次8位減法,就會產生一組新的標志。


        為傳播進位標志,大多數處理器都包含一些能處理進位標志先前設置值的指令。例如,帶進位的減法(SBC)指令;執行SBC A,B語句就相當于將A變成進位位。但要正確完成所有的條件轉移操作,這里還有另一個標志需要傳播,即零標志。


        示例:
           A=R3:R2:R1:R0,
           B=R7:R6:R5:R4


        我們打算從A中減去B,并如果A=B就跳轉到一個指定位置。如果這個零標志只依賴于最后的運算指令,那么下面的指令將不會執行:


           SUB R0,R4
           SBC R1,R5
           SBC R2,R6
           SBC R3,R7 ; R3=R7
           => Zero flag set
           BREQ destination


        這是因為BREQ指令使用的標志值只取決于最后的SBC指令設置的標志值。如果大多數高位直接相等,即便32位數不相等,零標志也將被置位,而轉移也會被執行。這種問題也會出現在其他的條件轉移上。


        有兩種辦法可以解決這個問題。一是保存每個指令產生的標志,然后在第四個減法完成后檢查所有的零標志。另一個更精細的方法是在進位指令中傳播零標志(參見下面方式):


        Znew =Not(R7) AND
           Not(R6) AND
           ...
           Not(R0) AND
           Zold


        使用這種方式傳播零標志,所有條件轉移在最后一個減法操作完成后都會被執行,因為參與標志(溢出和正數標志)所剩部分只取決于最高位字節。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 长兴县| 永寿县| 钟山县| 星座| 都江堰市| 湖州市| 康定县| 潼关县| 兴城市| 井冈山市| 澄江县| 双江| 安平县| 池州市| 武山县| 肃北| 赤水市| 墨竹工卡县| 抚顺市| 阳新县| 宜章县| 淅川县| 安福县| 东光县| 临夏市| 眉山市| 东乌珠穆沁旗| 临澧县| 吉林省| 郁南县| 额尔古纳市| 和林格尔县| 时尚| 枞阳县| 台山市| 梁平县| 英吉沙县| 曲阳县| 奈曼旗| 公安县| 枣阳市|