TMS320C54x系列DSP的中斷機制
(3.1) 在擴展模式下,雖然程序空間擴為8M,但如果OVLY=1,則程序空間中存在大量的重疊區域,如C5416在OVLY=1的情況下真正可用的程序空間最大為4.03M。有的場合需要的程序空間大于4.03M,就必須使用OVLY=0的情況。這個時候程序空間不存在重疊區域,但可以模擬出來。方法是:把中斷向量表拷貝到會發生中斷的每一頁程序空間,如圖4所示。這樣,中斷的時候就能正確找到中斷向量表而實現中斷跳轉。
比較上面的四種方法,方法(2.1)更為適應普遍的情況。它不限制ISR的地址范圍,而中斷向量表只占0x80的空間,把它放到數據空間的重疊區域是很容易做到的。筆者正在做的項目正是采用了這種方法。

3 DSP/BIOS下中斷的管理
DSP/BIOS是TI近來推出的準實時操作系統,它同樣支持擴展地址模式,只是需要將Global Settings中的函數調用模式設置為Far就可以了。需要強調的是:BIOS只支持OVLY=1的擴展模式,而不支持OVLY=0的擴展模式。擴展模式下在BIOS Code中會多出一個段“.bios:.norptb”,這個段會被自動放入Overlay Memory之中,具體原因請參看參考文獻。BIOS管理的線程有四種類型:HWI、SWI、TSK以及IDL。上面所提到的所有中斷屬于優先級最高的HWI線程。每個中斷向量都是以HWI模塊的Object形式存在,可以用BIOS下的Configuration Tool來配置每個中斷向量所觸發的函數。在Configuration Tool中,會發現System的MEM模塊下有一個名為VECT的Object,它實質上是用來給中斷向量表分配存儲空間的,用戶可以自己配置中斷向量表的地址(必須是128的倍數)。地址的分配方法可以參考上面提到的幾種應對技巧。下面就BIOS下的中斷做出幾點說明:
·在Object的屬性框中填寫中斷函數名時,如果中斷函數是由C語言編寫的,則需要在函數名前加下劃線(C語言和匯編語言相互調用的需要)。匯編語言則不需要。
·在編寫中斷函數的時候不能再用關鍵字interrupt來說明中斷函數,因為BIOS已經自動包括了這個功能。如果再用interrupt,則會造成致命后果。
·如果中斷函數是用匯編語言編寫的,中斷函數應夾在BIOS的API HWI_enter和HWI_exit之間。這樣,在中斷處理的時候會正確保存和恢復一些需要使用的寄存器,并妥善處理線程間的關系以及中斷函數中對BIOS API的調用;如果中斷函數是用C語言編寫的,則必須使用HWI Dispatcher屬性,作用和前面是一樣的。如果想了解更多東西可以參看參考文獻。
·在BIOS中的SWI(軟件中斷)模塊下,用戶可以自己添加軟件中斷對象。但是必須從概念上分清楚,這里添加的軟件中斷和在前面提到的軟件中斷(即由INTR、TRAP、RESET觸發的中斷)是完全不同的概念。這里的軟件中斷并不屬于中斷向量表里的中斷向量(顯然中斷的個數也不會存在限制),并且它可以帶兩個參數(前面的中斷函數是不能帶參數的)。所以從幾個方面看這里的軟件中斷函數更象是通常意義上的一般函數。
在剛開始使用DSP/BIOS的時候可能會覺得比較麻煩,需要理解的東西也很多。但當你熟悉了以后會發現,它能幫你節省不少時間去處理底層的東西,而使你將更多的精力放在算法的實現上。
本文全面介紹了C54x系列DSP的中斷機制,以及中斷在使用過程中的一些技巧,闡述了整個中斷的響應過程和一些比較容易出錯的地方。希望通過共享使大家更快更好地掌握C54x的中斷處理。
評論