UC/OS和UCLinux比較
随着現代計算機技術的飛速發展和網際網路技術的廣泛應用,從pc時 代過渡到了以個人數字助理、手持個人電腦和資訊家電為代表的3c(計算機、通信、消費電子)一體的後pc時代。後pc時代裡,嵌入式系統扮演了越來越重要 的角色,被廣泛應用于資訊電器、移動計算機裝置、網絡裝置和工控仿真等領域。嵌入式系統的開發也成為近年it行業的技術熱點。
完成簡單功能的嵌入式系統一般不需要作業系統,如以前許多m cs51系列單片機組成的小系統就隻是利用軟體實作簡單的控制環路。但是随着所謂後pc時代的來臨,嵌入式系統設計日趨複雜,嵌入式作業系統就必不可少了。
一般而言,嵌入式作業系統不同于一般意義的計算機作業系統,它有占用空間小、執行效率高、友善進行個性化定制和軟體要求固化存儲等特點。
從八十年代起,國際上就有一些it組織、公司,開始進行商用嵌入式系統和專用作業系統的研發。這其中湧現了一些著名的嵌入式系統,如microsoft公 司的 wince和windriversystem公司的vxworks就分别是非實時和實時嵌入式作業系統的代表。但是商用産品的造價都十分昂貴,用于一般用 途會提高産品成本進而失去競争力。
uc/os和uclinux作業系統是兩種性能優良源碼公開且被廣泛應用的的免費嵌入式作業系統,可以作為研究實時作業系統和非實時作業系統的典範。本文 通過對 uc/os和uclinux的對比,分析和總結了嵌入式作業系統應用中的若幹重要問題,歸納了嵌入式系統開發中作業系統的選型依據。
兩種開源嵌入式作業系統介紹
uc/os和uclinux作業系統,是目前得到廣泛應用的兩種免費且公開源碼的嵌入式作業系統。uc/os适合小型控制系統,具有執行效率高、占用空間 小、實時性能優良和可擴充性強等特點,最小核心可編譯至2k。uclinux則是繼承标準linux 的優良特性,針對嵌入式處理器的特點設計的一種作業系統,具有内嵌網絡協定、支援多種檔案系統,開發者可利用标準linux先驗知識等優勢。其編譯後目标 檔案可控制在幾百k量級。
uc/os是一種免費公開源代碼、結構小巧、具有可剝奪實時核心的實時作業系統。其核心提供任務排程與管理、時間管理、任務間同步與通信、記憶體管理和中斷服務等功能。
uclinux是一種優秀的嵌入式linux版本。uclinux是micro-conrol-linux的縮寫。同标準linux相比,它內建了标準 linux作業系統的穩定性、強大網絡功能和出色的檔案系統等主要優點。但是由于沒有mmu(記憶體管理單元),其多任務的實作需要一定技巧。
兩種嵌入式作業系統主要性能比較
嵌入式作業系統是嵌入式系統軟硬體資源的控制中心,它以盡量合理的有效方法組織多個使用者共享嵌入式系統的各種資源。其中使用者指的是系統程式之上的所有軟 件。所謂合理有效的方法,指的就是作業系統如何協調并充分利用硬體資源來實作多任務。複雜的作業系統都支援檔案系統,友善組織檔案并易于對其規範化操作。
嵌入式作業系統還有一個特點就是針對不同的平台,系統不是直接可用的,一般需要經過針對專門平台的移植作業系統才能正常工作。 程序排程、檔案系統支援和系統移植是在嵌入式作業系統實際應用中最常見的問題,下文就從這幾個角度入手對uc/os和uclinux進行分析比較。
程序排程
任務排程主要是協調任務對計算機系統内資源(如記憶體、i/o裝置、cpu)的争奪使用。程序排程又稱為cpu排程,其根本任務是按照某種原則為處于就緒狀 态的程序配置設定cpu。由于嵌入式系統中記憶體和i/o裝置一般都和cpu同時歸屬于某程序,是以任務排程和程序排程概念相近,很多場合不加區分,下文中提到 的任務其實就是程序的概念。
程序排程可分為"剝奪型排程"和"非剝奪型排程"兩種基本方式。所謂"非剝奪型排程"是指:一旦某個程序被排程執行,則該程序一直執行下去直至該程序結 束,或由于某種原因自行放棄cpu進入等待狀态,才将cpu重新配置設定給其他程序。所謂"剝奪型排程"是指:一旦就緒狀态中出現優先權更高的程序,或者運作 的程序已用滿了規定的時間片時,便立即剝奪目前程序的運作(将其放回就緒狀态),把cpu配置設定給其他程序。
作為實時作業系統,uc/os是采用的可剝奪型實時多任務核心。可剝奪型的實時核心在任何時候都運作就緒了的最高優先級的任務。uc/os中最多可以支援 64 個任務,分别對應優先級0~63,其中0為最高優先級。排程工作的内容可以分為兩部分:最高優先級任務的尋找和任務切換。
其最高優先級任務的尋找是通過建立就緒任務表來實作的。uc/os中的每一個任務都有獨立的堆棧空間,并有一個稱為任務控制塊tcb(task control block)資料結構,其中第一個成員變量就是儲存的任務堆棧指針。任務排程子產品首先用變量 ostcbhighrdy記錄目前最進階就緒任務的tcb位址,然後調用os_task_sw() 函數來進行任務切換。
uclinux的程序排程沿用了linux的傳統,系統每隔一定時間挂起程序,同時系統産生快速和周期性的時鐘計時中斷,并通過排程函數(定時器處理函數)決定程序什麼時候擁有它的時間片。然後進行相關程序切換,這是通過父程序調用fork 函數生成子程序來實作的。
uclinux系統fork調用完成後,要麼子程序代替父程序執行(此時父程序已經 sleep),直到子程序調用exit退出;要麼調用exec執行一個新的程序,這個時候産生可執行檔案的加載,即使這個程序隻是父程序的拷貝,這個過程 也不可避免。當子程序執行exit或exec後,子程序使用wakeup把父程序喚醒,使父程序繼續往下執行。
uclinux由于沒有mmu管理存儲器,其對記憶體的通路是直接的,所有程式中通路的位址都是實際的實體位址。作業系統隊記憶體空間沒有保護,各個程序實際 上共享一個運作空間。這就需要實作多程序時進行資料保護,也導緻了使用者程式使用的空間可能占用到系統核心空間,這些問題在程式設計時都需要多加注意,否則容易 導緻系統崩潰。
由上述分析可以得知,uc/os核心是針對實時系統的要求設計實作的,相對簡單,可以滿足較高的實時性要求。而uclinux則在結構上繼承了标準 linux的多任務實作方式,僅針對嵌入式處理器特點進行改良。其要實作實時性效果則需要使系統在實時核心的控制下運作,rt-linux就是可以實作這 一個功能的一種實時核心。
檔案系統
所謂檔案系統是指負責存取和管理檔案資訊的機構,也可以說是負責檔案的建立、撤銷、組織、讀寫、修改、複制及對檔案管理所需要的資源(如目錄表、存儲媒體等)實施管理的軟體部分。
uc/os是面向中小型嵌入式系統的,如果包含全部功能(信号量、消息郵箱、消息隊列及相關函數),編譯後的uc/os核心僅有6~10kb,是以系統本身并沒有對檔案系統的支援。但是uc/os具有良好的擴充性能,如果需要的話也可自行加入檔案系統的内容。
uclinux則是繼承了linux完善的檔案系統性能。其采用的是romfs檔案系統,這種檔案系統相對于一般的ext2檔案系統要求更少的空間。空間 的節約來自于兩個方面,首先核心支援romfs檔案系統比支援ext2檔案系統需要更少的代碼,其次romfs檔案系統相對簡單,在建立檔案系統超級塊 (superblock)需要更少的存儲空間。romfs檔案系統不支援動态擦寫儲存,對于系統需要動态儲存的資料采用虛拟ram盤的方法進行處理 (ram盤将采用ext2檔案系統)。
uclinux還繼承了linux網絡作業系統的優勢,可以很友善的支援網絡檔案系統且内嵌tcp/ip協定,這為uclinux開發網絡接入裝置提供了便利。
由兩種作業系統對檔案系統的支援可知,在複雜的需要較多檔案處理的嵌入式系統中uclinux是一個不錯的選擇。而uc/os則主要适合一些控制系統。
作業系統的移植
嵌入式作業系統移植的目的是指使作業系統能在某個微處理器或微控制器上運作。uc/os和uclinux都是源碼公開的作業系統,且其結構化設計便于把與處理器相關的部分分離出來,是以被移植到新的處理器上是可能的。
以下對兩種系統的移植分别予以說明。
(1)uc/os的移植
要移植uc/os,目标處理器必須滿足以下要求;
·處理器的c編譯器能産生可重入代碼,且用c語言就可以打開和關閉中斷;
·處理器支援中斷,并能産生定時中斷;
·處理器支援足夠的ram(幾k位元組),作為多任務環境下的任務堆棧;
·處理器有将堆棧指針和其他cpu寄存器讀出和存儲到堆棧或記憶體中的指令。
在了解了處理器和c編譯器的技術細節後,uc/os的移植隻需要修改與處理器相關的代碼就可以了。具體有如下内容:
·os_cpu.h中需要設定一個常量來辨別堆棧增長方向;
·os_cpu.h中需要聲明幾個用于開關中斷和任務切換的宏;
·os_cpu.h中需要針對具體處理器的字長重新定義一系列資料類型;
·os_cpu_a.asm需要改寫4個彙編語言的函數;
·os_cpu_c.c需要用c語言編寫6個簡單函數;
·修改主頭檔案include.h,将上面的三個檔案和其他自己的頭檔案加入。
(2)uclinux的移植
由于uclinux其實是linux針對嵌入式系統的一種改良,其結構比較複雜,相對 uc/os,uclinux的移植也複雜得多。一般而言要移植uclinux,目标處理器除了應滿足上述uc/os應滿足的條件外,還需要具有足夠容量 (幾百k位元組以上)外部rom和ram。
uclinux的移植大緻可以分為3個層次:
·結構層次的移植,如果待移植處理器的結構不同于任何已經支援的處理器結構,則需要修改linux/arch目錄下相關處理器結構的檔案。雖然 uclinux核心代碼的大部分是獨立于處理器和其體系結構的,但是其最低級的代碼也是特定于各個系統的。這主要表現在它們的中斷處理上下文、記憶體映射的 維護、任務上下文和初始化過程都是獨特的。這些例行程式位于linux/arch/目錄下。由于linux所支援體系結構的種類繁多,是以對一個新型的體 系,其低級例程可以模仿與其相似的體系例程編寫。
·平台層次的移植,如果待移植處理器是某種uclinux已支援體系的分支處理器,則需要在相關體系結構目錄下建立相應目錄并編寫相應代碼。如 mc68ez328就是基于無mmu的m68k核心的。此時的移植需要建立 linux/arch/m68knommu/platform/ mc68ez328目錄并在其下編寫跟蹤程式(實作使用者程式到核心函數的接口等功能)、中斷控制排程程式和向量初始化程式等。
·闆級移植,如果你所用處理器已被uclinux支援的話,就隻需要闆級移植了。闆級移植需要在linux/arch/?platform/中建立一個相 應闆的目錄,再在其中建立相應的啟動代碼crt0_rom.s或crt0_ram.s和連結描述文檔rom.ld或ram.ld就可以了。闆級移植還包括 驅動程式的編寫和環境變量設定等内容。
結語
通過對uc/os和uclinux的比較,可以看出這兩種作業系統在應用方面各有優劣。 uc/os占用空間少,執行效率高,實時性能優良,且針對新處理器的移植相對簡單。uclinux則占用空間相對較大,實時性能一般,針對新處理器的移植 相對複雜。但是,uclinux具有對多種檔案系統的支援能力、内嵌了tcp/ip協定,可以借鑒linux豐富的資源,對一些複雜的應用, uclinux具有相當優勢。例如cisco 公司的 2500/3000/4000 路由器就是基于uclinux作業系統開發的。 總之,作業系統的選擇是由嵌入式系統的需求決定的。簡單的說就是,小型控制系統可充分利用uc/os小巧且實時性強的優勢,如果開發pda和網際網路連接配接終 端等較為複雜的系統則uclinux是不錯的選擇。
數字應用開發闆對uCos II和uClinux網絡的支援
自由電子科技的數字應用開發闆是現在市面上最具成本效益的FPGA NIOS II開發闆。
在硬體上,它不但擁有豐富的存儲資源(64M Byte SDRAM,32M Byte Flash,1M Byte的Sram,是同類闆的幾倍以上),而且有兩路網絡,一路是lan91c111 MAC+PHY類型的,另一路是PHY的,EMAC做在FPGA内部。這樣的配置适合了目前常用的兩種網絡應用模式。通過40芯的擴充插座還可以擴充 DM9000的網絡晶片。
軟體上,有兩個環境:
1、Nios II IDE HAL + uCos + lwip環境,自由電子科技是國内最早做配套網絡驅動程式的,我們提供了SOPC下的IP CORE和HAL下的驅動程式。
2、在Nios II Microtronix uClinux作業系統環境下,自由電子科技提供了移植好的範例項目。支援10M/100M網絡系統,而不是一個簡易的核心。大容量的Flash支援較大 的檔案系統,大容量的sdram有效提高了系統的速度。是FPGA上嵌入式開發的最佳選擇。