DSP/BIOS 線程

很多實時的 DSP 應用程序很可能會在同一時間執行多個看似不相關的任務。比如當外部數據變爲有效或者出現控制信號時,對外部事件進行響應。這些任務都很重要,而且必須同時進行。

通常,我們將這些任務稱爲線程。不同的系統對線程進行了狹義或廣義的定義。在 DSP/BIOS中採用廣義的定義,即 DSP 執行的所有獨立的指令流。一個線程是一個單獨的控制點,它可能包含一個子程序、一個宏或者是一個函數調用。

DSP/BIOS內核使你的應用程序可以由一系列線程組成,而每個線程執行一個模塊化的函數。多線程的程序在一個單獨的處理器上運行是通過允許高優先級的線程搶先低優先級的線程來實現的,並且允許各線程之間的各種相互作用,包括暫停、通信及同步。

DSP/BIOS內核支持具有不同優先級的多種類型的線程。每種線程類型具有不同的執行及搶先特點。主要有以下幾種線程類型(從高優先級到低優先級):

  • 硬件中斷(HWI):包括 CLK 功能;
  • 軟件中斷(SWI):包括 PRD 功能;
  • 任務線程(TSK);
  • 後臺線程(IDL)

在DSP/BIOS應用程序中主要有四類線程:

  • 硬件中斷(HWI)。硬件中斷線程將由外部的同步事件觸發而執行。HWI 函數或中斷服務子程序(ISR)將在中斷髮生後執行。由於硬件中斷具有最高優先級,所以HWI 函數具有嚴格的實時性。在 DSP/BIOS 的應用程序中,HWI 中斷函數能夠處理頻率爲200kHz 的中斷,這要求在2到100內處理完。
  • 軟件中斷(SWI)。軟件中斷線程往往伴隨着硬件中斷的發生。每當有硬件中斷髮生時,會觸發 HWI 硬件中斷服務函數,而軟件中斷的觸發是靠 SWI 軟件中斷API 函數調用實現的。軟件中斷在硬件中斷和TSK之間提供了額外的優先級。SWI處理那些有處理時間限制但又不適合作爲任務來運行的線程,但它不像硬件中斷服務子程序那樣對處理時間有嚴格的要求。與HWI硬件中斷線程一樣,SWI軟件中斷線程總會一直執行下去,直到結束。軟件中斷可用於處理時間在100或以上的事件。SWI 軟件中斷可以幫助HWI硬件中斷將一些非嚴格實時性的處理放到低優先級的線程中,以減少硬件中斷的響應時間,這樣就不需要用到HWI硬件中斷了。
  • 任務線程(TSK)。任務線程的優先級高於後臺線程但低於軟件中斷。任務線程與軟件中斷的不同之處在於在運行過程中任務可以等待(阻塞)到所需資源可用再繼續執行。DSP/BIOS內核提供了一組用於任務之間通信和同步的數據結構,包括隊列,旗語和郵箱。
  • 後臺線程。IDL 等待循環是 DSP/BIOS 內核中最低優先級的線程。當應用程序的主函數返回後,DSP/BIOS 內核調用該應用程序所用到的 DSP/BIOS 模塊的初始化啓動代碼。在這些啓動代碼結束後,便進入這個 IDL 等待循環。該循環是一個無限循環,它不停地調用 IDL 後臺對象中的所有函數。每個函數在前一個函數結束後依次運行。這些 IDL 函數不斷被運行,直到被更高優先級的線程搶先。IDL 函數不適合於有實時性要求的任何處理任務。

DSP/BIOS程序中還可以執行其他一些函數。

  • 時鐘函數(CLK)。由片上的定時器中斷觸發。通常這些函數由硬件中斷觸發,在HWI硬件中斷中執行。
  • 週期函數(PRD)。多次地由片上的定時器中斷或其他事件產生。週期函數是一類特殊的軟件中斷。

 

選擇線程類型

在應用程序中對每個線程的類型和優先級的選擇將影響到線程是否按時執行以及是否正確執行。DSP/BIOS的靜態配置文件使你可以很容易的修改線程的類型。

以下是在程序中確定使用哪種線程類型的一些原則:

  • SWI或TSK與HWI。當線程的執行需要嚴格的實時性時才使用硬件中斷服務子程序。使用HWI硬件中斷時應考慮到硬件中斷處理時間需在5內,不然數據就有可能被覆蓋掉。當任務處理時間稍長,大概100或以上的話,就可以考慮使用軟件中斷或任務線程來完成。用戶的HWI函數應當調用軟件中斷或任務線程去執行優先級較低的處理。低優先級的線程可以減少中斷潛伏期,允許其他硬件中斷產生。
  • SWI與TSK。如果處理函數之間只有簡單的聯繫和數據共享要求則使用軟件中斷。更復雜的要求則應使用任務線程。雖然高優先級線程可以搶先低優先級線程,但任務線程可以等待其他事件,如等待可用資源。當使用共享數據時任務線程比SWI軟件中斷有更多的選擇。當程序調用SWI軟件中斷時,軟件中斷函數需要的所有數據應當準備好。SWI 軟件中斷對象中的郵箱提供了一種判斷資源準備情況的方法。軟件中斷線程比任務線程使用更少的存儲器,因爲所有的軟件中斷線程都使用同一個堆棧空間。
  • IDL。當沒有其他任務需要執行時,應創建後臺函數來執行無關緊要的後臺任務。IDL函數對執行時間沒有要求,它只是在系統的空閒時間才運行。

線程優先級

在DSP/BIOS中,硬件中斷有最高的優先級。除非將CSR中的GIE位復位,或將IER中的相應位置位使得硬件中斷無效,否則其他中斷不能搶先硬件中斷。

軟件中斷的優先級低於硬件中斷。軟件中斷分爲14個可用的優先級。軟件中斷可以被高優先級的軟件中斷和任何硬件中斷搶先。軟件中斷不能阻塞。

任務線程的優先級低於軟件中斷。任務線程分爲15個優先級。任務線程可以被任何高優先級的線程搶先。當等待可用資源和低優先級的線程時,任務線程可以阻塞。

後臺等待循環線程的優先級最低。它在CPU沒有運行其他線程時循環執行。

 

讓步和搶先

DSP/BIOS調度程序會運行具有最高優先級的準備就緒的線程,除非出現以下的情況:

  • 當前線程暫時禁止了某些或全部硬件中斷(通過HWI_disable或HWI_enter),使得硬件中斷服務子程序不能運行。
  • 當前線程暫時禁止了軟件中斷(通過SWI_disable),使得任何其他高優先級的軟件中斷不能搶先當前線程,但不能阻止硬件中斷的搶先。
  • 當前線程暫時禁止了任務調度(通過TSK_disable),使得任何其他高優先級的任務線程不能搶先當前線程,但不能阻止硬件中斷和軟件中斷的搶先。
  • 最高優先級的線程是一個被阻塞的任務線程,當任務線程調用TSK_sleep,LCK_pend,MBX_pend,SEM_pend就會出現這種情況。

硬件中斷和軟件中斷都可以影響DSP/BIOS的任務調度程序。一個任務線程被阻塞常常是因爲該線程等待的旗語不可用。HWI硬件中斷,SWI軟件中斷以及其他任務線程都可以發送旗語。如果一個HWI硬件中斷或SWI軟件中斷通過發送一個旗語開啓了一個等待任務線程並且該線程優先級高於當前線程,處理器就會轉移到該線程。

當運行一個HWI硬件中斷或SWI軟件中斷時,DSP/BIOS2使用一個專用的系統中斷堆棧,稱爲系統堆棧。每個任務使用各自所有的堆棧。因此,如果系統沒有TSK任務線程,所以的線程將共享同一系統堆棧。因爲DSP/BIOS爲每個任務線程分配獨立的堆棧,應用程序和任務的堆棧都可以更小。由於系統堆棧更小,用戶就可以將其放到寶貴的快速存儲器中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章