專利名稱:利用異步通知實(shí)現(xiàn)lxi載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法。
背景技術(shù):
LXI (LAN extensions for hstrumentation)技術(shù)是計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)與儀 器技術(shù)的有機(jī)結(jié)合。LXI是繼GPIB、VXI、PXI儀器總線之后的、新一代基于LAN的、適用于 自動(dòng)測(cè)試系統(tǒng)開(kāi)發(fā)的儀器標(biāo)準(zhǔn)。在ARM處理器和Linux操作系統(tǒng)下的基于M模塊的LXI載板軟件設(shè)計(jì)過(guò)程中,需 要對(duì)M模塊中斷處理過(guò)程慎重考慮,因?yàn)橐话銇?lái)說(shuō),Linux在驅(qū)動(dòng)層處理外部中斷,即中斷 處理過(guò)程在內(nèi)核層就完成了,而不能夠直接把外部中斷事件傳遞至應(yīng)用層。但在基于M模 塊的LXI載板軟件運(yùn)行時(shí),應(yīng)用層是必須要知道外部中斷事件的,這樣,才能在應(yīng)用層對(duì)其 做出處理。
發(fā)明內(nèi)容
本發(fā)明是為了解決LXI載板設(shè)計(jì)過(guò)程中,中斷處理過(guò)程不能夠直接把外部中斷事 件傳遞至應(yīng)用層的問(wèn)題,從而提供利用異步通知實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng) 的方法。利用異步通知實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法,在LXI載板的ARM 處理器的驅(qū)動(dòng)層中的中斷服務(wù)程序中建立中斷處理函數(shù),并在所述中斷處理函數(shù)中設(shè)置一 個(gè)信號(hào)產(chǎn)生函數(shù),當(dāng)M模塊的中斷信號(hào)到達(dá)ARM處理器的驅(qū)動(dòng)層后,驅(qū)動(dòng)程序?qū)⑺鲇布?斷信號(hào)輸出至驅(qū)動(dòng)層中的中斷服務(wù)程序中;同時(shí),驅(qū)動(dòng)程序控制中斷處理函數(shù)中信號(hào)產(chǎn)生 函數(shù)向應(yīng)用程序發(fā)送一個(gè)異步信號(hào),應(yīng)用程序接收所述異步信號(hào)后,將所述異步信號(hào)發(fā)送 到應(yīng)用層的中斷處理函數(shù)中執(zhí)行,實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)。ARM處理器是型號(hào)為S3C4510B的芯片。有益效果本發(fā)明在LXI載板設(shè)計(jì)過(guò)程中,中斷處理過(guò)程能夠直接把外部中斷事 件傳遞至應(yīng)用層,實(shí)現(xiàn)了 LXI載板對(duì)M模塊中斷響應(yīng)。并且本發(fā)明實(shí)現(xiàn)方法簡(jiǎn)單,效率較高。
具體實(shí)施例方式具體實(shí)施方式
一、利用異步通知實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法, 在LXI載板的ARM處理器的驅(qū)動(dòng)層中的中斷服務(wù)程序中建立中斷處理函數(shù),并在所述中斷 處理函數(shù)中設(shè)置一個(gè)信號(hào)產(chǎn)生函數(shù),當(dāng)M模塊的中斷信號(hào)到達(dá)ARM處理器的驅(qū)動(dòng)層后,驅(qū)動(dòng) 程序?qū)⑺鲇布袛嘈盘?hào)輸出至驅(qū)動(dòng)層中的中斷服務(wù)程序中;同時(shí),驅(qū)動(dòng)程序控制中斷處 理函數(shù)中信號(hào)產(chǎn)生函數(shù)向應(yīng)用程序發(fā)送一個(gè)異步信號(hào),應(yīng)用程序接收所述異步信號(hào)后,將 所述異步信號(hào)發(fā)送到應(yīng)用層的中斷處理函數(shù)中執(zhí)行,實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷 響應(yīng)。
本發(fā)明的ARM處理器使用的是三星公司的型號(hào)為S3C4510B的芯片,其M模塊的中 斷線直接與S3C4510B的外部中斷0相連。S3C4510B對(duì)中斷的支持S3C4510B支持多達(dá)21個(gè)中斷源,中斷請(qǐng)求可由內(nèi)部功能模塊和外部引腳信號(hào) 產(chǎn)生,本發(fā)明使用的是外部中斷0。ARM7TDMI核可以識(shí)別兩種類型的中斷正常中斷請(qǐng)求 (Normal Interrupt Request, IRQ)禾口快速中斷請(qǐng)求(Fast Interrupt Request, FIQ),因 此,S3C4510B的所有中斷都可以歸類為IRQ或FIQ,本發(fā)明中M模塊的中斷使用的是IRQ。 S3C4510B的中斷控制器對(duì)每一個(gè)中斷源都有一個(gè)中斷懸掛位(Interrupt Pending Bit)。S3C4510B用如下四個(gè)寄存器控制中斷的產(chǎn)生和對(duì)中斷進(jìn)行處理中斷優(yōu)先級(jí)寄存器(Interrupt Priority Register)每一個(gè)中斷源的索引號(hào)寫(xiě) 入一個(gè)預(yù)定義的中斷優(yōu)先級(jí)寄存器,以獲得特定的優(yōu)先級(jí)。中斷優(yōu)先級(jí)預(yù)定義為從0 20 ;中斷模式寄存器(Interrupt Mode Register)為每一個(gè)中斷源定義中斷模式,是 IRQ 還是 FIQ。中斷懸掛寄存器(InterruptPending Register)指示中斷請(qǐng)求處于懸掛狀態(tài) (未處理)。如果中斷懸掛位被置位,則中斷懸掛狀態(tài)會(huì)一直保存,直到CPU通過(guò)寫(xiě)‘1’到 中斷懸掛寄存器的相應(yīng)位清除(注意是寫(xiě)‘1’清除,而不是寫(xiě)‘0’)。當(dāng)中斷懸掛位被置位 時(shí),只要中斷屏蔽寄存器為‘0’,中斷服務(wù)程序都開(kāi)始執(zhí)行。在中斷服務(wù)程序中,必須通過(guò)向 中斷懸掛寄存器的相應(yīng)位寫(xiě)‘1’來(lái)清除中斷懸掛標(biāo)志,以避免由于同一個(gè)中斷懸掛位導(dǎo)致 中斷服務(wù)程序的反復(fù)執(zhí)行。中斷屏蔽寄存器(Interrupt Mask Register)如果中斷屏蔽位為‘1,則對(duì)應(yīng)的 中斷會(huì)被禁止,如果中斷屏蔽位為‘0’,則對(duì)應(yīng)的中斷請(qǐng)求能正常響應(yīng)。但如果全局中斷屏 蔽位(位21)為‘1’,則所有的中斷都會(huì)被禁止。當(dāng)有中斷請(qǐng)求產(chǎn)生時(shí),對(duì)應(yīng)的中斷懸掛位 會(huì)被置為‘1’,在全局中斷屏蔽位和對(duì)應(yīng)的中斷屏蔽位為‘0’時(shí),中斷請(qǐng)求就會(huì)被響應(yīng)。uClinux字符型驅(qū)動(dòng)程序中的中斷處理與Linux設(shè)備驅(qū)動(dòng)中中斷處理相關(guān)的首先是申請(qǐng)與釋放IRQ(中斷請(qǐng)求)的 APIrequest_irq ()禾口 free_irq();request_irq()是Linux內(nèi)核中提供的中斷注冊(cè)函數(shù)接口,作用是申請(qǐng)使用IRQ并 注冊(cè)中斷處理程序;reqUest_irq()是Linux內(nèi)核中提供的中斷釋放函數(shù)接口,用于Linux 操作系統(tǒng)下對(duì)中斷資源的釋放;所述uClinux字符型驅(qū)動(dòng)程序是Iinux操作系統(tǒng)中三種基本驅(qū)動(dòng)類型中的一種。request_irq()的原型為int request_irq(unsigned int irq, void(氺handler) (int irq, void氺dev_id, struct pt_regs氺regs), unsigned long irqflags, const char氺devname, void氺dev_id);irq是要申請(qǐng)的硬件中斷號(hào);handler是向系統(tǒng)登記的中斷處理函數(shù),是一個(gè)回調(diào) 函數(shù),中斷發(fā)生時(shí),系統(tǒng)調(diào)用這個(gè)函數(shù),dev_id參數(shù)將被傳遞;irqflags是中斷處理的屬 性,若設(shè)置SA_INTERRUPT,標(biāo)明中斷處理程序是快速處理程序,快速處理程序被調(diào)用時(shí)屏蔽 所有中斷,慢速處理程序不屏蔽;若設(shè)置SA_SHIRQ,則多個(gè)設(shè)備共享中斷,dev_id(當(dāng)前注 冊(cè)的中斷設(shè)備的標(biāo)識(shí)符)在中斷共享時(shí)會(huì)用到,一般設(shè)置為這個(gè)設(shè)備的device結(jié)構(gòu)體本身 或者NULL ;device結(jié)構(gòu)體為描述本設(shè)備而定義的結(jié)構(gòu)體。
free_irq()的原型為void free_irq(unsigned int irq, void氺dev_id);uClinux環(huán)境下中斷向應(yīng)用程序的傳遞—旦實(shí)現(xiàn)了驅(qū)動(dòng)層中的上述中斷處理函數(shù),在硬件中斷信號(hào)到來(lái)后,驅(qū)動(dòng)程序就 可以中轉(zhuǎn)到驅(qū)動(dòng)層中的中斷服務(wù)程序中了 ISA(中斷服務(wù)程序),但本發(fā)明還需要將此中斷 事件通知到用戶程序,并且讓用戶程序跳轉(zhuǎn)至在apisjnstall ()函數(shù)中注冊(cè)的應(yīng)用層中 斷處理函數(shù)中;apisjnstallO為自定義實(shí)現(xiàn)函數(shù),作用傳遞用戶中斷服務(wù)程序的函數(shù)指 針,從而在中斷到達(dá)時(shí)跳轉(zhuǎn)到用戶中斷服務(wù)程序。uClinux操作系統(tǒng)為了防止對(duì)資源的未經(jīng)授權(quán)的訪問(wèn),將整個(gè)系統(tǒng)嚴(yán)格地分為兩 個(gè)空間用戶空間和內(nèi)核空間。應(yīng)用程序運(yùn)行在用戶空間中,內(nèi)核程序運(yùn)行在內(nèi)核空間中, 兩者是不能直接通信的,一般情況下,通過(guò)系統(tǒng)調(diào)用可以實(shí)現(xiàn)二者的通信,但這是一種同步 的通信方法,運(yùn)用到中斷處理上也就是應(yīng)用程序需要不斷地通過(guò)某些系統(tǒng)調(diào)用函數(shù),查詢 驅(qū)動(dòng)中某位標(biāo)志位的狀態(tài),從而判斷中斷事件的到達(dá),顯然,這種方式已經(jīng)失去了中斷的意 義,是不可取的。本發(fā)明中使用了信號(hào)驅(qū)動(dòng)(SIGIO)的異步I/O的方法實(shí)現(xiàn)了中斷事件由驅(qū)動(dòng)層到 應(yīng)用層的異步傳遞。信號(hào)驅(qū)動(dòng)(SIGIO)的異步I/O 信號(hào)驅(qū)動(dòng)(SIGIO)的異步I/O實(shí)際是巧妙利用了操作系統(tǒng)中的信號(hào)機(jī)制,實(shí)現(xiàn)了 信號(hào)向指定進(jìn)程傳遞。其基本原理是在驅(qū)動(dòng)層的中斷處理函數(shù)中設(shè)置一個(gè)信號(hào)產(chǎn)生函數(shù), 一旦中斷到達(dá),驅(qū)動(dòng)程序跳轉(zhuǎn)到驅(qū)動(dòng)程序中的中斷處理函數(shù)的同時(shí),就會(huì)執(zhí)行此函數(shù),并向 指定進(jìn)程發(fā)送一個(gè)異步信號(hào),應(yīng)用程序接收到此異步信號(hào)后,就跳轉(zhuǎn)到應(yīng)用層的中斷處理 函數(shù)中執(zhí)行,這樣,就實(shí)現(xiàn)了一種“軟中斷”的操作。實(shí)現(xiàn)這種異步通知的過(guò)程只需要調(diào)用相應(yīng)的庫(kù)函數(shù)或者系統(tǒng)調(diào)用函數(shù)即可。本發(fā) 明中信號(hào)驅(qū)動(dòng)的異步I/O實(shí)現(xiàn)基本uClinux操作系統(tǒng),實(shí)現(xiàn)過(guò)程如下驅(qū)動(dòng)層在設(shè)備抽象的數(shù)據(jù)結(jié)構(gòu)中增加一個(gè)struct fasync_struct的指針static struct fasync_struct*mmodule_async_queue ;實(shí)現(xiàn)設(shè)備操作中的fasync函數(shù),該函數(shù)將本進(jìn)程登記到aSynC_queue (異步事件 通知隊(duì)列)上去,這個(gè)函數(shù)很簡(jiǎn)單,其主體就是調(diào)用內(nèi)核的fasyncjielper函數(shù)static int mmodule_fasync(int fd, struct file氺filp, int on) {return fasync_helper (fd, filp, on, &mmodule_async_queue);}在驅(qū)動(dòng)程序的中斷服務(wù)程序中調(diào)用內(nèi)核的kill_fasynC函數(shù),kill_fasynC函數(shù) 的作用是向指定的進(jìn)程發(fā)送指定的信號(hào)void mmodule_handle(int irq, void氺dev_id, struct pt_regs氺regs){CLEAR_PEND_INT(EXTINT_IRQ);if(mmodule_async_queue)kill_fasync(&mmodule_async_queue, SIGI0, P0LL_IN);}
在驅(qū)動(dòng)的寫(xiě)成releaseO函數(shù)中調(diào)用前面定義的fasync函數(shù),以釋放掉所占資 源。其中fasyncjielper和kill_faSynC都是內(nèi)核函數(shù),只需要調(diào)用就可以了。第一 步中定義的指針是一個(gè)重要參數(shù),fasyncjielper和kill_faSynC會(huì)使用這個(gè)參數(shù)。應(yīng)用層利用signal設(shè)置SIGIO信號(hào)的處理函數(shù)(本發(fā)明此函數(shù)為userjsa,實(shí)際上此處 傳遞的是一個(gè)函數(shù)指針),signal,用來(lái)通知進(jìn)程發(fā)生了異步事件。進(jìn)程之間可以互相通過(guò) 系統(tǒng)調(diào)用ki 11發(fā)送軟中斷信號(hào)。內(nèi)核也可以因?yàn)閮?nèi)部事件而給進(jìn)程發(fā)送信號(hào),通知進(jìn)程發(fā) 生了某個(gè)事件signal (SIGIO, user_isa);fcntl (fcntl ()用來(lái)操作文件描述詞的一些特性)的F_SET0WN指令(設(shè)置當(dāng)前 進(jìn)程為設(shè)備文件owner)設(shè)置當(dāng)前進(jìn)程為設(shè)備文件owner,同時(shí)將應(yīng)用程序的進(jìn)程索引號(hào) (PID)傳遞下去fcntl (fd, F_SET0WN, getpid ());oflags = fcntl(fd, F_GETFL);fcntl 的 F_SETFL 指令設(shè)置 FASYNC 標(biāo)志fcntl(fd, F_SETFL,oflags|FASYNC);完成了以上步驟,當(dāng)內(nèi)核執(zhí)行到kill_faSynC()函數(shù),用戶空間SIGIO信號(hào)的處理 函數(shù)就會(huì)被調(diào)用了,調(diào)用了此函數(shù)以后,應(yīng)用程序就可以直接跳轉(zhuǎn)到signalO函數(shù)中注冊(cè) 的中斷服務(wù)程序中執(zhí)行了。這樣即而實(shí)現(xiàn)了中斷由內(nèi)核層向用戶層的傳遞。從應(yīng)用層來(lái)看, 其效果是一旦硬件中斷到來(lái),應(yīng)用程序立即中轉(zhuǎn)到應(yīng)用程序中的中斷服務(wù)子函數(shù)執(zhí)行。本發(fā)明利用信號(hào)驅(qū)動(dòng)的異步IO實(shí)現(xiàn)了 M模塊的硬件中斷事件到運(yùn)行于Linux操 作系統(tǒng)中應(yīng)用層的傳遞,本發(fā)明實(shí)現(xiàn)方法簡(jiǎn)單,效率較高,在進(jìn)行基于M模塊的LXI載板的 軟件設(shè)計(jì)中,是一種切實(shí)可行的方法。
權(quán)利要求
1.利用異步通知實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法,其特征是在LXI載板的ARM處理器的驅(qū)動(dòng)層中的中斷服務(wù)程序中建立中斷處理函數(shù),并在所 述中斷處理函數(shù)中設(shè)置一個(gè)信號(hào)產(chǎn)生函數(shù),當(dāng)M模塊的中斷信號(hào)到達(dá)ARM處理器的驅(qū)動(dòng)層 后,驅(qū)動(dòng)程序?qū)⑺鲇布袛嘈盘?hào)輸出至驅(qū)動(dòng)層中的中斷服務(wù)程序中;同時(shí),驅(qū)動(dòng)程序控制 中斷處理函數(shù)中信號(hào)產(chǎn)生函數(shù)向應(yīng)用程序發(fā)送一個(gè)異步信號(hào),應(yīng)用程序接收所述異步信號(hào) 后,將所述異步信號(hào)發(fā)送到應(yīng)用層的中斷處理函數(shù)中執(zhí)行,實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊 中斷響應(yīng)。
2.根據(jù)權(quán)利要求1所述的利用異步通知實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方 法,其特征在于ARM處理器是型號(hào)為S3C4510B的芯片。
全文摘要
利用異步通知實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法,涉及實(shí)現(xiàn)LXI載板應(yīng)用程序?qū)模塊中斷響應(yīng)的方法,解決LXI載板設(shè)計(jì)過(guò)程中,中斷處理過(guò)程不能夠直接把外部中斷事件傳遞至應(yīng)用層的問(wèn)題。其方法在LXI載板的ARM處理器的驅(qū)動(dòng)層中的中斷服務(wù)程序中建立中斷處理函數(shù),并在所述中斷處理函數(shù)中設(shè)置一個(gè)信號(hào)產(chǎn)生函數(shù),當(dāng)M模塊的中斷信號(hào)到達(dá)ARM處理器的驅(qū)動(dòng)層后,驅(qū)動(dòng)程序?qū)⑺鲇布袛嘈盘?hào)輸出至驅(qū)動(dòng)層中的中斷服務(wù)程序中;同時(shí),驅(qū)動(dòng)程序控制中斷處理函數(shù)中信號(hào)產(chǎn)生函數(shù)向應(yīng)用程序發(fā)送一個(gè)異步信號(hào),應(yīng)用程序接收所述異步信號(hào)后,將所述異步信號(hào)發(fā)送到應(yīng)用層的中斷處理函數(shù)中執(zhí)行。本發(fā)明適用于基于M模塊的LXI載板的設(shè)計(jì)。
文檔編號(hào)G06F9/48GK102117223SQ20111004361
公開(kāi)日2011年7月6日 申請(qǐng)日期2011年2月22日 優(yōu)先權(quán)日2011年2月22日
發(fā)明者喬立巖, 于濤, 劉兆慶, 張毅剛, 彭喜元, 黃敏 申請(qǐng)人:哈爾濱工業(yè)大學(xué)