(1.西安精密機(jī)械研究所,西安 710075; 2.陜西海泰電子有限責(zé)任公司,西安 710075)
隨著嵌入式技術(shù)快速發(fā)展,功能更加齊全,性能更加強(qiáng)大的臺(tái)式儀器已經(jīng)面世,例如LXI儀器,其數(shù)據(jù)傳輸吞吐率,基于時(shí)間觸發(fā),組建遠(yuǎn)程分布式測(cè)控系統(tǒng)都具有明顯優(yōu)勢(shì),但GPIB經(jīng)歷了幾十年的發(fā)展,總線協(xié)議已經(jīng)相當(dāng)成熟,仍然受到傳統(tǒng)用戶的青睞,因此眾多國(guó)內(nèi)外測(cè)試測(cè)量研發(fā)商開發(fā)高端的臺(tái)式儀器時(shí),都會(huì)保留傳統(tǒng)的GPIB接口。由于LINUX操作系統(tǒng)內(nèi)核是開源的,使用者可以根據(jù)自身的需求,對(duì)其進(jìn)行裁減配置,形成高效的嵌入式操作系統(tǒng),使得LINUX成為當(dāng)前最流行的嵌入式操作系統(tǒng)之一,但不足之處是,它不像WINDOWS,有微軟專門的研發(fā)團(tuán)隊(duì)對(duì)其進(jìn)行不斷優(yōu)化和升級(jí),LINUX并非以商業(yè)盈利為目的,沒(méi)有專門組織對(duì)其進(jìn)行官方維護(hù),從而LINUX內(nèi)核在集成各個(gè)芯片廠商的驅(qū)動(dòng)時(shí),不少驅(qū)動(dòng)在一些應(yīng)用情況下,傳輸性能還不夠理想,尤其像GPIB這種只是測(cè)試測(cè)量領(lǐng)域里的專用總線,相比應(yīng)用廣泛的USB、LAN,更具典型性。
為了提升LINUX系統(tǒng)下GPIB傳輸性能,文章對(duì)其驅(qū)動(dòng)進(jìn)行了優(yōu)化。將GPIB中斷服務(wù)程序分割成頂半部和底半部,在底半部里開辟了配置成非原子操作的工作隊(duì)列,同時(shí)采用睡眠機(jī)制,高效的實(shí)現(xiàn)了驅(qū)動(dòng)運(yùn)行效率;在數(shù)據(jù)接收流程里,采用FIFO半滿位判斷標(biāo)準(zhǔn),使得從FIFO中收數(shù)據(jù)到內(nèi)核緩沖區(qū)和向FIFO里傳數(shù)據(jù)可以并發(fā)進(jìn)行,從而提升了數(shù)據(jù)傳輸速率;設(shè)備文件操作中的讀寫函數(shù)可能會(huì)同時(shí)操作臨界資源,應(yīng)用信號(hào)量避免了競(jìng)態(tài)的發(fā)生,增強(qiáng)了驅(qū)動(dòng)可靠性。
LINUX字符設(shè)備驅(qū)動(dòng)程序[5]一般包括3部分:初始化、中斷服務(wù)、設(shè)備文件操作。在驅(qū)動(dòng)程序初始化時(shí),要向系統(tǒng)注冊(cè)此驅(qū)動(dòng)程序,系統(tǒng)后續(xù)才能調(diào)用驅(qū)動(dòng)里各設(shè)備文件操作接口。在Linux系統(tǒng)里,是通過(guò)調(diào)用register_chrdev向系統(tǒng)注冊(cè)設(shè)備驅(qū)動(dòng)程序,初始化部分除了注冊(cè)設(shè)備驅(qū)動(dòng)程序,一般還需要給驅(qū)動(dòng)程序申請(qǐng)系統(tǒng)資源,包括內(nèi)存、時(shí)鐘、I/O端口等,芯片的初始化也在這里進(jìn)行,另外還要設(shè)置清除,它是讓在初始化里注冊(cè)的資源,全部從內(nèi)核里注銷掉。對(duì)于設(shè)備經(jīng)常會(huì)提出請(qǐng)求給CPU,來(lái)執(zhí)行設(shè)備需要完成的操作,這就需要有中斷服務(wù),驅(qū)動(dòng)程序通過(guò)調(diào)用request_irq函數(shù)來(lái)申請(qǐng)中斷,其原型:int request_irq(unsigned int irq,void(*handler)(int irq,void dev_id,struct pt_regs*regs),unsigned long flags,const char*device,void*dev_id);參數(shù)irq表示所要申請(qǐng)的硬件中斷號(hào),handler為向系統(tǒng)申請(qǐng)的中斷服務(wù)程序,中斷產(chǎn)生時(shí)由系統(tǒng)來(lái)調(diào)用,調(diào)用時(shí)所帶參數(shù)irq為中斷號(hào),dev_id為申請(qǐng)時(shí)告訴系統(tǒng)的設(shè)備標(biāo)識(shí),regs為中斷響應(yīng)時(shí)信息寄存器地址;flag是申請(qǐng)時(shí)的選項(xiàng),它決定中斷處理程序的一些特性,其中最重要的是影響處理速率和資源開銷的中斷響應(yīng)方式;device為設(shè)備名,在/proc/interrupts文件里被記錄,中斷服務(wù)具體的內(nèi)容由設(shè)備需要完成的操作來(lái)決定。設(shè)備文件操作是指file_operations結(jié)構(gòu)中的成員,它們?nèi)渴呛瘮?shù)指針,每個(gè)函數(shù)都完成一種設(shè)備操作,如讀寫操作,選擇操作,控制操作等。
字符設(shè)備驅(qū)動(dòng)程序的開發(fā)流程是:
1)查看原理圖及芯片資料理解設(shè)備的工作原理;
2)定義主設(shè)備號(hào)、注冊(cè)資源、注銷設(shè)備號(hào)及資源;
3)設(shè)計(jì)芯片初始化流程;
4)設(shè)計(jì)中斷服務(wù);
5)定義file_operations結(jié)構(gòu),設(shè)計(jì)所要實(shí)現(xiàn)的文件操作;
6)編寫用戶態(tài)測(cè)試程序,調(diào)試設(shè)備驅(qū)動(dòng)。
調(diào)試時(shí)是通過(guò)insmod和rmmod命令實(shí)現(xiàn)驅(qū)動(dòng)的加載和卸載,加載與卸載的原理如圖1所示。
圖1 加載與卸載的原理
TNT4882是美國(guó)NI公司的一款高速且聽講功能兼?zhèn)涞腉PIB(General purpose interface bus)接口專用芯片。它內(nèi)部集成了Turbo488(高速傳輸電路)及NAT4882(IEEE488.2兼容電路),能夠兼容ANSI IEEE Standard 488.1和ANSI IEEEStandard 488.2規(guī)范,其內(nèi)置還具有16個(gè)增強(qiáng)型IEEE488兼容收發(fā)器[6]。
TNT4882 內(nèi)部寄存器[7]共32個(gè),每個(gè)寄存器的控制字都是8位,地址通常是TNT4882的基地址加上各個(gè)寄存器所對(duì)應(yīng)的偏移量而確定的。在GPIB驅(qū)動(dòng)設(shè)計(jì)中,只有對(duì)寄存器進(jìn)行正確設(shè)置,才能實(shí)現(xiàn)對(duì)GPIB的各種操作。工作模式可分為單芯片模式和Turbo + 9914模式,工作模式的選擇和轉(zhuǎn)換,由寄存器的設(shè)置來(lái)決定。Turbo+9914相當(dāng)于TMS9914A芯片的工作模式,目地是為了兼容此款芯片,但此時(shí)功能更加強(qiáng)大,單芯片工作模式是NI公司推薦的TNT4882工作模式,工作時(shí)的內(nèi)部結(jié)構(gòu)如圖2所示。由于單芯片模式采用的是最簡(jiǎn)單又是最快速的結(jié)構(gòu),并且是推薦的TNT4882工作模式,因此,本驅(qū)動(dòng)是在這種模式下進(jìn)行設(shè)計(jì)。
圖2 單芯片工作模式
在初使化函數(shù)里除了注冊(cè)設(shè)備號(hào)以外,還要有以下方面要實(shí)現(xiàn):寄存器硬地址映射到內(nèi)存的虛擬地址;分別初始化讀寫互斥的信號(hào)量、中斷服務(wù)程序底半部的工作隊(duì)列、阻塞的等待隊(duì)列;初始化芯片。
由于內(nèi)核無(wú)法訪問(wèn)TNT4882寄存器硬地址,所以要通過(guò)映射到內(nèi)存的虛擬地址,來(lái)訪問(wèn)TNT4882寄存器,映射的實(shí)現(xiàn)是通過(guò)調(diào)用內(nèi)核函數(shù)ioremap()來(lái)實(shí)現(xiàn),此函數(shù)第一個(gè)參數(shù)設(shè)置為TNT4882芯片的首地址,TNT4882芯片的首地址是由硬件使用的片選信號(hào)線決定,函數(shù)的返回值便是首地址在內(nèi)存的映射地址,由于芯片手冊(cè)給出了每個(gè)寄存器的偏移量,這樣TNT4882的首地址在內(nèi)存的映射地址加上偏移量就是每個(gè)寄存器在內(nèi)存的地址。
信號(hào)量的本質(zhì)是一個(gè)整數(shù)值,它和一對(duì)函數(shù)聯(lián)合使用,這一對(duì)函數(shù)通常稱為P和V,P函數(shù)使信號(hào)量的值增加,V函數(shù)使信號(hào)量的值減少。如果信號(hào)量的值大于零,則進(jìn)程可以操作臨界區(qū)的資源,反之,如果值小于零,則進(jìn)程不能操作臨界區(qū)的資源[8]。由于讀寫函數(shù)可能會(huì)操作同一資源,這種情況會(huì)產(chǎn)生競(jìng)態(tài),嚴(yán)重時(shí)會(huì)導(dǎo)致系統(tǒng)內(nèi)核的崩潰,所以需要通過(guò)信號(hào)量互斥,使用信號(hào)量之前要對(duì)其進(jìn)行初使化,一般放在驅(qū)動(dòng)初使化函數(shù)里,調(diào)用的內(nèi)核函數(shù)為init_MUTEX();由于中斷處理是獨(dú)占CPU的,這樣如果整個(gè)任務(wù)需要?jiǎng)e的進(jìn)程在中斷后很短時(shí)間立刻執(zhí)行,那么中斷處理就不能耗時(shí)過(guò)長(zhǎng),所以經(jīng)常把中斷處理分為頂半部和底半部,頂半部只用來(lái)響應(yīng)中斷而底半部通過(guò)開辟個(gè)內(nèi)核進(jìn)程進(jìn)行真正的處理,而內(nèi)核進(jìn)程是不獨(dú)占CPU的,這樣別的進(jìn)程也可同時(shí)執(zhí)行,在底半部開辟進(jìn)程常用的機(jī)制就是工作隊(duì)列,而且工作隊(duì)列還允許睡眠機(jī)制,使用工作隊(duì)列時(shí)同樣也需進(jìn)行初使化,它通過(guò)調(diào)用INIT_WORK ()完成;阻塞是實(shí)現(xiàn)進(jìn)程睡眠的機(jī)制,進(jìn)程在運(yùn)行時(shí)如果需要等待一個(gè)事件來(lái)到才能繼續(xù)運(yùn)行,這時(shí)就需要用阻塞來(lái)使進(jìn)程睡眠,由于應(yīng)用層的進(jìn)程需要等待數(shù)據(jù)來(lái)到才能繼續(xù)處理,所以在內(nèi)核的讀函數(shù)里需要添加阻塞,內(nèi)核給驅(qū)動(dòng)提供的最簡(jiǎn)便的阻塞,就是等待隊(duì)列機(jī)制,使用前一樣要進(jìn)行初使化,調(diào)用的函數(shù)是init_waitqueue_head()。
TNT4882芯片在上電運(yùn)行前,要進(jìn)行初使化,初使化的流程為:復(fù)位TNT4882芯片中的Turbo電路;將 TNT4882設(shè)置成Turbo+7210式;將TNT4882設(shè)置成單芯片模式;使Local_ PowerOn信號(hào)有效;設(shè)置TNT4882的GPIB主地址,屏蔽副地址以及設(shè)置GPIB握手參數(shù);清除Local_ PowerOn信號(hào)后,開始GPIB操作。此過(guò)程全部是給寄存器賦值,這可通過(guò)內(nèi)核iowrite8()函數(shù)進(jìn)行。
中斷函數(shù)的流程如圖3所示,ATN(Attention)代表注意命令,REN(Remote Enable)代表遠(yuǎn)控使能狀態(tài),LACS(Listener Active State)代表聽者作用狀態(tài),TACS(Talker Active State)代表講者作用狀態(tài)。GPIB主設(shè)備發(fā)來(lái)ATN命令,TNT4882產(chǎn)生中斷,如果GPIB接口處是遠(yuǎn)控使能和聽者作用狀態(tài),那么GPIB接口就準(zhǔn)備接收數(shù)據(jù),如果GPIB接口處是遠(yuǎn)控使能和講者作用狀態(tài),那么GPIB接口就可以發(fā)送數(shù)據(jù)。具體實(shí)現(xiàn)的方法是:利用linux字符設(shè)備驅(qū)動(dòng)中斷注冊(cè)接口request_irq,將中斷響應(yīng)注冊(cè)到內(nèi)核里,中斷號(hào)設(shè)置成硬件設(shè)計(jì)時(shí)占用中斷向量表中的中斷號(hào),從參數(shù)*device得到的GPIB設(shè)備名,寫入/proc/interrupts文件里,同時(shí)將中斷響應(yīng)屬性flags配置成中斷底半部獨(dú)立運(yùn)行,用iowrite8()將TNT4882中斷使能寄存器中有關(guān)的ATN、REN、TAC、SLACS全部使能,在中斷服務(wù)程序中,用ioread8()讀TNT4882中斷響應(yīng)信息寄存器的信息,出現(xiàn)與LACS相同的信息,調(diào)用收操作,出現(xiàn)與TACS一致的信息,調(diào)用發(fā)操作。
對(duì)于TNT4882芯片,收發(fā)操作首先要對(duì)收發(fā)數(shù)據(jù)狀態(tài)初始化,然后循環(huán)收發(fā)數(shù)據(jù),最后退出收發(fā)數(shù)據(jù)狀態(tài)。對(duì)于具體流程,發(fā)送數(shù)據(jù)流程,如圖4所示。由于GPIB是通過(guò)接口之間的握手協(xié)議來(lái)進(jìn)行通信,所以接收和發(fā)送流程的初始化和退出要完全按照協(xié)議規(guī)定來(lái)設(shè)計(jì),他們是一致的,這樣在接收數(shù)據(jù)的具體流程中,只詳細(xì)分析了數(shù)據(jù)接收過(guò)程,如圖5所示。TNT4882的FIFO是一個(gè)16字節(jié)深的緩沖區(qū),TNT4882不僅提供了它的全滿標(biāo)志位而且還提供了半滿標(biāo)志位,此流程中沒(méi)有使用傳統(tǒng)的全滿位作為接收數(shù)據(jù)的判斷位,而是采用了FIFO半滿位進(jìn)行判斷,這樣從FIFO中收數(shù)據(jù)到內(nèi)核緩沖區(qū)和向FIFO里傳數(shù)據(jù)可以同時(shí)并發(fā)進(jìn)行,而如果用全滿位進(jìn)行判斷,只有先收數(shù)據(jù)后,有了空間才能向FIFO里傳數(shù)據(jù),所以采用半滿位可以提高數(shù)據(jù)接收速率。
圖3 中斷函數(shù)的流程
圖4 數(shù)據(jù)發(fā)送流程 圖5 數(shù)據(jù)接收流程
在中斷函數(shù)里,數(shù)據(jù)收發(fā)操作是通過(guò)調(diào)用自定義的兩個(gè)函數(shù):short Receive(void),short Send(void)來(lái)實(shí)現(xiàn)的。對(duì)于收是直接調(diào)用收函數(shù),而對(duì)于發(fā)則是間接調(diào)用,通過(guò)調(diào)用工作隊(duì)列來(lái)調(diào)用發(fā)函數(shù),如果直接調(diào)用數(shù)據(jù)發(fā)送函數(shù),那么根據(jù)中斷服務(wù)程序運(yùn)行是獨(dú)占CPU的原理,導(dǎo)致用戶態(tài)的應(yīng)用程序只能等中斷服務(wù)程序結(jié)束才能執(zhí)行,這樣數(shù)據(jù)還沒(méi)有過(guò)來(lái),就先執(zhí)行數(shù)據(jù)發(fā)送,反復(fù)輪詢,這顯然是低效的,而調(diào)用工作隊(duì)列,等于內(nèi)核開辟了一個(gè)進(jìn)程,便釋放了CPU,并配置成非原子操作模式[9],這樣內(nèi)核態(tài)的工作隊(duì)列和用戶態(tài)的進(jìn)程可同時(shí)運(yùn)行,當(dāng)在工作隊(duì)列開始處再加上睡眠,數(shù)據(jù)到達(dá)內(nèi)核后,喚醒工作隊(duì)列,此時(shí)再調(diào)用發(fā)函數(shù),數(shù)據(jù)進(jìn)行發(fā)送,此時(shí)運(yùn)行效率明顯提升。
數(shù)據(jù)收發(fā)操作具體實(shí)現(xiàn)的方法是:在數(shù)據(jù)發(fā)操作方面,用creat_workque創(chuàng)建工作隊(duì)列,將該創(chuàng)建的工作隊(duì)列賦給queue_work函數(shù)第一個(gè)參數(shù),將Send(void)函數(shù)指針賦給queue_work函數(shù)第二個(gè)參數(shù),從而將Send(void)函數(shù)插入工作隊(duì)列,并將workqueue_struct 類型的結(jié)構(gòu)體變量中的屬性成員配置成非原子操作,中斷服務(wù)程序運(yùn)行到queue_work接口處,內(nèi)核將自動(dòng)開辟進(jìn)程執(zhí)行Send(void),在開辟進(jìn)程開始處,調(diào)入wait_event_interruptible()使Send(void)睡眠,在文件操作寫函數(shù)結(jié)束處,調(diào)入wake_up_interruptible()來(lái)喚醒該睡眠;對(duì)于Send(void)本身,用memset函數(shù)將TNT4882的FIFO清空,并用iowrite8()在傳輸寄存器里配置傳輸參數(shù)和傳輸字節(jié)數(shù),配置完成后,再用ioread8()讀取傳輸就緒位,等待傳輸就緒,最后使能傳輸位,完成初始化;設(shè)置傳輸字符計(jì)數(shù)變量,讀取FIFO狀態(tài)寄存器,判斷是否FIFO為滿,不為滿時(shí)往里面循環(huán)寫數(shù)據(jù),直到計(jì)數(shù)變量到達(dá)此次發(fā)送字符數(shù),退出發(fā)送操作,注意發(fā)操作結(jié)束后,要利用的destroy_workque注銷工作隊(duì)列。在數(shù)據(jù)收操作方面,初始化與發(fā)操作一致,不做贅述,用ioread8()讀取中斷使能寄存器的聽狀態(tài)位,如果是聽狀態(tài),并且FIFO至少半滿,設(shè)置接收計(jì)數(shù)變量,開始從FIFO中用循環(huán)取數(shù)據(jù),直至取FIFO半滿的數(shù)據(jù),然后再判斷中斷使能寄存器的聽狀態(tài)位,如果仍是聽狀態(tài),重復(fù)以上操作,如果聽狀態(tài)結(jié)束,F(xiàn)IFO中仍有數(shù)據(jù),用ioread8()將數(shù)據(jù)取回,退出收操作。
GPIB驅(qū)動(dòng)里的讀寫函數(shù)即read和write分別實(shí)現(xiàn)用戶態(tài)從內(nèi)核收數(shù)據(jù)和用戶態(tài)向內(nèi)核發(fā)數(shù)據(jù),實(shí)際上就是在read和write里分別調(diào)用內(nèi)核的copy_to_user和copy_from_user來(lái)實(shí)現(xiàn)的。根據(jù)在初使化里的分析,讀寫要進(jìn)行互斥,采用的方式是信號(hào)量。 具體實(shí)現(xiàn)的思路是:設(shè)信號(hào)量為驅(qū)動(dòng)全局變量并調(diào)用內(nèi)核函數(shù)DECLARE MUTEX()使其初始值為1,在讀寫函數(shù)里的開始處調(diào)用down()使信號(hào)量減1,結(jié)束處調(diào)用up()使信號(hào)量加1。這樣如果寫進(jìn)程操作了臨界資源,信號(hào)量的值變?yōu)榱?,讀進(jìn)程則無(wú)法操作臨界資源,當(dāng)寫進(jìn)程結(jié)束后,信號(hào)量的值恢復(fù)為1,此時(shí)讀進(jìn)程可以操作臨界資源,信號(hào)量的值又變?yōu)榱?,寫進(jìn)程則無(wú)法操作臨界資源,當(dāng)讀進(jìn)程結(jié)束后,信號(hào)量的值又恢復(fù)為1,此時(shí)寫進(jìn)程又可再次操作臨界資源,這樣就實(shí)現(xiàn)了讀寫互斥,消除了競(jìng)態(tài)。
除此之外,由于內(nèi)核的讀函數(shù)是給應(yīng)用程序調(diào)用的函數(shù)接口,為了實(shí)現(xiàn)應(yīng)用程序在數(shù)據(jù)沒(méi)有到來(lái)的時(shí)候能夠被掛起,內(nèi)核的讀函數(shù)還要實(shí)現(xiàn)阻塞,具體實(shí)現(xiàn)的思路是:在讀函數(shù)里的開始處可以通過(guò)調(diào)用wait_event_interruptible()來(lái)使讀函數(shù)進(jìn)入睡眠狀態(tài),wait_event_interruptible()要放到down()前面,否則會(huì)產(chǎn)生死鎖,在GPIB接口處聽者作用狀態(tài)結(jié)束時(shí),通過(guò)wake_up_interruptible()來(lái)喚醒睡眠狀態(tài),這樣就實(shí)現(xiàn)了讀阻塞。
將儀器與計(jì)算機(jī)通過(guò)GPIB電纜相連,將mknod建立設(shè)備結(jié)點(diǎn)命令和insmod向內(nèi)核插入驅(qū)動(dòng)命令的參數(shù)均設(shè)置為優(yōu)化后的GPIB驅(qū)動(dòng)模塊,然后將以上命令編寫成腳本,在LINUX終端下運(yùn)行此腳本,GPIB驅(qū)動(dòng)便加載到LINUX內(nèi)核,并運(yùn)行測(cè)試程序,因?yàn)樵贕PIB驅(qū)動(dòng)的read函數(shù)里用了阻塞機(jī)制,所以在數(shù)據(jù)沒(méi)有到來(lái)之前,程序在阻塞狀態(tài)。從圖6可以看到GPIB設(shè)備已打開,驅(qū)動(dòng)被成功加載到內(nèi)核。
圖6 優(yōu)化后的GPIB驅(qū)動(dòng)被成功加載到內(nèi)核
接著在計(jì)算機(jī)上運(yùn)行GPIB管理器軟件,*IDN?[10]命令隨軟件啟動(dòng)自動(dòng)發(fā)送,枚舉當(dāng)前在線儀器,圖7展示了儀器的信息成功返回;最后再對(duì)GPIB驅(qū)動(dòng)進(jìn)行命令快速連續(xù)發(fā)送測(cè)試,如圖8所示。
圖7 儀器信息成功返回
圖8 命令快速連續(xù)發(fā)送測(cè)試
從以上測(cè)試步驟可以看到,優(yōu)化后的GPIB驅(qū)動(dòng)加載到LINUX內(nèi)核,系統(tǒng)運(yùn)行正常,說(shuō)明與系統(tǒng)兼容性良好,利用GPIB管理器軟件對(duì)在線GPIB儀器進(jìn)行枚舉,設(shè)備被正常識(shí)別,說(shuō)明驅(qū)動(dòng)通信正常,以上兩方面的測(cè)試,反映了優(yōu)化后的GPIB驅(qū)動(dòng)并沒(méi)有影響驅(qū)動(dòng)原有的正常運(yùn)行和功能,最后再針對(duì)向儀器發(fā)命令的頻率比較高時(shí),GPIB驅(qū)動(dòng)傳輸性能不是很理想的問(wèn)題,進(jìn)行命令快速連續(xù)發(fā)送測(cè)試,所有命令返回值均立即并正確返回,GPIB管理器軟件并無(wú)警告或異常報(bào)錯(cuò)提示,這表明優(yōu)化后的GPIB驅(qū)動(dòng),使此問(wèn)題得到了有效的改善。
本文主要從中斷服務(wù)程序和設(shè)備文件操作讀寫函數(shù)對(duì)GPIB驅(qū)動(dòng)進(jìn)行了優(yōu)化設(shè)計(jì)。在中斷服務(wù)程序底半部里,利用非原子操作工作隊(duì)列,實(shí)現(xiàn)了內(nèi)核態(tài)的進(jìn)程和用戶態(tài)的進(jìn)程并行,并結(jié)合了睡眠機(jī)制,從而提高了驅(qū)動(dòng)運(yùn)行效率;受并行工作思想的啟發(fā),提出了FIFO半滿位作為接收數(shù)據(jù)流程中的判斷標(biāo)準(zhǔn),實(shí)現(xiàn)了FIFO中收數(shù)據(jù)到內(nèi)核緩沖區(qū)和向FIFO里傳數(shù)據(jù)可以并發(fā)進(jìn)行,對(duì)加快數(shù)據(jù)傳輸速率起到了較好的效果;在讀寫函數(shù)里,應(yīng)用了信號(hào)量,避免了讀寫可能同時(shí)操作臨界資源的隱患,對(duì)驅(qū)動(dòng)的可靠運(yùn)行進(jìn)行了加固。在對(duì)驅(qū)動(dòng)運(yùn)行效率,傳輸速率,可靠性幾方面的優(yōu)化后,GPIB驅(qū)動(dòng)傳輸性能得到了一定的提升。