摘要:為了解決高溫監測系統在原DOS系統中不能實現多線程所造成的監測系統容量小、系統運行不穩定、CPU運行效率低、應用及修改程序不靈活等問題。基于高溫監測系統V1.0的需求,從完善高溫監測系統功能的角度出發,分析現今Linux的發展必然是嵌入式系統這一趨勢。采用功能完善且一開始就針對實時系統,在設計之初就考慮了小巧、高性能和高效率的MiniGUI圖形用戶界面,提出在Linux上運用MiniGUI實現高溫監測系統。
關鍵詞:Linux;MiniGUI;監測系統;多線程
中圖分類號:TP316文獻標識碼:A文章編號:1009-3044(2008)09-11650-03
Design And Implementation of High Temperature Watch And Test System Based On Linux Operating System
GAO Ling-ling1, RUAN Lei2
(1.Department of Computer Science and Technology, Hefei University,Hefei 230601, China; 2.Wuhan University of Science and technology Zhongnan Branch,Wuhan 432003, China )
Abstract: In order to solve the incapability of implementing multithreading, which lead to small capability of The High Temperature Watch And Test System ,unstable running system, low running efficiency of the CPU, inflexibility of applying and amending the program ,with the original DOS Operating System. Based on the request of Version 1.0,from the point of view to get a perfect function ,we analyzed the Linux Operating System and found that the development trend is Embedded System. So we adopted the Graphical User Interface MiniGUI , aimed at the Real Time System at the first beginning, considering of the small and cunning , high capability and efficiency at the very start of the program designing. For all the above reasons ,we advanced the item that use MiniGUI to design and implement High Temperature Watch And Test System on Linux Operating System.
Key words: Linux; MiniGUI; Watch And Test System; multithreading
1 引言
DOS操作系統,由于其只支持單線程,在程序設計中,只能采用查詢法和中斷法來實現。查詢法執行過程中,CPU多數時間是在等待,造成資源的浪費。中斷法在程序設計復雜時,尤其是當系統的硬件中斷資源緊張時,很容易造成中斷沖突。Linux具有開放源代碼、內核可配置、可裁剪、可移植、可維護等特點。鑒于工業控制對實時性的要求, Linux不斷地被應用于工業控制等領域。在Linux上開發圖形界面,可以為用戶提供友好的交互平臺。MiniGUI是一個非常適合工業控制實時系統以及嵌入式系統的可定制的、小巧的圖形用戶界面支持系統。因此,選擇了在Linux上運用MiniGUI開發高溫監測系統的圖形界面。以適應今后工業上對嵌入式圖形用戶界面輕型、占用資源少、高性能、高可靠性、可配置等特性的需求。
2 系統設計策略
2.1 多線程策略
基于I/O的計算中,采用多線程程序設計可以有效的提高系統性能。只要滿足計算之間在量上有明顯的差異;每個計算是相互獨立的。多線程技術開發的應用系統可以保證用戶總是能夠在一個很短的時間內完成與應用程序的交互,即響應快速的應用程序。高溫監測系統具有打印系統信息、測量機房溫度、超溫報警、超壓報警、測試設備運行狀態、測試電壓等功能。這些都是與I/O有關的操作,且模塊之間相互獨立,要求實時性強。因此為了在基于I/O計算的應用程序中,實現對CPU性能的提高;應用程序在處理大部分相互獨立的計算中,提高容量;并加快應用程序的響應速度,我們采用多線程程序設計方法來實現高溫監測系統。
2.2 參數配置策略
高溫監測系統如果僅局限于監測高溫系統這一單一的功能,則不能滿足不斷變化的系統需求,降低了代碼的使用效率。因此采用了可以在程序啟動之后對參數進行配置的策略,并將配置好的參數保存留待下一次開機時使用。如設置待“烤機”數量及特定的“烤機”標號、最高報警溫度、最低報警溫度、最高報警電壓、最低報警電壓、以及打印數據時間間隔。這樣不但方便了用戶的使用,而且增加了程序的適用范圍及靈活性,用戶不需要修改或者稍加修改就可以用在其他的相關領域,減少了同類功能程序的開發周期,提高了代碼的重用性。
3 系統的實現
3.1 環境的搭建
運行平臺:8253工業主板,主頻PII200MHz,32M RAM,32M DOM,ISA總線接口,網口,32/24 I/O板兩塊,研祥A/D板一塊,TOKY溫控表,一臺EPSON并口打印機。應用NC110或其他體系結構。
軟件平臺:Linux kernel 2.4.20 +MiniGUI1.3

3.2 系統的實現
3.2.1 顯示視窗的實現
Thread版本運行在多線程模式下,它的許多模塊都以單獨的線程運行;同時,還利用線程來支持多窗口,即每個主窗口對應于一個單獨的線程,每個線程有一個消息隊列,一個線程向消息隊列中發送消息,而另一個線程從這個消息隊列中獲取消息,同一個線程中創建的窗口可共享同一個消息隊列。MiniGUI利用消息隊列多線程之間的同步機制,實現客戶/服務器機制,建立基于線程的消息傳遞和窗口管理機制。
窗口功能提供字符操作界面。用MiniGUI實現窗口、對話框、編輯框、按紐、菜單等圖形功能。共六個窗口分別為:顯示64臺CNC狀態;根據輸入參數確定顯示多少臺數控的運行信息,如只對10臺CNC進行“烤機”,那么只顯示10臺CNC的信息;顯示最近一個小時的溫度及電壓曲線;顯示整個“烤機”過程的溫度,電壓曲線;在編輯框中顯示當前溫度、當前電壓,目前最大溫度、最小溫度,最大電壓、最小電壓,顯示系統提示,當前時間,系統開機運行以來,到目前為止運行時間等。
3.2.2 系統功能模塊實現
采用多線程的方式,使得完成各個功能模塊的線程可以在互相不干擾的情況下獨立的進行。通過全局變量和全局數據結構與主程序進行數據交換。由于Linux對I/O板和A/D板不提供驅動,需要編寫二個驅動程序,將其加載到Linux的/dev目錄下[1]。驅動程序的讀操作函數定義如下:
ssize_t scullc_read (struct file *filp, char *buf, size_t count,loff_t *f_pos)
本系統共使用了四個線程。第一個線程完成的功能,是采集智能溫控表數據。由于溫控表連接的是串口,Linux提供對串口的驅動程序。我們需要與串口通信,設置端口、數據位、波特率、奇偶校驗、停止位等屬性。第二個線程,用來控制打印機的輸出。Linux同樣提供并口驅動程序。應用并口打印機定時、準確打印出當前系統狀態。系統的開始運行時間、系統結束時間、在系統出錯時,立刻打印出當前系統時間和出錯系統的編號。需要注意的是,Linux下的打印機不能直接接受命令打印,而是需要一個打印隊列,按照隊列中的先后次序打印信息。第三個線程完成的功能,是從兩塊I/O板采集64個輸入點的數據,根據從輸入點采集回來的數據,編寫程序以判斷當前該點狀態是否正常。并在滿足溫度和電壓報警值的情況下,向I/O板發出報警信號。第四個線程完成的功能,是從一塊A/D板采集數據,并轉換成電壓值,為了減小測量值和真實值之間的誤差,加入了電壓值增補。 四個線程的創建[2]:
pthread_t t1,t2,t3,t4,t5,t6;
pthread_create(t1,NULL,(void *)ReadTemp,NULL);// 創建讀溫度線程
pthread_create(t2,NULL,(void *)PrintData,NULL);// 創建打印輸出線程
pthread_create(t3,NULL,(void *)CNCSTATUS,NULL);// 創建測試CNC狀態線程
pthread_create(t4,NULL,(void *)VoltVal,NULL);// 創建電壓線程


3.3 窗口實現
首先,激活FrameBuffer,這里我使用的是lilo引導裝載器,需要修改/etc/lilo.conf,在lilo.conf中添加vga=0x0314顯示模式為800x600x16bpp。其次,運行lilo命令,使修改生效,并重新啟動系統[3-5]。
MiniGUI程序的入口點為MiniGUIMain 函數原形如下:int MiniGUIMain (int args, const char* arg[]);應用程序一般通過DialogBoxIndirectParam函數創建對話框;在消息循環中,當程序向消息隊列發送case MSG_PAINT時,運行繪圖程序;當程序向消息隊列發送定時器消息case MSG_TIMER時,每個一段設置的固定時間,就執行相應的程序。在這里我實現了曲線的定時刷新。運行ldd命令,查看程序所需的鏈接庫文件名,將其拷貝到dom中與原來linux系統相對應的位置,再用gcc命令進行編譯的時候加上選項-static這樣就實現了靜態編譯。將編譯好的靜態文件拷入dom中,就可以運行了。
4 結束語
本文從完善高溫監測系統功能出發,分析了Linux、MiniGUI、多線程運用于高溫監測系統的諸多優點。并且該項目已經在高精數控“烤機”中應用,具有系統運行穩定,CPU運行效率顯著提高,監測系統容量大幅度增加,操作迅速簡潔,鼠標和鍵盤可以互相獨立進行操作。便于運用及修改程序,使其可以應用于類似的監測項目中,并對相關的應用具有一定的參考價值。
參考文獻:
[1] 魏永明,耿岳,鐘書毅,譯. Linux設備驅動程序[M]. 中國電力出版社,2006.
[2] 李玉波. Linux C編程[M]. 清華大學出版社,2005.
[3] 飛漫軟件. MiniGUI用戶手冊. 適用于MiniGUI ver 1.3.x
[4] 北京飛漫軟件技術有限公司. MiniGUI 技術白皮書,2005.
[5] 北京飛漫軟件技術有限公司. MiniGUI API Reference Manual,2003.