<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > TMS320C54x系列DSP的中斷機(jī)制及使用技巧

          TMS320C54x系列DSP的中斷機(jī)制及使用技巧

          作者: 時(shí)間:2012-07-02 來源:網(wǎng)絡(luò) 收藏

          1 C54x中的

          本文引用地址:http://www.ex-cimer.com/article/148827.htm

            信號(hào)實(shí)質(zhì)上是由硬件或者是軟件驅(qū)動(dòng)的信號(hào),它能使暫停正在執(zhí)行的程序并進(jìn)入服務(wù)程序(ISR)。在最典型的系統(tǒng)中,如果A/D轉(zhuǎn)換器需要送數(shù)據(jù)到中,或者D/A轉(zhuǎn)換器需要從DSP中取走數(shù)據(jù),都是通過硬件中斷向DSP發(fā)出請(qǐng)求的。

            C54xDSP支持軟件中斷和硬件中斷。軟件中斷是由指令(INTR、TRAP、RESET)觸發(fā)的,硬件中斷是由外圍器件觸發(fā)的。硬件中斷實(shí)際上又分為兩類:一類是由DSP的片外外設(shè)(如A/D轉(zhuǎn)換器)觸發(fā)的,另外一類是由DSP的片內(nèi)外設(shè)(如定時(shí)器中斷)觸發(fā)的。硬件中斷又有優(yōu)先級(jí)的區(qū)分,這是為了處理同一時(shí)刻有多個(gè)硬件中斷源觸發(fā)中斷的情況。硬件中斷的種類和優(yōu)先級(jí)請(qǐng)參看具體使用的芯片資料。

            如果按照可屏蔽情況分類,中斷又可分為可屏蔽中斷(C54x至多支持16個(gè))和不可屏蔽中斷??善帘沃袛嗍躍T1寄存器中的INTM位和IMR寄存器中相應(yīng)位的影響。當(dāng)INTM=0時(shí),IMR中某位為1,則開放相應(yīng)的中斷。其實(shí),在C54x中硬件中斷并不一定要由外圍器件觸發(fā),它同樣可以由指令I(lǐng)NTR、TRAP觸發(fā),并且不受INTM的限制。有一點(diǎn)需要引起注意的是:指令RESET復(fù)位和硬件RS復(fù)位對(duì)IPTR和外圍電路初始化是不相同的。硬件復(fù)位時(shí)IPTR總是被置為0x1FF,軟件復(fù)位時(shí)則不會(huì)修改當(dāng)前IPTR的值。C54x的中斷處理過程分為三個(gè)階段:

           ?、僦袛嗾?qǐng)求??梢杂糜布骷蛘哕浖噶钫?qǐng)求中斷。如果請(qǐng)求的中斷是可屏蔽中斷,則IFR寄存器中相應(yīng)的位被置為1,而不管中斷是否會(huì)被響應(yīng)。

           ?、谥袛囗憫?yīng)。對(duì)于軟件中斷和不可屏蔽中斷,CPU是立即響應(yīng)的。對(duì)于可屏蔽中斷,要滿足下列條件才能響應(yīng):

            ·優(yōu)先級(jí)最高(同時(shí)出現(xiàn)多個(gè)中斷時(shí))

            ·INTM位為0

            ·IMR中相應(yīng)位為1

            CPU在取到軟件向量的第一個(gè)字后會(huì)產(chǎn)生IACK信號(hào),對(duì)可屏蔽中斷而言,IACK會(huì)清除IFR中相應(yīng)位。

           ?、壑袛嗵幚怼1Wo(hù)特定的寄存器,執(zhí)行中斷服務(wù)程序,完成后恢復(fù)寄存器。保護(hù)寄存器的原則是執(zhí)行中斷服務(wù)程序后能正確返回并恢復(fù)原來運(yùn)行程序的環(huán)境。

            DSP中提供的中斷是以中斷向量表(VECT)的形式出現(xiàn)的(見表1)。中斷向量表的長(zhǎng)度為128個(gè)字節(jié),每個(gè)中斷分配為4個(gè)字節(jié),一共有32個(gè)中斷,具體的中斷要看相應(yīng)的芯片。C54x中斷向量表的地址是由PMST寄存器中的IPTR構(gòu)成高9位地址形成的,所以向量表的地址必須是128的倍數(shù)。硬件復(fù)位時(shí),IPTR總是默認(rèn)置為0x1FF,所以中斷向量表地址為0xFF80。每個(gè)中斷向量的地址按如下構(gòu)成方法形成:PC=(IPTR)7+(Vector[n])2 (Vector[n]為中斷向量號(hào),在0~31之間),中斷向量號(hào)左移兩位是因?yàn)槊總€(gè)中斷向量占用4個(gè)字節(jié)的緣故。中斷向量表總是以匯編的形式出現(xiàn)的。

            


            2 擴(kuò)展地址模式下的中斷控制

            早期的DSP共有192K的空間(程序、數(shù)據(jù)和I/O空間各為64K),隨著DSP處理能力越來越強(qiáng),192K的空間已經(jīng)不能滿足需要。后來的C54x均提供了擴(kuò)展地址模式,使程序空間擴(kuò)展到8M。擴(kuò)展模式下的中斷控制有自己特殊的地方,有必要進(jìn)行說明。

            擴(kuò)展模式下程序空間的尋址是通過寄存器PC和XPC一同進(jìn)行的。PC構(gòu)成低16位地址位,XPC構(gòu)成高7位地址位。所以保存和恢復(fù)XPC是用戶必須注意的。如果用戶使用的是Far Call指令,則XPC會(huì)自動(dòng)保存和恢復(fù)。但在進(jìn)行中斷處理的時(shí)候,只有16位的PC寄存器能夠自動(dòng)得到保存(這是由于考慮了非擴(kuò)展模式下中斷的效率問題),所以XPC必須由用戶自己來保存,否則在中斷返回的時(shí)候往往會(huì)跳到不同的頁面(由返回前后XPC值的不同引起)造成不可預(yù)測(cè)的后果。程序如表1所示。

            由于必須在長(zhǎng)跳轉(zhuǎn)之前保存XPC的值,沒法使用延遲指令(如FBD),所以中斷時(shí)延會(huì)增加兩個(gè)周期。

            再來考慮另外一種情況:設(shè)程序運(yùn)行在XPC=2的頁面上,如果這個(gè)時(shí)候有中斷發(fā)生并得到了CPU的響應(yīng),DSP會(huì)加載PC:PC=(IPTR)7+(Vector[n])2,XPC的值不發(fā)生變化,于是中斷向量的地址為:0x20000+0xPC。這就明顯地說明:中斷向量表必須和應(yīng)用程序在同一64K的程序空間頁面內(nèi)。如果應(yīng)用程序不是只分布在一個(gè)程序空間頁面內(nèi),那應(yīng)該如何處理呢?可分三種類型共四種技巧來應(yīng)對(duì)這樣的情況:(1.1)描述的是OVLY為任意的情況;(2.1)~(2.2)描述的是OVLY=1的情況;(3.1)描述的是OVLY=0的情況。

            (1.1)有的應(yīng)用中,一些程序一旦運(yùn)行是不允許中斷的。把不允許中斷的程序部分放到擴(kuò)展空間內(nèi),而把中斷向量表和ISR以及允許中斷的程序部分都放在XPC=0的頁面。當(dāng)調(diào)用擴(kuò)展空間的程序時(shí)關(guān)閉中斷使能,而當(dāng)擴(kuò)展空間程序返回到XPC=0的頁面時(shí)再開中斷。這樣做的好處是不用關(guān)注XPC的值對(duì)中斷向量尋址的影響。中斷的時(shí)候也不需要保存XPC的值。調(diào)用過程如圖1所示,Y表示需要關(guān)注XPC的值,N表示不需要關(guān)注XPC的值,數(shù)字表示調(diào)用順序。

            


          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();