本發(fā)明涉及qnx軟件技術(shù)領(lǐng)域,尤其涉及一種qnx系統(tǒng)的usb驅(qū)動(dòng)加載方法。
背景技術(shù):
qnx系統(tǒng)是由加拿大qssl公司(qnxsoftwaresystemltd.)開發(fā)的分布式實(shí)時(shí)操作系統(tǒng),以其穩(wěn)定著稱,因此非常適合作用對穩(wěn)定性要求較高的車載信息系統(tǒng)的操作系統(tǒng)。
usb作為車機(jī)系統(tǒng)上一個(gè)重要的娛樂模塊,備受終端用戶關(guān)注,usb設(shè)備在某些情況下,如反復(fù)插拔、反復(fù)開關(guān)機(jī)accon/off,或者是cpu占用率很高時(shí),usb驅(qū)動(dòng)可能會(huì)出現(xiàn)加載不正常的情況。
因此,現(xiàn)有技術(shù)有待進(jìn)一步改進(jìn)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種qnx系統(tǒng)的usb驅(qū)動(dòng)加載方法,旨在解決現(xiàn)有技術(shù)中的缺陷,實(shí)現(xiàn)usb驅(qū)動(dòng)的準(zhǔn)確加載。
為達(dá)到上述目的,本發(fā)明所采取的技術(shù)方案為:
s1、系統(tǒng)啟動(dòng),首次讀取usb設(shè)備寄存器,獲取usb設(shè)備初始狀態(tài)并保存,啟動(dòng)usb狀態(tài)監(jiān)測線程;
s2、以預(yù)設(shè)周期t監(jiān)測usb設(shè)備的插拔狀態(tài),若檢測到usb設(shè)備已插入,則進(jìn)入下一步;
s3、判斷是否為usb存儲設(shè)備,是則進(jìn)入下一步,否則進(jìn)入步驟s7;
s4、監(jiān)測usb設(shè)備安裝狀態(tài)是否ok,是則進(jìn)入步驟s5,否則進(jìn)入步驟s6;
s5、檢測在預(yù)設(shè)時(shí)間t1內(nèi)usb設(shè)備目錄下的相應(yīng)pps文件是否創(chuàng)建成功,是則進(jìn)入步驟s6,否則進(jìn)入步驟s7;
s6、檢測在預(yù)設(shè)時(shí)間t2內(nèi)usb盤符路徑是否創(chuàng)建成功,是則進(jìn)入步驟s12,否則進(jìn)入步驟s7;
s7、判斷usb驅(qū)動(dòng)加載失?。?/p>
s8、發(fā)送預(yù)設(shè)usb驅(qū)動(dòng)錯(cuò)誤診斷碼;
s9、接收所述預(yù)設(shè)usb驅(qū)動(dòng)錯(cuò)誤診斷碼,結(jié)束當(dāng)前usb驅(qū)動(dòng)進(jìn)程;
s10、判斷模擬usb驅(qū)動(dòng)進(jìn)程拉起是否成功,是則返回步驟s3,否則進(jìn)入下一步;
s11、判斷為不可識別的設(shè)備,返回步驟s2;
s12、usb設(shè)備驅(qū)動(dòng)加載成功,返回步驟s2。
具體地,所述判斷是否為usb存儲設(shè)備,包括如下步驟:
步驟301、檢測usb設(shè)備版本目錄下的版本pps文件是否生成;
步驟302、判斷所述版本pps文件中的設(shè)備數(shù)目是否為1,是則進(jìn)入下一步;
步驟303、判斷所述版本pps文件中的classid是否為預(yù)設(shè)值,是則判斷為usb設(shè)備,否則判斷為非usb設(shè)備。
具體地,所述判斷模擬usb驅(qū)動(dòng)進(jìn)程拉起是否成功,包括如下步驟:
步驟1001、檢測模擬usb驅(qū)動(dòng)進(jìn)程拉起次數(shù)是否超過預(yù)設(shè)次數(shù)n,是則判斷為不可識別的設(shè)備,否則進(jìn)入下一步;
步驟1002、開始模擬usb驅(qū)動(dòng)進(jìn)程拉起,當(dāng)監(jiān)測到usb設(shè)備寄存器的狀態(tài)由插入變?yōu)榘纬鰰r(shí),將其判斷為模擬usb驅(qū)動(dòng)進(jìn)程拉起運(yùn)行中;
步驟1003、當(dāng)監(jiān)測到usb設(shè)備寄存器的狀態(tài)由拔出變?yōu)椴迦霑r(shí),判斷模擬usb驅(qū)動(dòng)進(jìn)程拉起結(jié)束,并返回步驟3。
具體地,所述預(yù)設(shè)周期t=2s。
具體地,所述預(yù)設(shè)時(shí)間t1=5s。
具體地,所述預(yù)設(shè)時(shí)間t2=5s。
具體地,所述預(yù)設(shè)次數(shù)n=3。
本發(fā)明的有益效果在于:本發(fā)明通過檢測usb的插拔狀態(tài),當(dāng)檢測到usb驅(qū)動(dòng)加載失敗后,發(fā)送預(yù)設(shè)usb驅(qū)動(dòng)錯(cuò)誤診斷碼,結(jié)束當(dāng)前usb驅(qū)動(dòng)進(jìn)程,然后模擬usb驅(qū)動(dòng)進(jìn)程拉起,實(shí)現(xiàn)usb設(shè)備驅(qū)動(dòng)的重新加載。
附圖說明
圖1是本發(fā)明的qnx系統(tǒng)的usb驅(qū)動(dòng)加載的流程示意圖。
具體實(shí)施方式
下面結(jié)合附圖具體闡明本發(fā)明的實(shí)施方式,附圖僅供參考和說明使用,不構(gòu)成對本發(fā)明專利保護(hù)范圍的限制。
請參見圖1,本實(shí)施例提供的qnx系統(tǒng)的usb驅(qū)動(dòng)加載方法,主要包括以下步驟:
步驟1、系統(tǒng)啟動(dòng),首次讀取usb設(shè)備寄存器,獲取usb設(shè)備初始狀態(tài)并保存,啟動(dòng)usb狀態(tài)監(jiān)測線程。
所述usb設(shè)備初始狀態(tài)為插入或者拔出。
步驟2、以預(yù)設(shè)周期t監(jiān)測usb設(shè)備的插拔狀態(tài),若檢測到usb設(shè)備已插入,則進(jìn)入下一步。
在本實(shí)施例中,所述預(yù)設(shè)周期t=2s。
在具體實(shí)施時(shí),所述監(jiān)測usb設(shè)備的插拔狀態(tài)通過讀取usb設(shè)備寄存器來實(shí)現(xiàn)。
步驟3、判斷是否為usb存儲設(shè)備,是則進(jìn)入下一步,否則進(jìn)入步驟7。
具體地,所述判斷是否為usb存儲設(shè)備,包括如下步驟:
步驟301、檢測usb設(shè)備版本目錄下的版本pps文件是否生成。
pps即persistentpusblish/subscribe的縮寫,是qnx系統(tǒng)特有的多進(jìn)程間的一種通訊方式。pps文件是一個(gè)文件節(jié)點(diǎn)信息,里面記錄了一些狀態(tài)信息。
在本實(shí)施例中,所述usb設(shè)備版本目錄為/pps/qnx/driver,該目錄在qnx系統(tǒng)在usb設(shè)備已插入的情況下,會(huì)生成的一個(gè)版本pps文件。例如,
/pps/qnx/driver/usb-1.0.1的pps文件記錄的就是當(dāng)前的usb的1.0.1版本usb設(shè)備的狀態(tài)信息。
步驟302、判斷所述版本pps文件中的設(shè)備數(shù)目是否為1,是則進(jìn)入下一步。
步驟303、判斷所述版本pps文件中的classid是否為預(yù)設(shè)值,是則判斷為usb設(shè)備,否則判斷為非usb設(shè)備。
按照usb通訊協(xié)議,usb的classid=0x08。
步驟4、監(jiān)測usb設(shè)備安裝狀態(tài)是否ok,是則進(jìn)入步驟5,否則進(jìn)入步驟6。
在具體實(shí)施時(shí),通過檢測/pps/qnx/mount節(jié)點(diǎn)是否生成來判斷usb設(shè)備安裝狀態(tài)是否已ok。
步驟5、檢測在預(yù)設(shè)時(shí)間t1內(nèi)usb設(shè)備目錄下的相應(yīng)pps文件是否創(chuàng)建成功,是則進(jìn)入步驟6,否則進(jìn)入步驟7。
在本實(shí)施例中,所述預(yù)設(shè)時(shí)間t1=5s。
在本實(shí)施例中,使用linux的select函數(shù)來監(jiān)控usb設(shè)備版本目錄(/pps/qnx/device)、usb設(shè)備驅(qū)動(dòng)目錄(/pps/qnx/driver)及pps文件是否已經(jīng)生成。
步驟6、檢測在預(yù)設(shè)時(shí)間t2內(nèi)usb盤符路徑是否創(chuàng)建成功,是則進(jìn)入步驟12,否則進(jìn)入步驟7。
在本實(shí)施例中,所述預(yù)設(shè)時(shí)間t2=5s。
步驟7、判斷usb驅(qū)動(dòng)加載失敗。
步驟8、發(fā)送預(yù)設(shè)usb驅(qū)動(dòng)錯(cuò)誤診斷碼。
步驟9、接收所述預(yù)設(shè)usb驅(qū)動(dòng)錯(cuò)誤診斷碼,結(jié)束當(dāng)前usb驅(qū)動(dòng)進(jìn)程。
在具體實(shí)施時(shí),qnx系統(tǒng)通過資源管理器接收所述預(yù)設(shè)usb驅(qū)動(dòng)錯(cuò)誤診斷碼,執(zhí)行相應(yīng)腳本結(jié)束所述當(dāng)前usb驅(qū)動(dòng)進(jìn)程。
在具體實(shí)施時(shí),所述usb驅(qū)動(dòng)進(jìn)程是指usblauncher,它是qnx系統(tǒng)負(fù)責(zé)加載usb驅(qū)動(dòng)的進(jìn)程。
步驟10、判斷模擬usb驅(qū)動(dòng)進(jìn)程拉起是否成功,是則返回步驟3,否則進(jìn)入下一步。
在本實(shí)施例中,所述判斷模擬usb驅(qū)動(dòng)進(jìn)程拉起是否成功,包括如下步驟:
步驟1001、檢測模擬usb驅(qū)動(dòng)進(jìn)程拉起次數(shù)是否超過預(yù)設(shè)次數(shù)n,是則判斷為不可識別的設(shè)備,否則進(jìn)入下一步。
在本實(shí)施例中,所述預(yù)設(shè)次數(shù)n=3。
步驟1002、開始模擬usb驅(qū)動(dòng)進(jìn)程拉起,當(dāng)監(jiān)測到usb設(shè)備寄存器的狀態(tài)由插入變?yōu)榘纬鰰r(shí),將其判斷為模擬usb驅(qū)動(dòng)進(jìn)程拉起運(yùn)行中;
步驟1003、當(dāng)監(jiān)測到usb設(shè)備寄存器的狀態(tài)由拔出變?yōu)椴迦霑r(shí),判斷模擬usb驅(qū)動(dòng)進(jìn)程拉起結(jié)束,并返回步驟3。
在重新啟動(dòng)usb驅(qū)動(dòng)進(jìn)程的過程中,最開始讀取usb設(shè)備寄存器時(shí),讀取到的值為0,表示usb設(shè)備已拔出,然后寄存器讀取到的值變?yōu)?,表示usb設(shè)備已插入;但實(shí)際上所述usb設(shè)備并未真正拔下然后插入,因此為了將重新啟動(dòng)usb驅(qū)動(dòng)進(jìn)程的過程與usb的物理拔插的過程區(qū)分,定義了重新啟動(dòng)usb驅(qū)動(dòng)進(jìn)程的過程中的三種狀態(tài):模擬usb驅(qū)動(dòng)進(jìn)程拉起開始、模擬usb驅(qū)動(dòng)進(jìn)程拉起運(yùn)行中、模擬usb驅(qū)動(dòng)進(jìn)程拉起結(jié)束,從而實(shí)現(xiàn)重新啟動(dòng)usb驅(qū)動(dòng)進(jìn)程的目的。
步驟11、判斷為不可識別的設(shè)備,返回步驟2。
步驟12、usb設(shè)備驅(qū)動(dòng)加載成功,返回步驟2。
以上所揭露的僅為本發(fā)明的較佳實(shí)施例,不能以此來限定本發(fā)明的權(quán)利保護(hù)范圍,因此依本發(fā)明申請專利范圍所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。