基于ARM的紅外光汽車速度管理系統(tǒng)研究
由于uclinux 2.4.x內(nèi)核為非搶占式,進程時間片為10ms,本身實時性并不高。但由于本系統(tǒng)中只有一個高實時性任務----車輛通過信號的捕獲,因此,可通過TIMER1設備驅(qū)動程序操作LPC2294上的定時器實現(xiàn)CAP1.0腳信號的雙邊沿捕獲。TIMER1設備驅(qū)動由驅(qū)動程序初始化函數(shù)、清除函數(shù)、設備信息結構體,open、release、read、ioctl等方法以及中斷服務程序等構成。uclinux系統(tǒng)在加載內(nèi)核模塊時首先會執(zhí)行初始化函數(shù)timer1_init( ),通過調(diào)用result = register_chrdev (MAJOR_NR, DEVICE_NAME , timer1_fops)注冊字符設備;并依據(jù)返回值result判斷設備注冊是否成功;在內(nèi)核卸載模塊時,執(zhí)行清除函數(shù)timer1_cleanup( ),通過調(diào)用unregister_chrdev(MAJOR_NR, DEVICE_NAME)注消字符設備。設備信息結構體用來描述該設備的open、release、read等操作方法:其中,在系統(tǒng)和應用程序首次使用此定時器時,首先執(zhí)行timer1_open(struct inode *inode, struct file *filp) 方法調(diào)用request_irq(IRQ_timer1, timer1_irq_handle, SA_INTERRUPT, "my" DEVICE_NAME, NULL)函數(shù)進行中斷響應函數(shù)注冊,配置定時器T1IR、T1PR、T1TC、T1TCR等寄存器完成定時器初始化,使用中斷開關函數(shù)local_irq_save()和local_irq_restore()來控制臨界區(qū);最終由uclinux系統(tǒng)接收硬件中斷并調(diào)用中斷服務程序;當系統(tǒng)和應用程序不再使用該定時器時調(diào)用timer1_release(struct inode *inode, struct file *filp)進行關閉和釋放。中斷服務程序timer1_irq_handle(int irq,void *dev_id,struct pt_regs *regs)完成清除中斷源、定時器計數(shù)器復位以及通過uclinux提供的宏inl(T1CR)讀取捕獲寄存器中計數(shù)器的值并調(diào)用系統(tǒng)函數(shù)copy_to_usr()將數(shù)據(jù)從內(nèi)核空間拷貝至用戶空間。最后,將設備驅(qū)動程序timer1. c復制到linux-2.4.x/driver/char目錄下,在timer1.c中加入函數(shù)timer1_init()完成設備的注冊。在mem.c文件中添加timer1_init()外部函數(shù)說明,在chr_dev_init()函數(shù)添加timer1_init()調(diào)用,編譯得到新內(nèi)核[4]。
3.3 MiniGUI 移植
目前,嵌入式Linux 平臺下常見的 GUI 系統(tǒng)有: MicroWindows、QT/Embedded、XWindows、OpenGUI、MiniGUI 等多種選擇。從易用性、跨平臺性以及開發(fā)成本等多方面因素考慮,本文采用飛漫公司的MiniGUI 實現(xiàn)GUI 人機交互圖形界面的開發(fā)[5]。為方便調(diào)試,采用VMware 軟件在windows 系統(tǒng)下建立linux 平臺的宿主機,進入linux 環(huán)境,從www.minigui.com 上下載函數(shù)庫源代碼包libminigui-str-1.6.2.tar.gz 和資源文件包minigui-res-str-1.6.tar.gz 并展開。
MiniGUI 為實現(xiàn)其跨平臺特性,采用GAL(圖形抽象層)和IAL(輸入抽象層)將MiniGUI上層和操作系統(tǒng)隔離開。因此,首先創(chuàng)建lcdgal.c 文件,參考native 圖形引擎數(shù)據(jù)結構和Framebuffer 驅(qū)動程序按照GAL 接口編寫接口函數(shù);然后將液晶驅(qū)動程序lcddriver.clcddriver.h 及LPC2294 的頭文件lpc2294.h 放在libminigui 下的/src/gal/native 目錄下并修改Makefile.am 文件。在libminigui 的/src/ial 目錄下添加ialinput.h 和 ialinput.c 編寫IAL 接口函數(shù),并添加觸摸屏控制器驅(qū)動程序fm7843.c、fm7843.h 到/src/ial 目錄,同時修改Makefile.am文件。加入MINIGUI 擴展庫libmgext 支持,以Threads 模式交叉編譯并將得到的MiniGUI靜態(tài)鏈接庫與交叉編譯后的用戶應用程序進行鏈接,生成可在目標板上運行的目標文件,最后在移植好的uclinux 系統(tǒng)上安裝運行MiniGUI 所需的資源文件。
3.4 用戶界面設計
用戶界面主要包括一個主窗體用來顯示速度信息以及一個為車輛速度報警而設定的對話框。以MniniGUIMain( int argc, const char* argv[ ] ) 為入口,定義顯示區(qū)域,使用CreateThreadForMainWindow( )函數(shù)創(chuàng)建了兩個并發(fā)的線程,定義線程的入口函數(shù)地址并返回線程標識符;在主線程中配置完成對timer1 的初始化操作,通過hMainWnd =CreateMainWindow( Createinfo ) 創(chuàng)建主窗體并配置Createinfo 的各項屬性, 調(diào)用ShowWindows( hMainWnd, SW_SHOWNORMAL )函數(shù)顯示窗體作為用戶主界面,最終進入消息循環(huán)。監(jiān)視線程和主線程同時啟動,此后,監(jiān)視線程在后臺對車速信息數(shù)據(jù)進行實時監(jiān)控,并通過SendMessage( )向主線程發(fā)送相應的消息。消息的處理與超速報警判定可在主窗體窗口過程函數(shù)SpeedWinProc( )中實現(xiàn)。主窗體中的SET和About 下拉菜單通過CreatMenu( )和CreatePopupMenu( )函數(shù)實現(xiàn),分別用于彈出速度設定對話框和系統(tǒng)說明對話框。將菜單句柄賦給主窗體的hMenu 屬性并在窗體過程函數(shù)中加入對應菜單的處理代碼,當菜單被管理者點擊時,該窗體會收到相應的MSG_COMMAND 消息,系統(tǒng)根據(jù)消息執(zhí)行相應菜單下的速度設定處理程序或系統(tǒng)說明顯示程序。在速度設定對話框中,按鈕使用普通“確定/OK”按鈕CTRL_BUTTON,兩個靜態(tài)框CTRL_STATIC 分別標識兩個單行編輯框CTRL_SLEDIT的功能:“上限速度設定”和“下限速度設定”。兩個編輯框用來接收管理者輸入的上限速度和下限速度。編輯框內(nèi)的速度設定值通過MSG_GETTEXT 消息由CTRL_COOLBAR 控件實現(xiàn)的數(shù)字按鈕輸入。各控件的創(chuàng)建通過以控件類名調(diào)用Createwindow 函數(shù)實現(xiàn)。
4 結論
調(diào)制式紅外光汽車速度識別系統(tǒng),不僅能準確測出汽車車速狀況,其測速信息還能避開“電子狗”式的反測速裝置捕捉,使違章車輛難以逃避處罰,對提高交通管制的質(zhì)量、消除事故隱患、保證人民群眾的生命財產(chǎn)安全具有重要作用,并可用于其他測速場合,應用前景非常廣闊。由于感應頭僅對38 kHz 的調(diào)制紅外光敏感, 其他紅外光對其幾乎無作用, 因此,系統(tǒng)具有較強的抗干擾能力。系統(tǒng)采用了ARM 嵌入式處理器、uclinux 操作系統(tǒng)以及觸摸屏,不但人機交互性好,而且升級和擴展能力強,工作穩(wěn)定,具有較大的應用前景。
評論