一種實時多任務系統軟件設計方法
發布時間:2007/8/28 0:00:00 訪問次數:542
摘要:從進程和線程調度的角度出發,介紹了一種規范化的實時多任務系統軟件設計方法,提出了“前向分支”的設計原則,給出了完整的系統模型。
關鍵詞:線程拆分 前向分支 實時多任務 單片機
在機電產品研制開發中,經常要涉及到基于嵌入式系統或基于單片機系統的程序設計。實時多任務是這類系統最基于的要求之一。在實踐中通常采用以下兩種解決方案:一是在商業化時操作系統的基礎上進行二次開發;二是用戶自動設計系統軟件。前者設計工作量小,設計周期短,系統的設計質量也容易得到保證。但由于商業實時操作系統往往較多地考慮通用性,缺乏靈活性,對于一些特定的應用場合,其性能往往不能令人滿意。同時,這種方案還存在著成本高,依賴于特定硬件等缺點。第二種方案可以從系統的實際要求和硬件的實際情況出發靈活地進行系統設計,易于滿足一些特定場合的性能要求,成本也較低。但是,由于缺乏系統化、規范化的設計方法,缺少高層次抽象工具,使得系統的設計質量不容易得到保證,你嚴重地依賴于程序員的水平和經驗。
本文針對上述第三種方案的高限,從進程和線程調度的角度出發,介紹了一種系統化、規范化和易于工程化實施的實時多任務系統軟件設計方法,提出了“前向分支”的設計原則,并給出了完整的系統模型。
1 進程的劃分
對復雜的系統需求進行模塊化和層次化的劃分是軟件設計的基本方法。在實踐中復雜的系統需求通常被劃分為一些功能相對獨立的任務模塊,每個任務模塊被視作一個進程(process)。系統中如有多個進程并發(concurrent)運行,該系統就是一個多任務的系統。在圖1所示的例子中,n個任務模塊構成了宏觀上并發運行的一組進程(即Proc_1~Proc-n)。Proc_5和Proc_9是兩個具有代表性的進程結構。Proc_5是斷續進行的進程,表示了某一順序邏輯控制的流程。Proc_9是LCD漢字顯示程序,其結構是典型的多重循環。其功能是將數組aDisplay中所描述的24×24點陣中文字符串送至LCD顯示屏。ADisplay的結構參幾圖3(e)。Proc_9的基本工作原理如下:當cDispiay不為0時,依次從aDlsplay中取出每個待顯示漢字的點陣位置及其在LCD內部顯存中的地址,根據這兩個參數將一個漢字的點陣順序發送到LCD內部顯存中。直至全部漢字顯示完,cDisplay減為0,Proc_9轉入空檔狀態,等待新的顯示請求。
系統程序的主要任務之一就是對進程進行調度,包括啟動和終止進程、管理進程之間的通訊、處理進程之間的優先級等。但是如果按圖1的結構順序調度進程、以進程為基本單位分配CPU時間的話,顯然存在嚴重的問題。例如在Proc_5中,當程序處于等待K1閉合的狀態時,其它任何進程都無法得到服務,尤其當K1出現故障時,系統將處于“掛起”狀態。如果一個進程過多地占據了CPU時間,其他進程將不能得到公平、均勻的服務,響應時間無法得到保證,系統效率會降低。總之,只有將CPU時間的分配單位減小,才能解決上述問題。
2 線程的拆分
線程(Thread)是CPU的基本執行單位。一個進程可以由一個或多個線程構成。如前所述,單一線程的進程可能會存在諸多問題,而將一進程拆分為多個線程是解決上述問題的有效手段。由圖1的Proc_5和Proc_9可以看出,一個進程過多地占據CPU時間,是因為其中含有次數不確定的等待循環、純延時和較為耗時的多重循環。其中,純延時可以用軟件延和中斷定時兩種方法實現,這兩種方法在進程中又都可以歸結為循環。因此,在拆分線程時應盡量遵循“前向分支”原則,使線程中不含有或少含有循環。
循環結構本質上是由一個分支判斷和一個“反向
摘要:從進程和線程調度的角度出發,介紹了一種規范化的實時多任務系統軟件設計方法,提出了“前向分支”的設計原則,給出了完整的系統模型。
關鍵詞:線程拆分 前向分支 實時多任務 單片機
在機電產品研制開發中,經常要涉及到基于嵌入式系統或基于單片機系統的程序設計。實時多任務是這類系統最基于的要求之一。在實踐中通常采用以下兩種解決方案:一是在商業化時操作系統的基礎上進行二次開發;二是用戶自動設計系統軟件。前者設計工作量小,設計周期短,系統的設計質量也容易得到保證。但由于商業實時操作系統往往較多地考慮通用性,缺乏靈活性,對于一些特定的應用場合,其性能往往不能令人滿意。同時,這種方案還存在著成本高,依賴于特定硬件等缺點。第二種方案可以從系統的實際要求和硬件的實際情況出發靈活地進行系統設計,易于滿足一些特定場合的性能要求,成本也較低。但是,由于缺乏系統化、規范化的設計方法,缺少高層次抽象工具,使得系統的設計質量不容易得到保證,你嚴重地依賴于程序員的水平和經驗。
本文針對上述第三種方案的高限,從進程和線程調度的角度出發,介紹了一種系統化、規范化和易于工程化實施的實時多任務系統軟件設計方法,提出了“前向分支”的設計原則,并給出了完整的系統模型。
1 進程的劃分
對復雜的系統需求進行模塊化和層次化的劃分是軟件設計的基本方法。在實踐中復雜的系統需求通常被劃分為一些功能相對獨立的任務模塊,每個任務模塊被視作一個進程(process)。系統中如有多個進程并發(concurrent)運行,該系統就是一個多任務的系統。在圖1所示的例子中,n個任務模塊構成了宏觀上并發運行的一組進程(即Proc_1~Proc-n)。Proc_5和Proc_9是兩個具有代表性的進程結構。Proc_5是斷續進行的進程,表示了某一順序邏輯控制的流程。Proc_9是LCD漢字顯示程序,其結構是典型的多重循環。其功能是將數組aDisplay中所描述的24×24點陣中文字符串送至LCD顯示屏。ADisplay的結構參幾圖3(e)。Proc_9的基本工作原理如下:當cDispiay不為0時,依次從aDlsplay中取出每個待顯示漢字的點陣位置及其在LCD內部顯存中的地址,根據這兩個參數將一個漢字的點陣順序發送到LCD內部顯存中。直至全部漢字顯示完,cDisplay減為0,Proc_9轉入空檔狀態,等待新的顯示請求。
系統程序的主要任務之一就是對進程進行調度,包括啟動和終止進程、管理進程之間的通訊、處理進程之間的優先級等。但是如果按圖1的結構順序調度進程、以進程為基本單位分配CPU時間的話,顯然存在嚴重的問題。例如在Proc_5中,當程序處于等待K1閉合的狀態時,其它任何進程都無法得到服務,尤其當K1出現故障時,系統將處于“掛起”狀態。如果一個進程過多地占據了CPU時間,其他進程將不能得到公平、均勻的服務,響應時間無法得到保證,系統效率會降低。總之,只有將CPU時間的分配單位減小,才能解決上述問題。
2 線程的拆分
線程(Thread)是CPU的基本執行單位。一個進程可以由一個或多個線程構成。如前所述,單一線程的進程可能會存在諸多問題,而將一進程拆分為多個線程是解決上述問題的有效手段。由圖1的Proc_5和Proc_9可以看出,一個進程過多地占據CPU時間,是因為其中含有次數不確定的等待循環、純延時和較為耗時的多重循環。其中,純延時可以用軟件延和中斷定時兩種方法實現,這兩種方法在進程中又都可以歸結為循環。因此,在拆分線程時應盡量遵循“前向分支”原則,使線程中不含有或少含有循環。
循環結構本質上是由一個分支判斷和一個“反向