新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于TMS320C62X DSP的混合編程研究

        基于TMS320C62X DSP的混合編程研究

        作者: 時間:2008-08-12 來源:網絡 收藏
          TMS320C62X是美國德州儀器公司()的新一代高性能定點數字信號處理器()芯片。基于的軟件設計問題,就是采用編程語言進行算法實現并使程序效率盡量滿足實時性要求。 的軟件設計可以采用語言、高級語言(C/C++)以及語言的。完全采用語言編程復雜性高、開發周期長,而完全采用編程則程序的執行效率相對較低,不能滿足實時性的要求。為了設計出性價比最好、開發周期較短、比較復雜的DSP系統,可以采用混合語言編程,把和匯編語言的優點有效地結合起來。C語言和匯編語言的有三種形式:在編寫C語言代碼中插入匯編語句,只需在匯編語句兩邊加上雙引號和括號,在括號前面加上標識asm,如asm(“匯編語句”);在編寫C代碼的過程中調用內聯函數,TMS320C62X中有一些直接映射為內聯的C6000指令的特殊函數,內聯函數用前下劃線(_)表示,使用時同調用C語言的庫函數一樣調用它,如b=_nassert(N>=10);匯編代碼以C代碼可以調用的函數出現。本文采用第三種形式。為了使程序代碼的執行具有盡可能高的執行效率,本文將著重點放在并行匯編代碼的編程,而不是線性匯編代碼的編程。

          1 C語言與匯編語言的接口規范和標準

          用C語言編寫的代碼中核心代碼常常只是整個程序代碼的5%,但是卻占用了整個程序約95%的執行時間。對這些核心代碼采用匯編語言編寫,可以大大提高代碼的執行效率,而C語言程序可以象調用C程序的一個函數那樣去調用這個匯編函數。為了實現C語言和匯編語言的混合編程,需要注意一些規定的接口規范和標準。

          (1)采用C語言和匯編語言混合編程時,TMS320C62X定義了一套嚴格的寄存器規則。這個寄存器規則表明了編譯器如何使用這些寄存器以及在函數調用過程中如何保護這些寄存器。

          調用函數保護了寄存器A0~A9和B0~B9,這就使得在編寫匯編程序的時候可以任意的使用這幾個寄存器而不需保護它們。但當使用到寄存器A10~A15或B10~B15的時候,則必須自行對它們進行保護。長型、雙精度型或者是長雙精度型的數據對象要放在一個奇/偶寄存器對(如A1:A0)里,奇數寄存器存放著數據的符號位、指數位和最高有效位,而偶數寄存器則存放著低有效位。

          在默認情況下,A3用作返回結構指針寄存器,B3用作被調用函數返回地址寄存器,A15用作幀指針寄存器,B14用作數據頁指針寄存器,B15用作堆棧指針寄存器。這些寄存器在被調用的匯編函數中用到時都要進行保護。

          (2)調用函數將參數傳遞到被調用函數中,前十個參數將被從左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果傳遞的參數是長型、雙精度型或者是長雙精度型,則將參數依次放入寄存器組A5:A4、B5:B4、A7:A6等,并將剩下的變量按相反的順序放在堆棧里。注意,如果傳遞的參數是一個結構類型的參數,則傳遞的是該結構類型的地址。 

          (3)如果在C/C++調用函數中做了正確的函數返回聲明,則被調用的匯編函數可以返回有效值。如果返回值是整型或32位的浮點型,則放在寄存器A4中返回;如果返回值是雙精度或是長雙精度型,則放在A5:A4中返回;如果返回值是一個結構類型,則將其結構的地址放在A3中返回。

          (4)編譯器為所有的外部對象指定一個鏈接時的名字。當寫匯編語言代碼時,必須用與這個名字相同的名字。對于只在匯編語言模塊中用到的變量的標識符,不能從下劃線開始。任何一個在匯編語言中聲明的對象都要使其在C/C++中是可訪問的,那么在匯編語言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語言中要引用C/C++函數或對象時,必須用.ref 或.global將C/C++對象聲明,這將產生一個在匯編語言函數中沒有定義的由鏈接器辨識的外部引用。

          還有一些細節也需要注意,如中斷子程序必須把該子程序將要用到的所有寄存器進行入棧處理;除了全局變量的初始化外,匯編語言的模塊不得因為任何目的而使用.cinit段;匯編代碼的結束需用指令B.s2 B3將程序執行從被調用函數返回到C語言調用函數中。

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 阿坝县| 通山县| 安龙县| 拜泉县| 建平县| 伊通| 平远县| 吴忠市| 松原市| 蒙城县| 安达市| 漳平市| 遵义市| 沾益县| 皋兰县| 成安县| 葵青区| 井陉县| 大同市| 手游| 汉阴县| 灵山县| 周宁县| 肃宁县| 纳雍县| 临泉县| 朝阳区| 万州区| 大洼县| 镇康县| 德清县| 英吉沙县| 黄冈市| 海城市| 柘城县| 府谷县| 罗城| 大城县| 永安市| 定南县| 年辖:市辖区|