單片機中嵌入操做系統

在單片機中嵌入操做系統的利弊  
     
摘要:近年來,在單片機系統中嵌入操做系統已經成爲人們愈來愈關心的一個話題。本文經過對一種源碼公開的單片機嵌入式實時操做系統μC/OS-II爲例,闡述了在單片機中使用該嵌入式操做系統的優缺點,以及在應用中應當注意的一些問題。 編程

關鍵詞:實時操做系統;μC/OS-II;單片機   
引言 
  早在20世紀60年代,就已經有人開始研究和開發嵌入式操做系統。但直到最近,它纔在國內被愈來愈多的說起,在通訊、電子、自動化等須要實時處理的領域所日益顯現的重要性吸引了人們愈來愈多的注意力。可是,人們所談論的每每是一些著名的商業內核,諸如VxWorks、PSOS等。這些商業內核性能優越,但價格昂貴,主要用於16位和32位處理器中,針對國內大部分用戶使用的51系列8位單片機,能夠選擇免費的μC/OS-II。   
μC/OS-II的特色  數組

  1. μC/OS-II是由Labrosse先生編寫的一個開放式內核,最主要的特色就是源碼公開。這一點對於用戶來講可謂利弊各半,好處在於,一方面它是免費的,另外一方面用戶能夠根據本身的須要對它進行修改。缺點在於它缺少必要的支持,沒有功能強大的軟件包,用戶一般須要本身編寫驅動程序,特別是若是用戶使用的是不太經常使用的單片機,還必須本身編寫移植程序。  
  2. μC/OS-II是一個佔先式的內核,即已經準備就緒的高優先級任務能夠剝奪正在運行的低優先級任務的CPU使用權。這個特色使得它的實時性比非佔先式的內核要好。一般咱們都是在中斷服務程序中使高優先級任務進入就緒態(例如發信號),這樣退出中斷服務程序後,將進行任務切換,高優先級任務將被執行。拿51單片機爲例,比較一下就能夠發現這樣作的好處。假如須要用中斷方式採集一批數據並進行處理,在傳統的編程方法中不能在中斷服務程序中進行復雜的數據處理,由於這會使得關中斷時間過長。因此常常採用的方法是置一標誌位,而後退出中斷。因爲主程序是循環執行的,因此它總有機會檢測到這一標誌並轉到數據處理程序中去。可是由於沒法肯定發生中斷時程序到底執行到了什麼地方,也就沒法判斷要通過多長時間數據處理程序纔會執行,中斷響應時間沒法肯定,系統的實時性不強。若是使用μC/OS-II的話,只要把數據處理程序的優先級設定得高一些,並在中斷服務程序中使它進入就緒態,中斷結束後數據處理程序就會被當即執行。這樣能夠把中斷響應時間限制在必定的範圍內。對於一些對中斷響應時間有嚴格要求的系統,這是必不可少的。但應該指出的是若是數據處理程序簡單,這樣作就未必合適。由於μC/OS-II要求在中斷服務程序末尾使用OSINTEXIT函數以判斷是否進行任務切換,這須要花費必定的時間。  
  3. μC/OS-II和你們所熟知的Linux等分時操做系統不一樣,它不支持時間片輪轉法。μC/OS-II是一個基於優先級的實時操做系統,每一個任務的優先級必須不一樣,分析它的源碼會發現,μC/OS-II把任務的優先級當作任務的標識來使用,若是優先級相同,任務將沒法區分。進入就緒態的優先級最高的任務首先獲得CPU的使用權,只有等它交出CPU的使用權後,其餘任務才能夠被執行。因此它只能說是多任務,不能說是多進程,至少不是咱們所熟悉的那種多進程。顯而易見,若是隻考慮實時性,它固然比分時系統好,它能夠保證重要任務老是優先佔有CPU。可是在系統中,重要任務畢竟是有限的,這就使得劃分其餘任務的優先權變成了一個讓人費神的問題。另外,有些任務交替執行反而對用戶更有利。例如,用單片機控制兩小塊顯示屏時,不管是編程者仍是使用者確定但願它們同時工做,而不是顯示完一塊顯示屏的信息之後再顯示另外一塊顯示屏的信息。這時候,要是μC/OS-II即支持優先級法又支持時間片輪轉法就更合適了。  
  4. μC/OS-II對共享資源提供了保護機制。正如上文所提到的,μC/OS-II是一個支持多任務的操做系統。一個完整的程序能夠劃分紅幾個任務,不一樣的任務執行不一樣的功能。這樣,一個任務就至關於模塊化設計中的一個子模塊。在任務中添加代碼時,只要不是共享資源就沒必要擔憂互相之間有影響。而對於共享資源(好比串口),μC/OS-II也提供了很好的解決辦法。通常狀況下使用的是信號量的方法。簡單地說,先建立一個信號量並對它進行初始化。當一個任務須要使用一個共享資源時,它必須先申請獲得這個信號量,而一旦獲得了此信號量,那就只有等使用完了該資源,信號量纔會被釋放。在這個過程當中即便有優先權更高的任務進入了就緒態,由於沒法獲得此信號量,也不能使用該資源。這個特色的好處顯而易見,例如當顯示屏正在顯示信息的時候,外部產生了一箇中斷,而在中斷服務程序中須要顯示屏顯示其餘信息。這樣,退出中斷服務程序後,原有的信息就可能被破壞了。而在μC/OS-II中採用信號量的方法時,只有顯示屏把原有信息顯示完畢後才能夠顯示新信息,從而能夠避免這個現象。不過,採用這種方法是以犧牲系統的實時性爲代價的。若是顯示原有信息須要耗費大量時間,系統只好等待。從結果上看,等於延長了中斷響應時間,這對於未顯示信息是報警信息的狀況,無疑是致命的。發生這種狀況,在μC/OS-II中稱爲優先級反轉,就是高優先級任務必須等待低優先級任務的完成。在上述狀況下,在兩個任務之間發生優先級反轉是沒法避免的。因此在使用μC/OS-II時,必須對所開發的系統瞭解清楚,才能決定對於某種共享資源是否使用信號量。  
          μC/OS-II在單片機使用中的一些特色:(1)在單片機系統中嵌入μC/OS-II將加強系統的可靠性,並使得調試程序變得簡單。以往傳統的單片機開發工做中常常遇到程序跑飛或是陷入死循環。能夠用看門狗解決程序跑飛問題,而對於後一種狀況,尤爲是其中牽扯到複雜數學計算的話,只有設置斷點,耗費大量時間來慢慢分析。若是在系統中嵌入μC/OS-II的話,事情就簡單多了。能夠把整個程序分紅許多任務,每一個任務相對獨立,而後在每一個任務中設置超時函數,時間用完之後,任務必須交出CPU的使用權。即便一個任務發生問題,也不會影響其餘任務的運行。這樣既提升了系統的可靠性,同時也使得調試程序變得容易。  
     (2)在單片機系統中嵌入μC/OS-II將增長系統的開銷。如今所使用的51單片機,通常是指87C51或者89C51,其片內都帶有必定的RAM和ROM。對於一些簡單的程序,若是採用傳統的編程方法,已經不須要外擴存儲器了。若是在其中嵌入μC/OS-II的話,在只須要使用任務調度、任務切換、信號量處理、延時或超時服務的狀況下,也不須要外擴ROM了,可是外擴RAM是必須的。因爲μC/OS-II是可裁減的操做系統,其所須要的RAM大小就取決於操做系統功能的多少。舉例來講,μC/OS-II容許用戶定義最大任務數。因爲每創建一個任務,都要產生一個與之相對應的數據結構TCB,該數據結構要佔用很大一部份內存空間。因此在定義最大任務數時,必定要考慮實際狀況的須要。若是定得過大,勢必會形成沒必要要的浪費。嵌入μC/OS-II之後,總的RAM需求能夠由以下表達式得出:  
      RAM總需求=應用程序的RAM需求+內核數據區的RAM需求+(任務棧需求+最大中斷嵌套棧需求)·任務數 
    所幸的是,μC/OS-II能夠對每一個任務分別定義堆棧空間的大小,開發人員可根據任務的實際需求來進行棧空間的分配。但在RAM容量有限的狀況下,仍是應該注意一下對大型數組、數據結構和函數的使用,別忘了,函數的形參也是要推入堆棧的。 
  5.  μC/OS-II的移植也是一件須要值得注意的工做。若是沒有現成的移植實例的話,就必須本身來編寫移植代碼。雖然只須要改動兩個文件,但仍須要對相應的微處理器比較熟悉才行,最好參照已有的移植實例。另外,即便有移植實例,在編程前最好也要閱讀一下,由於裏面牽扯到堆棧操做。在編寫中斷服務程序時,把寄存器推入堆棧的順序必須與移植代碼中的順序相對應。   
  6. 和其餘一些著名的嵌入式操做系統不一樣,μC/OS-II在單片機系統中的啓動過程比較簡單,不像有些操做系統那樣,須要把內核編譯成一個映像文件寫入ROM中,上電覆位後,再從ROM中把文件加載到RAM中去,而後再運行應用程序。μC/OS-II的內核是和應用程序放在一塊兒編譯成一個文件的,使用者只須要把這個文件轉換成HEX格式,寫入ROM中就能夠了,上電後,會像普通的單片機程序同樣運行。   結語 
      由以上介紹能夠看出,μC/OS-II具備免費、使用簡單、可靠性高、實時性好等優勢,但也有移植困難、缺少必要的技術支持等缺點,尤爲不像商用嵌入式系統那樣獲得普遍使用和持續的研究更新。但開放性又使得開發人員能夠自行裁減和添加所需的功能,在許多應用領域發揮着獨特的做用。固然,是否在單片機系統中嵌入μC/OS-II應視所開發的項目而定,對於一些簡單的、低成本的項目來講,就不必使用嵌入式操做系統了。
相關文章
相關標籤/搜索