實時操作系統到Linux系統的移植
從一個操作系統到另一個操作系統應用程序的移植即使在最好的情況下也經常是一個艱巨的任務。把一個實時的嵌入式應用程序移植到一個新的操作系統上可以說是一項最困難的任務。
本文引用地址:http://www.104case.com/article/150768.htm為了幫助開發人員計劃在不久的將來轉移到嵌入式Linux上,或者考慮將現有的應用程序運行在嵌入式Linux上這種投資的必要性,Jim 解釋了這一轉換的過程,評估了涉及到的困難和挑戰,并且闡述了認識這種轉換的益處。
越來越多的公司正在轉向嵌入式Linux,把它作為他們下一代產品的操作系統。然而他們以前都是使用實時操作系統作為他們的嵌入式系統。事實上,VDC的報告顯示了嵌入式Linux可以占到32位和64位領域設計的三分之一,是其他所有嵌入式系統的兩倍。
很明顯,關于從老式RTOS產品的應用程序移植到Linux的可行性的問題必須得到回答,由此這種移植才能夠被有效的用于工程管理。
一個典型的基于RTOS的應用程序依賴于很多因素,其中最重要的是編程/內存模型、API、性能、特別是實時響應的能力。另外一個重要的考慮是軟件開發環境,但那是軟件環境文章值得討論的話題。
編程模型
幾乎所有使用的RTOS有一個簡單的編程模型,它由多線程的執行(通常稱為任務)構成,包含在單一的地址空間中。舉例來說,一個c語言的程序有一個單一的主函數,它創建所有其他的線程。每一個線程依次被定義為總程序中的一個c函數。典型的,不管是RTOS還是非保護內存中的應用程序,他們的物理地址和邏輯地址都是一樣的??赡軙幸恍┏売脩裟J较碌牟僮魇褂孟拗屏嗽谟脩裟J较碌膽贸绦虬l出一些指令?;旧?,所有的內存對于應用程序來說是虛擬的。
在過去,大多數嵌入式處理器沒有內存管理單元,因此RTOS單地址空間模式是必須的。然而今天大多數的中高端處理器配備了MMU,因此如果需要的話,MMU能夠管理內存。
該體系結構的描述提出了一個移植RTOS代碼到Linux上的簡單架構。
RTOS的全部應用代碼移植到一個Linux單進程
RTOS的任務轉換成Linux線程
RTOS的物理地址空間映射到Linux的虛擬地址空間
諸如VME機架的多板或多處理器架構,移植到一個多進程的Linux應用。
構架上的考慮:進程和線程的創建
是否使用遵循API的VXWORKS和PSOS等RTOS仿真軟件包,開發人員最終必須決定是否將線程或是進程作為執行RTOS的任務。在這點上,Linux內核對待不管是線程還是進程都是同等的,都是以調度為目的。然而不同的API創建和管理每個實體的類型、性能、資源的成本和益處都是關聯的。
通常來說,進程比線程大一點,因為他們傳送著更多的上下文信息。一個Linux線程的上下文如同RTOS的一個任務,主要由cpu寄存器、堆棧、當前的程序指針以及一些內核數據結構的入口組成。一個進程加上一個完整的虛擬地址空間。這樣,至少內核必須創建和跟蹤進程的頁轉換、所有代碼的類型、上下文、數據等。對于重量級進程上下文的主要影響有兩點:創建的時間和相互的上下文切換時間。
只要可能,RTOS的代碼都會爭取要輕量級的執行。同樣的,當很多RTOS提供了動態的任務創建API,其他以靜態任務定義頁表為特色,所有RTOS的商家不鼓勵使用頻繁的任務創建以節省時間和空間。Linux進程的創建不是故意那么麻煩;Linux進程是重量級的,因為他們提供了更多的保護性和依賴性。
這個熟悉地老式的架構,因為簡單,所以非常容易遭受破壞。正在運行的任務能夠覆蓋應用程序的代碼和數據,另外還會寫入到外圍設備的寄存器、破壞內核的數據結構、覆蓋內核代碼。任務的堆棧能夠很容易的溢出,并且一個接一個被覆蓋掉或者通過控制內存來破壞堆的頂部、其他數據或者附近的代碼。
更高的層次來說,這種非正式有組織的,高度非遮掩的架構提出了對于代碼質量的兩個主要挑戰:自身的失敗機會以及和主要事件再次失敗的結合。
當個別任務或者其他軟件組件失敗了,它失敗的原因幾乎不可能被定位。甚至當檢測到失敗并且嘗試恢復時候會以整個系統的失敗而結束。監視代碼不能夠經常安全地重啟任務,RTOS不能夠恢復由失敗任務動態定位的資源。結果就是復位通常是通過強制使用看門狗定時器來完成的,看門狗定時器重新啟動整個系統或者軟件引起的系統錯誤。
通常當一個程序跑飛了,它沒有任何征兆。一個錯誤的任務能夠破壞在RTOS系統中任何地方的數據和代碼。幸運的是,雖然這些破壞的影響瞬間產生,但是好像破壞的影響會在幾秒、幾小時、幾個月以后才會出現。
當異常的征兆出現了,去聯想預想不到的應用程序行為是及其困難的,這些行為由于原始的原因或者是很微小的,或者是破壞性的。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)電磁爐相關文章:電磁爐原理
評論