摘 要: 在簡述WinCE系統(tǒng)中普通IRQ中斷處理過程的基礎(chǔ)上,針對采用普通IRQ中斷的驅(qū)動程序?qū)崟r性能不高的問題,提出使用ARM處理器的FIQ中斷在實時性能要求較高的場合中的應(yīng)用方法。系統(tǒng)硬件部分使用ARM S3C2440處理器作為主控部分,軟件部分開發(fā)出WinCE5.0操作系統(tǒng)下使用FIQ中斷針對步進電機驅(qū)動器的驅(qū)動程序。實踐證明,驅(qū)動程序使用FIQ中斷是穩(wěn)定的且能獲得比IRQ中斷更好的實時性能。
關(guān)鍵詞: WinCE;S3C2440;FIQ
Microsoft Windows CE 是一個32 位、緊湊、高效、可擴展的操作系統(tǒng),適用于各種嵌入式系統(tǒng)和產(chǎn)品。它擁有多線程、多任務(wù)、確定性的實時、完全搶占式優(yōu)先級的操作系統(tǒng)環(huán)境,專門面向只有有限資源的硬件系統(tǒng)。同時,它的模塊化設(shè)計方式使得系統(tǒng)開發(fā)人員和應(yīng)用開發(fā)人員能夠為多種多樣的產(chǎn)品來定制它,可以選擇、組合和配置Windows CE 的模塊和組件來創(chuàng)建用戶版的操作系統(tǒng)[1]。良好的用戶界面使其在導航儀等消費類電子中得到了廣泛的應(yīng)用。在工業(yè)控制方面,有少數(shù)廠家以它作為內(nèi)核開發(fā)工業(yè)控制器,也有一些廠家只是作為終端顯示設(shè)備。在外圍沒有CPLD、FPGA或DSP協(xié)同工作的情況下,對于實時性較高的應(yīng)用場合一般不會選擇WinCE。
本文以步進電機驅(qū)動程序為例,針對普遍使用的IRQ中斷,提出用ARM處理器的FIQ中斷在實時性能要求高的場合中的應(yīng)用方法,可以大大提高控制系統(tǒng)實時處理能力,進而可以替代某些場合中使用的專用芯片或PLD芯片來滿足性能要求,以節(jié)約成本,降低功耗。
1 IRQ中斷過程簡述
對于一個硬件中斷,系統(tǒng)內(nèi)核在捕獲之后,會交給 OEMInterruptHandler 函數(shù)處理,這個函數(shù)就是實現(xiàn)中斷處理的中心函數(shù)。函數(shù)可以從CPU的寄存器里獲得中斷的信息,這些信息可以指出是哪個中斷源觸發(fā)了中斷。
在得到觸發(fā)中斷源信息后,最簡單的中斷處理辦法就是在OEMInterruptHandler中直接對中斷源進行判斷,然后調(diào)用服務(wù)程序。
另一種中斷處理辦法是應(yīng)用程序建立中斷服務(wù)線程(IST),然后申請一個系統(tǒng)邏輯中斷號(SYSINTR),創(chuàng)建一個事件(Event) ,使用InterruptInitialize函數(shù)將 Event 與 SYSINTR 綁定,隨后 IST阻塞在等待Event上面。當硬件中斷發(fā)生后,OEMInterruptHandler只給系統(tǒng)返回一個 SYSINTR,用來標記需要哪個程序來服務(wù)中斷,系統(tǒng)根據(jù)綁定關(guān)系激活相應(yīng)的Event,使得隨后的 IST得以運行。在中斷處理完成之后需要調(diào)用 InterruptDone,參數(shù)為該中斷的SYSINTR,用來通知系統(tǒng)中斷處理完成,系統(tǒng)重新使能該中斷。這種處理方法可以使中斷被關(guān)閉、系統(tǒng)被鎖定的時間最短。此外,還需要實現(xiàn)OEMInterruptEnable和OEMInterruptDisable函數(shù)來改變處理器中斷屏蔽寄存器[2]。處理過程如圖1所示。
當使用上文所述IRQ中斷服務(wù)程序結(jié)構(gòu)時,為了使實時性更好,采用直接在OEMInterruptHandler中對中斷源進行處理的方式對步進電機驅(qū)動器Q2HB44MA和步進電機57BYGHM403進行控制。由于中斷優(yōu)先級和響應(yīng)速度的原因,步進電機在旋轉(zhuǎn)過程中產(chǎn)生劇烈振動,根本無法在實際應(yīng)用場合中使用。
2 FIQ中斷驅(qū)動程序在WinCE系統(tǒng)中的實現(xiàn)
2.1 ARM處理器快速中斷FIQ
FIQ和IRQ是ARM處理器中兩種不同類型的中斷。FIQ比IRQ有更高優(yōu)先級,如果FIQ和IRQ同時產(chǎn)生,那么先處理FIQ。當CPU處于FIQ模式處理FIQ中斷的過程中,預取指令異常,未定義指令異常,軟件中斷全被禁止,所有的中斷被屏蔽。所以FIQ會很快被執(zhí)行,不會被其他異常或者中斷打斷。而IRQ不一樣,當ARM處于IRQ模式處理IRQ中斷時,如果來了一個FIQ中斷請求,那么正在執(zhí)行的IRQ中斷處理程序會被搶斷,ARM切換到FIQ模式去執(zhí)行該FIQ中斷[3]。
2.2 步進電機加減速實現(xiàn)
步進電機在啟動或停止時若步進脈沖變化太快,轉(zhuǎn)子由于慣性而跟隨不上電信號的變化,會產(chǎn)生失步或超步現(xiàn)象。一般來說對于電機起始轉(zhuǎn)速小于2 r/s時,根據(jù)負載情況可能不會出現(xiàn)失步或超步的現(xiàn)象。但在轉(zhuǎn)速較高、負載較大的情況下,為了避免失步或超步現(xiàn)象,通常采用加減速控制。加減速過程需要設(shè)定步進電機的起始頻率、穩(wěn)定頻率和加速時間,但是在控制中則需要計算出加速過程所需要的脈沖個數(shù)。對于加速過程有以下關(guān)系式:
2.3 添加步進電機結(jié)構(gòu)和IOCTL接口
WinCE操作系統(tǒng)設(shè)計借鑒了Windows 2000/XP操作系統(tǒng)的設(shè)計,從體系結(jié)構(gòu)上,它具有分層結(jié)構(gòu)的特點,從上到下為應(yīng)用程序?qū)?、操作系統(tǒng)層、OEM層和硬件層。OEM層是邏輯上位于硬件和操作系統(tǒng)之間的一層硬件相關(guān)代碼。它的主要作用是對具體的硬件進行抽象,抽象出統(tǒng)一的接口,然后WinCE內(nèi)核可以使用這些接口與硬件進行通信,這樣在移植WinCE到新的硬件平臺時可以減少對操作系統(tǒng)的修改,通俗地說就是為WinCE操作系統(tǒng)抹平MCU的差異,使其能方便地移植到其他MCU上運行。OEM抽象層(OAL)是整個OEM層的主體,它包含了高度硬件相關(guān)的代碼,OAL主要負責WinCE內(nèi)核與硬件交互。
為了能夠用WinCE的流接口驅(qū)動程序操作ARM處理器的FIQ中斷,需要修改WinCE系統(tǒng)OEM層中的OAL部分。在s2440.h文件中定義步進電機數(shù)據(jù)結(jié)構(gòu),包括起始頻率、穩(wěn)定頻率、上升脈沖數(shù)、剩余脈沖數(shù)、當前上升/下降沿狀態(tài)等運行參數(shù)和狀態(tài)變量。
在oemioctl.c文件中定義步進電機結(jié)構(gòu)的全局變量。為了使驅(qū)動程序可以訪問到此變量,使用WinCE系統(tǒng)的IOCTL接口。在WinCE5.0中,應(yīng)用程序和驅(qū)動程序可以通過調(diào)用KernelIoControl()函數(shù)來訪問WinCE內(nèi)核,導致調(diào)用OEMIoControl函數(shù),這樣應(yīng)用程序和驅(qū)動程序就可以訪問到OAL中的資源了,可以說OEMIoControl是一個很有用的WinCE內(nèi)核輸入/輸出函數(shù)。在OEMIoControl函數(shù)中添加case語句使得驅(qū)動程序傳來的運行參數(shù)和運行/停止命令可以得到記錄和響應(yīng),在更新參數(shù)命令處理中把運行的參數(shù)賦值給步進電機結(jié)構(gòu)變量;在開始運行命令處理中打開定時器FIQ中斷使能、設(shè)置定時器周期、開始定時器運行;在停止命令中記錄停止信息使得在當前脈沖循環(huán)完成后停止脈沖的輸出。
2.4 添加中斷處理過程代碼
由于在IOCTL的開始運行命令處理中打開了定時器的FIQ中斷使能,當定時器時間達到時,中斷服務(wù)程序不再是OEMInterruptHandler,而是FIQHandler。由FIQHandler調(diào)用OEMInterruptHandlerFIQ函數(shù)進行處理。
在armtrap.s匯編文件中的FIQHandler入口處,調(diào)用OEMInterruptHandlerFIQ函數(shù)的前后應(yīng)該使用msr匯編指令添加禁止/使能FIQ中斷的操作。
在arminit.c文件的OEMInterruptHandlerFIQ函數(shù)中添加更新GPIO口輸出電平、脈沖計數(shù)、加減速/恒速狀態(tài)切換、定時器周期之更新等操作,如果當前發(fā)送脈沖為最后一個脈沖的下降沿,則需要關(guān)閉FIQ的中斷使能,這樣當脈沖發(fā)送完成后會產(chǎn)生普通IRQ中斷來觸發(fā)OEMInterruptHandler函數(shù)的調(diào)用,讓系統(tǒng)通知驅(qū)動程序當前運動任務(wù)的完成。
另外,還需要實現(xiàn)OEMInterruptEnable和OEMInter-
ruptDisable函數(shù)來改變處理器中斷屏蔽寄存器。
2.5 驅(qū)動程序添加
驅(qū)動程序采用WinCE的普通流接口驅(qū)動程序,通過KernelIoControl接口對步進電機進行參數(shù)設(shè)置和啟/??刂?,在設(shè)置參數(shù)之前應(yīng)該使用式(2)計算加/減速脈沖個數(shù)。
綜合以上過程,采用FIQ中斷的處理流程圖如圖2所示。
3 試驗測試
文章采用Windows CE5.0嵌入式操作系統(tǒng),結(jié)合ARM處理器的FIQ中斷機制,完成了步進電機驅(qū)動程序的實現(xiàn),在這種機制下,很好地克服了采用普通IRQ中斷的驅(qū)動程序?qū)崟r性能不高的問題,可以在實時性能要求較高的應(yīng)用場合中應(yīng)用。在試驗過程中可以看到,使用本文提出的采用FIQ中斷的驅(qū)動程序,可以平穩(wěn)地輸出120 kHz的脈沖,遠遠超過普通步進電機驅(qū)動器最高輸入脈沖頻率的20 kHz。
本文針對采用普通IRQ中斷的驅(qū)動程序?qū)崟r性能不高的問題,實現(xiàn)了使用ARM處理器的FIQ中斷來開發(fā)驅(qū)動程序。使用普通IRQ中斷的驅(qū)動程序來發(fā)送脈沖時,由于中斷優(yōu)先級和響應(yīng)時間的問題,步進電機產(chǎn)生劇烈振動,導致根本不能在實際應(yīng)用中使用。實踐證明,驅(qū)動程序使用FIQ中斷是穩(wěn)定的且能獲得比IRQ中斷更好的實時性能,合理采用可以替代某些場合中的專用芯片或PLD芯片,以節(jié)約成本,降低功耗。
參考文獻
[1] 盧愛臣,王劍宇,郭偉,等.基于WinCE自動控制臺的設(shè)計與實現(xiàn)[J].微計算機信息,2011(2):87-88.
[2] 微軟公司.Windows CE設(shè)備驅(qū)動程序開發(fā)指南[M].北京:北京希望電子出版社,1999.
[3] 杜春蕾.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學出版社,2003.
[4] 何宗鍵.Windows CE嵌入式系統(tǒng)[M].北京:北京航空航天大學出版社,2006.