找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5105|回復: 1
收起左側(cè)

DM64X 中斷響應延時問題

[復制鏈接]
ID:51088 發(fā)表于 2014-8-20 02:50 | 顯示全部樓層 |閱讀模式
問題描述:
  系統(tǒng)硬件中斷經(jīng)常得不到及時響應,根據(jù)現(xiàn)象推斷中斷會被延遲達150us以上。
分析過程:
  開始以為是有其他中斷打斷或占用CPU。但經(jīng)過實驗驗證發(fā)現(xiàn)這種延遲并非受中斷影響,而是和任務有關(guān)。
最終確認這種延時和某個任務中的memset調(diào)用有關(guān)。將這個函數(shù)注釋掉就可以明顯減小中斷延遲發(fā)生的頻率。
memset(buffer,0,lenth);
  由于片內(nèi)空間不足,buffer位于片外SDRAM。
  于是先懷疑這個函數(shù)可能對中斷機制做了什么禁止操作,便用自己寫的for循環(huán)代替memset函數(shù)進行清0操作,并且進行9次。
for(j=0;j<9;j++){
dst=buffer;
       for (len=0;len<38400;len++){
       *dst++ = 0;
       }
}
  從示波器可以看到連續(xù)9個中斷響應都被延遲300us左右。更改次數(shù)為5,則可以見到連續(xù)5個中斷響應都被延遲300us左右。如果按133M寫速率的話,這個時間剛好是38400/133M=288us。于是懷疑為for循環(huán)內(nèi)中斷一直不能得到響應。
for循環(huán)內(nèi)設置斷點觀察。發(fā)現(xiàn)for循環(huán)運行中,GIE有效,IER內(nèi)的中斷使能有效,IFR中斷對應位也正常置1,但程序不會跳轉(zhuǎn)到中斷服務程序。直到內(nèi)層的for循環(huán)結(jié)束后,才會跳轉(zhuǎn)到中斷服務程序,外層的for循環(huán)是可以打斷的。因為自身的IER仍有效,所以判斷沒有進入HWI_enter調(diào)試程序,不是DSP/BIOS的問題。應當是DSP芯片循環(huán)賦值硬件機制和中斷配合的問題。
  上面的賦值語句是按字節(jié)賦值,DSP處理時每循環(huán)一次2個時鐘周期,每循環(huán)一次寫3個字節(jié)(多邏輯單元并行操作)。也許正是這種多邏輯單元并行處理機制導致的CPU不能即時響應中斷。
后來在TI的一篇文檔中找到了答案。TMS320C64x/C64x+ DSP CPU and Instruction Set Reference GuideSPRU732H)。534頁列出了中斷得到CPU響應需具備的條件。
· IFm is set during CPU cycle 6. (This determination is made in CPU cycle 4 by the interrupt logic.)
· There is not a higher priority IFm bit set in IFR.
· The corresponding bit in IER is set (IEm = 1).
· GIE = 1
· NMIE = 1
· The five previous execute packets (n through n + 4) do not contain a branch (even if the branch is not
taken).
  其中第6條即標明,CPU響應中斷前5個指令周期內(nèi),流水線上不能有跳轉(zhuǎn)指令。(execute packets指同一周期內(nèi)執(zhí)行的指令集合——最多一周期可執(zhí)行8條指令。)因為循環(huán)賦值的for循環(huán)內(nèi)只有五六條匯編指令,往往在二到三個周期內(nèi)即可完成一次循環(huán),然后CPU無法中斷而繼續(xù)下一次循環(huán)。直到循環(huán)結(jié)束才開始響應中斷。
解決方法:
  可以使用DMA操作,用DAT_fill()函數(shù)代替memset()函數(shù)。
  可以將較長的for循環(huán)分解為多層for循環(huán),以減小最內(nèi)層for循環(huán)執(zhí)行時間,減小對中斷的影響。內(nèi)層循環(huán)結(jié)束后可以適當做一點簡單的運算來提供5周期的“空隙”。
  可以用64位操作或32位操作替換8位操作,可減小賦值所需的總時間。
  TI有專門的編譯指令來強制打斷這種循環(huán),以使中斷得到響應。
SPRU198G文檔interrupts節(jié)內(nèi)有相關(guān)描述。
  其實這不算是問題,而是DM64X系列內(nèi)核的結(jié)構(gòu)特性。為使CPU的效率更高,對中斷處理的實時性做了一些折衷。不過,此處需格外注意。如果設計中發(fā)現(xiàn)中斷未及時響應,可以用我描述的方法來定位是哪里影響到了中斷執(zhí)行。

回復

使用道具 舉報

ID:51088 發(fā)表于 2014-8-20 03:29 | 顯示全部樓層
問題描述:
系統(tǒng)調(diào)試過程中發(fā)現(xiàn)硬件中斷經(jīng)常得不到及時響應,根據(jù)現(xiàn)象推斷中斷會被延遲達150us以上。
問題分析:
中斷信號是連到CPLD的,DSPGPIO6也與CPLD相連。用CPLD的任一個輸出腳IOX做為中斷延遲指示。中斷沿來了之后將IOX置為高電平,DSP進入中斷服務函數(shù)馬上給GPIO6一個翻轉(zhuǎn),CPLD檢查到來自GPIO6的翻轉(zhuǎn)后將IOX清為低電平。這樣,通過觀察IOX上的信號正脈沖寬度就可以看到從中斷發(fā)生到中斷得到響應所用的時間了。而且通過脈寬觸發(fā)模式就可以設置大于150us的正脈沖觸發(fā),這樣就能捕捉到異常情形了。通過測試發(fā)現(xiàn),一般延遲只有400ns左右,但任務負載一重就會出現(xiàn)寬度超過150us的正脈沖,也就是中斷被延遲了150us以上才得到響應。
下圖為觀察到的IOX管腳上的波形:


開始以為是有其他中斷打斷而占用CPU。但經(jīng)過實驗驗證發(fā)現(xiàn)這種延遲并非受中斷影響,而是和任務有關(guān)。
最終確認這種延時和某個任務中的memset()函數(shù)調(diào)用有關(guān)――這個函數(shù)對片外SDRAM中的384×100個字節(jié)進行清0操作。將這個函數(shù)注釋掉就可以明顯減小中斷延遲發(fā)生的頻率。
memset(buffer,0,lenth);
由于片內(nèi)空間不足,buffer位于片外SDRAM,lenth384×100
于是先懷疑這個函數(shù)可能對中斷機制做了什么禁止操作,便用自己寫的for循環(huán)代替memset函數(shù)進行清0操作,看是不是會解決這個問題。后來卻發(fā)現(xiàn)延遲反而更長了。于是將for循環(huán)多進行幾遍,編程使for循環(huán)重復9次。
for(j=0;j<9;j++){
dst=buffer;
       for (len=0;len<38400;len++){
       *dst++ = 0;
       }
}
從示波器可以看到連續(xù)9個中斷響應異常:


上面的波形即可看出,中斷發(fā)生是200us周期的,超過200us的中斷延遲會致使一次中斷丟失。這幾個異常中斷響應之間(脈沖下降沿間隔)都是300us.,于是推斷一次內(nèi)循環(huán)大致耗時300us。
更改次數(shù)為5,則可以見到連續(xù)5個中斷響應都被延遲300us左右。如果按133M寫速率的話,這個時間剛好是38400/133M=288us。于是懷疑為for循環(huán)內(nèi)中斷一直不能得到響應。
for循環(huán)內(nèi)設置斷點觀察。發(fā)現(xiàn)for循環(huán)運行中,GIE有效,IER內(nèi)的中斷使能有效,IFR中斷對應位也正常置1,但程序不會跳轉(zhuǎn)到中斷服務程序。直到內(nèi)層的for循環(huán)結(jié)束后,才會跳轉(zhuǎn)到中斷服務程序,外層的for循環(huán)是可以打斷的。因為自身的IER仍有效,所以判斷沒有進入HWI_enter調(diào)試程序,不是DSP/BIOS的問題。應當是DSP芯片循環(huán)賦值硬件機制和中斷配合的問題。
上面的賦值語句是按字節(jié)賦值,DSP處理時每循環(huán)一次2個時鐘周期,每循環(huán)一次寫3個字節(jié)(多邏輯單元并行操作)。也許正是這種多邏輯單元并行處理機制導致的CPU不能即時響應中斷。
后來在TI的一篇文檔中找到了答案。TMS320C64x/C64x+ DSP CPU and Instruction Set Reference GuideSPRU732H)。534頁列出了中斷得到CPU響應需具備的條件。
· IFm is set during CPU cycle 6. (This determination is made in CPU cycle 4 by the interrupt logic.)
· There is not a higher priority IFm bit set in IFR.
· The corresponding bit in IER is set (IEm = 1).
· GIE = 1
· NMIE = 1
· The five previous execute packets (n through n + 4) do not contain a branch (even if the branch is not
taken).
其中第6條即標明,CPU響應中斷前5個執(zhí)行包內(nèi),不能有跳轉(zhuǎn)指令。(execute packets指同一周期內(nèi)可并行執(zhí)行的指令集合——最多一周期可執(zhí)行8條指令。)因為循環(huán)賦值的for循環(huán)內(nèi)只有五六條匯編指令,往往在二到三個周期內(nèi)即可完成一次循環(huán),然后CPU無法中斷而繼續(xù)下一次循環(huán)。直到循環(huán)結(jié)束才開始響應中斷。而從內(nèi)層的for循環(huán)到下一次循環(huán)之間則剛好多于5個執(zhí)行包,所以外層的for循環(huán)可以被中斷
解決方法:
可以使用DMA操作,用DAT_fill()函數(shù)代替memset()函數(shù)。
可以將較長的for循環(huán)分解為多層for循環(huán),以減小最內(nèi)層for循環(huán)執(zhí)行時間,減小對中斷的影響。內(nèi)層循環(huán)結(jié)束后可以適當做一點簡單的運算來提供5周期的“空隙”。
可以用64位操作或32位操作替換8位操作,可減小賦值所需的總時間。
可以用編譯器的“-mi”編譯項來讓編譯器自動處理(后面需帶參數(shù),具體意義和用法可參見TISPRU198G文檔“TMS320C6000 Programmer’s Guide”的interrupts一節(jié),356頁)。
注:64x64x+都是這樣的。

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表