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