論述了以Linux作為操作系統的機車顯示系統在性能、成本、可靠性等各方面的優勢,分析了在構造帶圖形用戶界面(GUI)的嵌入式Linux系統中所用到的關鍵技術.
0 引言 內核負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。為了減低不必要的復雜性,內核中不采用kernel module支持,把需要的東西直接編譯到內核里;如果使用CompactFlash卡作為存儲介質,IDE支持是必不可少的,因為Linux認CompactFlash卡為IDE硬盤;內核對網絡的支持可以視用戶需求進行添加或刪除;至于SCSI、Floppy之類的外設在我們的嵌入式系統中完全沒有必要,編譯時可去掉。這樣,重新編譯過的內核顯著減小。 linux的一個特性是虛擬內存交換,這一特性使應用程序的內存需求量可以無限制上升,因為操作系統在磁盤中提供了交換空間。而在存儲容量相對較小的機車顯示系統中,這種特性就用不上了。事實上,在一個要求比較嚴格的定時系統中,它會導致定時功能的失控。 實現虛擬內存的機制有:地址映射機制、內存分配和回收機制,緩存和刷新機制、請頁機制、交換機制、內存共享機制,將實現這些機制的數據結構和函數屏蔽或修改,還要修改與之相關的文件。需要改動的文件主要在/include/linux、/mm、drivers/char、/fs、/ipc/kernel、/init目錄下。主要的改動如下:與虛存有關的主要的數據結構是vm_area_struct,將進程的mm_struct結構中的vm_area_struct去掉,vm_area_struct利用了vm_ops來抽象出對虛擬內存的處理方法,屏蔽與虛擬內存操作有關的函數。內存映射主要由do_mmap()實現,改寫此函數的代碼。取消交換操作,屏蔽用于交換的結構和函數聲明,以及實現交換的代碼。取消內核守護進程kswapd. 另一種比較簡單的辦法是將系統的交換空間大小簡單地置為0,就可以關掉虛擬內存的分頁交換機制了。當程序要求內存大于實際的內存時,系統的表現就如同交換空間溢出時一樣,程序不會被加載,或者當要求過多內存時,malloc調用失敗 在機車顯示系統中,需要用到兩類比較重要的設備驅動程序:幀緩沖(frame buffer)驅動程序和閃存MTD驅動程序。 這是最重要的驅動程序之一,因為通過這個驅動程序才能使系統屏幕顯示內容。幀緩沖驅動程序通常有三層。最底層是基本控制臺驅動程序linux/drivers/char/console.c,它提供了文本控制臺常規接口的一部分。通過使用控制臺驅動程序函數,我們能將文本打印到屏幕上——但圖形或動畫還不能(這樣做需要使用視頻模式功能,通常出現在中間層,也就是linux/drivers/video/fbcon.c中)。這個第二層驅動程序提供了視頻模式中繪圖的常規接口。 參考文獻 [1] 王學龍. <<嵌入式Linux系統設計與應用>>. 清華大學出版社. 2001.8 IBM developerWorks網站. 2002.3
當前,機車網絡控制系統發展迅速,系統硬件和軟件平臺不斷更新,信息在網絡上的傳輸及響應愈發快捷,但是機車顯示器作為網絡系統上極其重要的人機接口設備,其軟件平臺仍停留在傳統的DOS操作系統,顯示應用軟件采用DOS下的C語言編程,所有任務如數據的傳輸、顯示、設備參數設置等都包含一個循環處理的控制流程中,從而導致數據刷新相對緩慢,開發過程繁瑣,難以控制。Linux為我們提供了一個極有吸引力的選擇來解決上述問題,首先,他是多任務的操作系統,我們可以采用消息傳遞機制來實現任務的調度;其次,在linux上有許多專門為嵌入式系統定制的GUI系統,我們可以充分利用它們所提供的圖形函數來實現圖形化的編程環境,加快應用軟件開發進度;另外,linux還有很多優點,如它有完整免費開放的源代碼,可針對具體應用修改和優化系統,內核穩定,適用于多種CPU和多種硬件平臺,支持網絡等,因此用它來構建機車顯示系統操作平臺是一個不錯的解決方案。
1 linux系統平臺構建中的關鍵技術
1.1 系統硬件設計
考慮一般測控系統對嵌入式系統要求比較多的功能有:鍵盤接口、顯示接口、與PC機通信的串行接口、機車網絡接網口等。實現的嵌入式系統硬件框圖如下:
圖2 硬件框圖
針對機車顯示系統的應用,現在用得比較多的是PC104卡,它采用x86系列的CPU,具有小巧、堅固、擴展性強的特點;另外一種選擇是采用以ARM9為核心的高端嵌入式CPU,比如Motorola PowPC系列的MPC823處理器和Intel的Xscale系列處理器等,它們專們為嵌入式產品的開發而設計,具有廣泛的外部設備接口,也就是我們常說的片上系統(System on Chip),可用于多種通信顯示控制系統,具有更高的性價比。
1.2 系統軟件平臺設計
由于象Red Hat或Mandrake這樣的Linux分發版體積龐大(如果帶X-Windows基本都在1G以上),是不可能裝在存儲容量很小的嵌入式系統上的,因此,需要對linux進行相應的裁減和定制,這其中涉及到的關鍵技術有:
1) 內核精簡及編譯
FrameBuffer的優點在于其高度的可移植性、易使用性、穩定性。使用Linux內核的FrameBuffer驅動,可以輕松支持到1024X768X32bpp以上的分辯率。而且目前可得到的絕大多數linux版本所發行的內核中,已經預編譯了FrameBuffer支持,通常不需要重新編譯內核就可以使用。進入FrameBuffer可以簡單地在系統啟動時向kernel傳送vga=mode-number的參數來激活FrameBuffer設備
閃存MTD驅動程序
MTD 設備是象閃存芯片、小型閃存卡、記憶棒等之類的設備,它們在嵌入式設備中的使用正在不斷增長。MTD 驅動程序是在 Linux 下專門為嵌入式環境開發的新的一類驅動程序。相對于常規塊設備驅動程序,使用 MTD 驅動程序的主要優點在于 MTD 驅動程序是專門為基于閃存的設備所設計的,所以它們通常有更好的支持、更好的管理和基于扇區的擦除和讀寫操作的更好的接口。Linux 下的 MTD 驅動程序接口被劃分為兩類模塊:用戶模塊和硬件模塊。
用戶模塊:這些模塊提供從用戶空間直接使用的接口:原始字符訪問、原始塊訪問、FTL(閃存轉換層,Flash Transition Layer — 用在閃存上的一種文件系統)和 JFS(即日志文件系統,Journaled File System — 在閃存上直接提供文件系統而不是模擬塊設備)。用于閃存的 JFS 的當前版本是 JFFS2(稍后將在本文中描述)。
硬件模塊:這些模塊提供對內存設備的物理訪問,但并不直接使用它們。通過上述的用戶模塊來訪問它們。這些模塊提供了在閃存上讀、擦除和寫操作的實際例程。
為了訪問特定的閃存設備并將文件系統置于其上,需要將 MTD 子系統編譯到內核中。
(4) 文件系統(filesystem)
系統需要一種以結構化格式存儲和檢索信息的方法,這就需要文件系統的參與。Ext2fs 是 Linux 事實上的標準文件系統,它已經取代了它的前任——擴展文件系統(Extfs)。因為 Ext2 文件系統的穩定性、可靠性和健壯性,所以幾乎在所有基于 Linux 的系統(包括臺式機、服務器和工作站——并且甚至一些嵌入式設備)上都使用 Ext2 文件系統。然而,當在機車顯示系統中使用 Ext2fs 時,它有一些缺點:
● Ext2 文件系統沒有提供對基于扇區的擦除/寫操作的良好管理。在 Ext2fs 中,為了在一個扇區中擦除單個字節,必須將整個扇區復制到 RAM,然后擦除,然后重寫入??紤]到閃存設備具有有限的擦除壽命(大約能進行 100,000 次擦除),在此之后就不能使用它們,所以這不是一個特別好的方法。
● 在出現電源故障時,Ext2fs 不是防崩潰的。 機車顯示系統要求經常性的掉電保護,使用Ext2fs文件系統將造成文件數據的丟失。
● Ext2 文件系統不支持損耗平衡,因此縮短了扇區/閃存的壽命。(損耗平衡確保將地址范圍的不同區域輪流用于寫和/或擦除操作以延長閃存設備的壽命。)
由于這些原因,通常相對于 Ext2fs,在機車顯示系統中使用 MTD/JFFS2 組合是更好的選擇。
JFFS2,作為用于微型嵌入式設備的原始閃存芯片的實際文件系統而出現。JFFS2 文件系統是日志結構化的,相對于Ext2文件系統,JFFS2有以下優點:
● JFFS2 在扇區級別上執行閃存擦除/寫/讀操作要比 Ext2 文件系統好。
● JFFS2 提供了比 Ext2fs 更好的崩潰/掉電安全保護。當需要更改少量數據時,Ext2 文件系統將整個扇區復制到內存(DRAM)中,在內存中合并新數據,并寫回整個扇區。這意味著為了更改單個字,必須對整個扇區(64 KB)執行讀/擦除/寫例程 — 這樣做的效率非常低。要是運氣差,當正在 DRAM 中合并數據時,發生了電源故障或其它事故,那么將丟失整個數據集合,因為在將數據讀入 DRAM 后就擦除了閃存扇區。JFFS2 附加文件而不是重寫整個扇區,并且具有崩潰/掉電安全保護這一功能。
● 這可能是最重要的一點:JFFS2 是專門為象閃存芯片那樣的嵌入式設備創建的,所以它的整個設計提供了更好的閃存管理。
在linux下,用mkfs.jffs2命令創建JFFS2文件系統。
2 圖形用戶界面(GUI) -- MiniGUI
從用戶的觀點來看,圖形用戶界面(GUI)是系統的一個最至關重要的方面:用戶通過 GUI 與系統進行交互。所以 GUI 應該易于使用并且非??煽?。但它還需要是有內存意識的,以便在我們的內存受限的顯示系統上可以無縫執行。所以,它應該是輕量級的,并且能夠快速裝入。另一個要考慮的重要方面涉及許可證問題。一些 GUI 分發版具有允許免費使用的許可證,甚至在一些商業產品中也是如此。另一些許可證要求如果想將 GUI 合并入項目中則要支付版稅。
現在面向嵌入式Linux 系統的圖形用戶界面很多,如MicoroWindows/NanoX ,OpenGUI,Qt/Embedded,MiniGUI等,我們選用MiniGUI ,到目前為止,已經非常成熟和穩定。從MiniGUI的官方網站(http://www.minigui.org)上可以下載MiniGUI的源代碼,
因為MiniGUI 是以源代碼的形式發布的,在硬盤上以編譯的方法產生的MiniGUI的libminigui 目錄下包含了這些源代碼以及編譯時生成的中間文件,所以需要的空間很大,是不可能將它全部拷貝到容量受限的嵌入式系統上的,我們需要的文件有:
● MiniGUI 的函數庫,包括 libminigui、libmywins 和 libmgext 等,還包括其他的應用程序函數庫。
● MiniGUI 的配置文件,即 /usr/local/etc/MiniGUI.cfg 文件。
● MiniGUI 所使用的資源文件。在 PC 上安裝之后,MiniGUI 的資源文件保存在usr/local/lib/minigui/res 目錄下。
如果還是覺得太大,參照下面的方法進行修改:
1. 首先可以修改編譯選項,把不用的功能去掉,比如說繁體支持等。這樣庫會小一些。
2. 去掉無用的資源,默認安裝的資源在/usr/local/lib/MiniGUI下面。其中FONTS目錄可以只保留一種字體,IMETAB下面可以只保留一種輸入法,RES下面也可以刪除一些位圖文件,調整MiniGUI 的配置文件內容。
在擁有圖形用戶界面的機車顯示系統Linux操作平臺已經搭建完成后,就可以在開發系統上寫自己的應用程序,然后將它燒錄至閃存設備上運行。
3 結束語
目前,該操作系統平臺已經在株洲電力機車研究所研制成功,硬件平臺采用PC104卡,存儲介質為CompactFlash卡,經測試,數據刷新及顯示滿足一般的實時性要求。