??? 摘? 要: 介紹源代碼開放的μC/OS-II實時操作系統,以及基于此技術的總線式數據采集系統,討論了μC/OS-II在實際開發應用中應注意的幾個問題,并通過實例論述實時操作系統在單片機系統應用開發的廣闊前景。?
????關鍵詞: 實時操作系統? μC/OS-II? 前后臺系統? 總線式? 移植
?
??? μC/OS-II是一個源代碼開放的實時操作系統,可移植、可固化(嵌入到產品中成為產品的一部分)、可裁減,屬于占先式實時內核。執行時間可確定(即函數調用與服務的時間是可知的,不依賴于應用程序的多少),支持現有大多數型號的8位、16位、32位MCU/MPU,已被廣泛應用于交換機、路由器、過程控制、汽車業、辦公自動化、計算機外設以及民用消費類產品等,具有穩定的可靠性。把μC/OS-II應用在總線式數據采集系統中,可使該系統比以往的前后臺系統能夠更加穩定地工作,而且在一定程度上滿足了監控測量實時性的需求。?
1 總線式數據采集系統的組成與功能?
??? 隨著社會信息化程度的提高,人們對重要工業及生活設施智能化監控的要求也越來越高。應這種需求,設計了這套總線式數據采集系統。該系統采用總線巡檢方式,對監測對象進行數據采集與處理,系統硬件以模塊化結構,實現32/64/128路模擬或數字量的集中監測,適用于各種標準現場一次儀表或二次儀表數據測量與控制。整機采用先進的微機處理技術和通信控制技術,并嵌入實時處理內核,智能化程度較高,工作性能更加穩定,測量精度高,通用性強。?
1.1 系統組成?
??? 該系統的硬件組成如圖1所示。?
?
?
??? 現場監測通道狀態以總線方式,通過總線處理單元傳送到中央控制單元進行數據采集與處理,其中MCU采用具有10位A/D轉換器的80C196KB。?
1.2 系統功能?
??? 該系統可以對各通道的工作參數、狀態進行即時修改設定,并可以通過面板LED實時顯示32/64/128路通道的工作狀態,同時各通道的實時參數通過LCD進行逐屏顯示。對發生報警的信道可以通過打印處理單元進行打印輸出、聲光報警及顯示。該系統采用總線巡檢方式,對各信道工作狀態進行遠程數據采集并進行集中數據處理。為進一步滿足智能化管理的需要,具有和計算機通信的功能,可以實現監測數據的共享。同時,也可以通過計算機對各信道的工作狀態進行設置,進一步增強了該系統的智能化管理能力。?
2 μC/OS-II在系統中的應用?
??? 該系統若采用以往的前后臺式工作方式,即后臺為主應用程序,前臺為中斷處理程序;通常情況下執行主程序,若有中斷發生時,則轉向前臺處理中斷服務程序。前臺需要處理定時顯示系統信息子程序,或按鍵中斷處理子程序,然后根據中斷程序中所置的狀態標志,由主程序判斷其狀態標志后再進入相應的子程序,也就是主程序采用狀態查詢方式進行工作。這樣在一定程度上不能保證整個系統測量的實時性。因為主程序在執行其它程序時,不可能隨時去檢測這些狀態標志,尤其是處理多信道A/D采樣計算時,耗時較多。當工作的信道增加或減少時,這種現象則表現得尤為明顯,而且難以實現并行操作的相互通信。在主程序的各個子模塊中,有需要橫向通信聯系交換信息的,這在一般的前后臺系統中是很困難的,且存在系統不穩定的隱患。實時內核兼具實時多任務性和穩定性,因此考慮采用實時內核。μC/OS-II是一個源碼開放的實時內核,且又有許多成功的先例可供參考,可針對不同的MCU/MPU,通過條件編譯裁減其內核的大小,以滿足系統要求。μC/OS-II是占先式內核,總是運行就緒條件下優先級最高的任務。最大可以管理64個任務,其中保留8個給系統,故應用程序最多可以有56個任務。鑒于許多成功先例和系統成本,采用了80C196KB作為系統的MCU。通過實驗,基本滿足了系統所要求的實時性。?
2.1 開發實時內核的流程?
??? 開發實時內核的流程如圖2所示。
?
?
2.2 內核的移植?
??? 內核的移植也就是使實時內核能夠在某個微處理器或微控制器上正常運行。移植工作包括以下幾個內容:?
??? (1)在OS_CPU.H中用#define定義三個宏,聲明C96中能夠識別的數據類型和堆棧的增長方向。?
??? (2)在OS_CPU.C中用C語言重新編寫以下幾個函數:OSTaskStkInit、OSStartHighRdy、OSTaskCreateHook、OSTaskSwHook、OSTaskDelHook、OSTaskStatHook、OSTimeTickHook。?
??? (3)在OS_CPU.ASM中編寫幾個匯編語言函數LoadCtx()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。?
2.3 實時內核在應用中應注意的問題
??? 一個實時系統的軟件由實時操作系統加上應用程序構成。應用程序與操作系統的接口通過系統調用來實現。用80C196KB作為系統的MCU,只能用內部RAM作為TCB和所有系統存儲器(含各種控制表)以及各個任務的工作和數據單元。因此一定要注意以下幾點:?
??? (1)為各個任務分配各自的堆棧區,該堆棧區既作為任務的工作單元,也作為任務控制塊的保護單元。?
??? (2)系統的任務控制塊只存放各任務的堆棧指針,而任務的狀態均存放于任務堆棧中。在一個任務退出運行時,通過中斷把它的狀態進棧,然后把它的堆棧指針保存于系統的TCB中;再根據優先級取出優先級最高的已就緒任務的堆棧指針SP映象值送入SP中;最后執行中斷返回指令轉去執行新任務。?
??? (3)各任務的數據和工作單元盡量用堆棧實現,這樣可以允許各任務使用同一個子程序。使用堆棧實現參數傳遞并作為工作單元,而不使用絕對地址的RAM,可實現可重入子程序。該子程序既可為各個任務所調用,也可以實現遞歸調用。?
2.4 應用μC/OS-II實時內核的主要部分?
??? (1)任務的分配?
??? 實時系統中的任務有別于前后臺系統中的子程序模塊,任務是處理機按程序處理數據的過程,是個動態的概念。一般一個任務對應于一段獨立的主程序,它可能調用各種子程序,并使用各種系統資源如中斷、外設等,以完成某種選定的功能,且允許多個任務并行。根據該系統的性能指標和技術要求,可對系統進行如下的任務劃分:按鍵中斷、LCD顯示、串行通信、打印與報警、信道巡檢A/D采樣與數據處理、系統信息顯示、系統工作參數測量、電源切換與充電管理共八個任務。?
??? (2)任務的調度?
??? μC/OS-II的任務調度是按優先級進行的,根據各任務的實時性要求及重要程度,分別置它們的優先級為4、9、8、7、6、11、10、5。其中0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO這幾個優先級保留以被系統使用。優先級號越低,任務的優先級越高。這樣程序之間的通信可以通過按鍵中斷置標志來實現,其中按鍵中斷的優先級最高。當其它任務運行時,按鍵中斷將使得系統服務轉向運行按鍵中斷處理子程序ISR。當中斷處理子程序運行完后,轉向判斷就緒狀態任務的優先級別。如果發現有比中斷前任務優先級更高的任務,則轉向執行該任務。先判斷其運行標志,如果是‘非’,則又等待。再重復上述過程。如果在執行完ISR后發現沒有比中斷前任務優先級更高的,則轉向中斷前的子程序繼續運行。該系統的軟件處理沒有采用優先級轉換的方法,而是采用狀態置位判斷的方法,這樣可以減少程序的復雜性。?
??? (3)任務間的通信?
??? 任務間通信最簡便的方法是使用共享數據結構。雖然共享數據區法簡化了任務間的信息交換,但是必須保證每個任務在處理共享數據時的排它性,以避免競爭和數據的破壞。通常與共享資源打交道時,使之滿足互斥條件最一般的方法有以下幾種:?
??? ·關中斷;?
??? ·使用測試并置位;?
??? ·禁止任務切換;?
??? ·利用信號量。?
??? 在本系統中采用了前兩種。關中斷是一種最簡單快捷的方式,也是在中斷服務子程序中處理共享數據結構的唯一方法。要注意的是:關中斷的時間要盡量短,以免影響操作系統的中斷處理。其應用模式如下:?
??? void Function(void)?
??? {?
??? ??? OS_ENTER_CRITICAL();?
??? ??? ……??????? /*在此處理共享數據*/?
??? ??? OS_EXIT_CRITICAL();?
??? }?
??? 測試并置位方式需要有一個全局變量,約定好先測試該變量;如果是約定的數值,則執行該任務,否則不執行該任務。這種方法稱測試并置位(TEST-AND-SET),或TAS。其應用程序如下:?
??? Disable interrupts? ??? /*關中斷*/?
??? If? ('Access Variable' is? 0){?/*若資源不可用,標志為0*/?
????? ?? Set? variable? to? 1; /*置資源不可用,標志為1*/?
????? ?? Reenable? interrupts; /*重開中斷*/?
????? ?? Access?? the?? resource;?/*處理該資源*/?
???????? Disable?? interrupts; ? /*關中斷*/?
????? ?? Set?? the? 'Access? Variable'? back? to? 0;/*清資源不可使用,標志為0*/?
????? ?? Reenable? interrupts; ? /*重新開中斷*/?
??? }else?? {???????????? ????? /*否則*/?
????? ?? Reenable interrupts;? ? /*開中斷*/?
????????????????? ?????????????/*資源不可使用,以后再試*/?
??? }?
??? (4)時鐘節拍?
??? 時鐘節拍是特定的周期性中斷,根據本系統的性能指標,取1毫秒。時鐘的節拍式中斷使得內核可以將任務延時若干個整數時鐘節拍,以及當任務等待事件發生時,提供等待超時的依據。另外,系統信息的定時顯示需要系統每隔一定的時鐘節拍顯示一次。
??? (5)存儲空間的分配?
??? 為了減少操作系統的體積,只應用操作系統的任務調度、任務切換、信號量處理、延時及超時服務幾部分。這樣可使該操作系統的大小減小到3~5KB,再加上應用程序最大可達50KB左右。?
??? 因為每個任務都是獨立運行的,每個任務都具有自己的棧空間。這樣可以根據任務本身的需求(局部變量、函數調用、中斷嵌套等)來分配其RAM空間。?
3 系統運行的實時性分析?
??? 在該系統中應用μC/OS-II實時內核,一是增強了系統運行的穩定性,更重要的是滿足了系統測量所需的實時性要求。系統采用12MHz晶振,一條指令的周期是1微秒。以下時間的統計是將C語言編譯為匯編語言后,根據其指令的多少而計算出來的。經統計如下:?
??? ·中斷管理:共需3毫秒;?
??? ·內存管理:共需800微秒;?
??? ·信號量管理:共約4.5毫秒; ?
??? ·任務管理:共需8毫秒;?
??? ·時鐘管理:共需約20毫秒;?
??? ·雜項:約需1毫秒。?
??? 上述時間均是最大運行時間的大概統計,也就是均考慮有任務切換情況下的時間統計結果。在整個內核的應用上對一些函數進行了裁減,沒有用的服務在預編譯時屏蔽掉了,因此未計入統計時間。?
??? 用戶定義函數:按鍵中斷處理15毫秒,LCD顯示一屏30毫秒,串行通信10毫秒,打印及聲光報警400毫秒,信道巡檢A/D采樣與數據處理20毫秒,系統信息顯示10毫秒,系統工作參數測量150毫秒,電源的切換與充電50毫秒??梢娤到y各任務中除打印所需時間較長外,其余任務所需時間都比較短。通過采用實時內核,在很大程度上保證了對信道掃描的定時性,即實時性要求。若采用前后臺編程,在查詢信道掃描的情況下,系統掃描信道的時間不能確定;隨著信道數的變化,信道掃描的定時性很難得到保證,各種顯示的定時性也比較差。?
??? 總之,隨著各種應用電子系統的復雜化和系統實時性需求的提高,并伴隨應用軟件朝著系統化方向發展的加速,μC/OS-II實時內核一定會得到更大的發展。因為它可以使產品更加穩定可靠,開發過程更加規范,且縮短了開發周期。?
參考文獻?
1 (美) 拉伯羅斯著, 邵貝貝譯. μC/OS-II:源碼公開的實時嵌入式操作系統. 北京:中國電力出版社,2001?
2 孫涵芳主編.? Intel 16 位單片機. 北京:北京航空航天大學出版社,1999?
3 張友德,涂時亮,陳章龍. M68H08系列單片機原理與應用.上海:復旦大學出版社,2001