獨立于硬件技術(shù)的XC166單片機的DSP程序優(yōu)化方法

1.4 指令流水線(xiàn)重排
指令流水線(xiàn)重排的意思是通過(guò)軟件程序中的指令重排來(lái)改變指令流水線(xiàn),以此來(lái)排除由于硬件引起的指令堵塞,從而加快程序的運行時(shí)間。這種優(yōu)化操作通常用在匯編程序中,指令流水線(xiàn)重排是一個(gè)一般的優(yōu)化原理,把這個(gè)原理用于不同類(lèi)型的單片機可以導出不同的與單片機硬件相關(guān)的優(yōu)化方法。下面介紹的基于XC166單片機的優(yōu)化方法主要是應用這個(gè)優(yōu)化原理得到的。
2 與芯片相關(guān)的優(yōu)化技術(shù)
2.1 XC166指令流水線(xiàn)
XC166單片機指令流水線(xiàn)共有7級,前兩級為取指令流水線(xiàn),后5級為執行流水線(xiàn),所有指令都必須經(jīng)過(guò)5級執行流水線(xiàn)的每一級。
第1級--指令預取。這一級根據預測順序,把指令從程序管理單元(PMU)取出,取出的指令在跳轉檢測單元進(jìn)行前期處理,以檢測是否有跳轉,預測邏輯決定是否接收轉移。
第2級--取指令。根據轉移預測規則計算出下一條被取指令的指針。對于零機器周期轉移,轉移合并單元先預處理,并將檢測到的轉移與正在執行的指令結合起來(lái)。預取出的指令存在FIFO緩存器中,同時(shí),下一條要執行的指令輸出FIFO緩存器,進(jìn)入執行流水線(xiàn)。
第3級--譯碼。指令被譯碼,如需要,在間接尋址模式中,寄存器文件將被訪(fǎng)問(wèn),以讀取通用寄存器GPR。
第4級--尋址。計算所有操作數地址,對于所有隱含訪(fǎng)問(wèn)系統堆棧的指令,堆棧指針遞減或增加。
第5級--存儲。所有需要的操作數被取出。
第6級--執行。使用已取出的操作數進(jìn)行MAC單元操作。對于非MAC單元指令,在這一級中,指令將由算術(shù)邏輯單元(ALU)執行。條件標志被更新,執行所有直接對CPU特殊功能寄存器CPU_SFRs進(jìn)行寫(xiě)操作的指令,在間接尋址時(shí),作為地址指針的GPRs自動(dòng)遞減或增加。
第7級--寫(xiě)回。所有外部操作數以及剩余的,在內部DPRAM空間內的操作器被寫(xiě)回。定位在內部SRAM中的操作數進(jìn)入寫(xiě)回緩沖區。
下面給出一個(gè)具體例子:


上面程序的指令流水線(xiàn)如表1所列,(Tn表示機器周期)
2.2 數據相關(guān)性排除
在XC166的CPU中,由于指令流水線(xiàn)的設計要求,在使用通用寄存器(GPRs)的指令之間存在一些數據相互依賴(lài)的情況,盡管XC166單片機已經(jīng)使用了專(zhuān)用硬件來(lái)檢測及解決數據相關(guān)性,但仍然有一些不可避免的數據相關(guān)性。在編程時(shí),可以充分利用數據相關(guān)性來(lái)達到程序優(yōu)化的目的,比如,在用GPR作為間接尋址指針時(shí),如果PGR中的地址值被改變,間接尋址操作必須等待2個(gè)機器指令周期后,才能使用GPR作為地址指針尋址。在這種情況下,可以在這2個(gè)等待機器周期內插入2條其他單機器周期指令,充分利用這2個(gè)周期的等待時(shí)間以便程序更優(yōu)化。
下面舉一個(gè)例子:

另外一種數據相關(guān)性發(fā)生在間接尋址訪(fǎng)問(wèn)內存時(shí),XC166單片機中的地址產(chǎn)生單元使用推測原理,在地址譯碼前,數據的讀取路經(jīng)將根據歷史記錄表中選出;在歷史記錄表中,每個(gè)GPR都有一個(gè)入口。這些入口記錄了用相應GPR所訪(fǎng)問(wèn)的內存空間情況。如果這種預測發(fā)生錯誤,讀取操作必須重新開(kāi)始。
因此,如果用GPR作為間接尋址,GPR最好能指向相同內存空間。如果更新后的GPR指向不同內存空間,下一個(gè)操作將出現訪(fǎng)問(wèn)錯誤,讀操作必須重復,這就產(chǎn)生了指令流水線(xiàn)堵塞。例如:

評論