嵌入式系統(tǒng)的SD控制器設(shè)計(jì)實(shí)現(xiàn)
系統(tǒng)初始化時(shí),SD_nCD檢測(cè)引腳被設(shè)置為上升沿和下降沿觸發(fā),因此引腳電平發(fā)生變化時(shí),都會(huì)有中斷產(chǎn)生。當(dāng)硬件產(chǎn)生中斷時(shí),系統(tǒng)進(jìn)入核心ISR,對(duì)SD_nCD進(jìn)行檢測(cè),返回相應(yīng)的中斷標(biāo)識(shí)碼,對(duì)于是SD插入還是拔出,則由驅(qū)動(dòng)程序的IST來(lái)處理。
由于SD卡插槽采用的是機(jī)械式開(kāi)關(guān),在插拔卡的時(shí)候,機(jī)械開(kāi)關(guān)斷開(kāi)、閉合時(shí)會(huì)有抖動(dòng),導(dǎo)致SD卡檢測(cè)引腳的電平不穩(wěn)定,從而有可能引起對(duì)卡的狀態(tài)的誤判。這樣會(huì)導(dǎo)致加載上層驅(qū)動(dòng),初始化失敗造成系統(tǒng)宕機(jī)。為了使每次插拔只響應(yīng)一次,必須要采用相應(yīng)的方法來(lái)防止抖動(dòng),避開(kāi)按鍵按下的抖動(dòng)時(shí)間。
在驅(qū)動(dòng)程序IST里采用延時(shí)采樣的方法來(lái)避免抖動(dòng),同時(shí)也嘗試了多次采樣的檢測(cè)方法來(lái)避開(kāi)用戶按鍵的抖動(dòng)時(shí)間。
延時(shí)采樣是IST在收到SD卡檢測(cè)事件以后,并不是立刻進(jìn)行引腳信號(hào)判斷,而是延時(shí)一段時(shí)間采樣,延遲時(shí)間要根據(jù)系統(tǒng)電路特性而定,然后檢測(cè)引腳信號(hào),判斷插槽的狀態(tài)是卡插入還是拔出。多次采樣方法是IST在收到SD卡檢測(cè)事件以后,要對(duì)引腳進(jìn)行多次等間隔采樣,根據(jù)采樣出的多數(shù)電平信號(hào)的值來(lái)決定插槽卡的狀態(tài)。多次采樣的方法可以有更短的響應(yīng)時(shí)間,當(dāng)采樣出的電平信號(hào)多數(shù)值不能決定卡的狀態(tài)時(shí),需要進(jìn)行重新采樣判斷。
對(duì)于延時(shí)采樣的防抖動(dòng)方法,必須考慮到實(shí)現(xiàn)的效率。
ISR運(yùn)行于系統(tǒng)核心態(tài),它的延時(shí)會(huì)影響整個(gè)系統(tǒng),導(dǎo)致用戶的輸入響應(yīng)時(shí)間過(guò)長(zhǎng),造成整體性能的下降。而WindowsCE的驅(qū)動(dòng)程序是用戶態(tài)的DLL,作為用戶進(jìn)程來(lái)調(diào)度,因此在SDHost的驅(qū)動(dòng)程序里實(shí)現(xiàn)防抖動(dòng),可保證系統(tǒng)整體性能不下降。
對(duì)于上述兩種防抖動(dòng)方法,我們進(jìn)行了連續(xù)插拔的測(cè)試,結(jié)果如圖3所示。測(cè)試結(jié)果表明,這兩種方法都取得了較好的效果,基本上解決了SD卡檢測(cè)的抖動(dòng)問(wèn)題。
圖3 SD卡插拔宕機(jī)次數(shù)測(cè)試
4 結(jié)語(yǔ)
本文介紹的SDHost控制器已經(jīng)應(yīng)用在工程實(shí)踐中,結(jié)果表明設(shè)計(jì)是靈活有效的,防抖動(dòng)設(shè)計(jì)對(duì)于類(lèi)似的設(shè)計(jì)也具有一定的借鑒意義。
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論