http://bluefish.blog.51cto.com/214870/58117
2008
在給客戶(hù)的定制的一個(gè)系統上跑應用程序的時(shí)候,那幾個(gè)摁鍵總是不怎么靈,干擾很?chē)乐?。由于用?hù)的應用程序已經(jīng)完成了,所以只有在驅動(dòng)中更改。
其實(shí)按照我的理解,驅動(dòng)只是提供一個(gè)功能接口,盡可能的實(shí)現最基本的功能給上層盡可能多的發(fā)揮空間。如果一些控制代碼放到驅動(dòng)中,這樣就把上層的一些操作給固化了,上層的發(fā)揮的空間就小了很多。
現在是沒(méi)有辦法,只能在驅動(dòng)中更改。本文的平臺是wince4.2+s3c2440,4個(gè)摁鍵的接口分別是SPICLK0(L9),SPIMOSI0(P9),SPIMISO1(K10),SPIMISO0(K9)。在這地方差點(diǎn)被忽悠了,看著(zhù)這些東西好象是要做spi的驅動(dòng),其實(shí)在2440的spec中搜一下發(fā)現這些口分別對應了GPE13,GPE12,GPG5,GPE11。
這樣就好辦了,隨便寫(xiě)個(gè)流驅動(dòng)對這幾個(gè)口進(jìn)行設置。在應用程序readfile的時(shí)候,驅動(dòng)程序就分別查看這幾個(gè)口的狀態(tài)寄存器值,如果是1則對應的摁鍵被摁下,如果為0則相反。在這個(gè)地方就出現問(wèn)題了,由于應用程序開(kāi)了一個(gè)線(xiàn)程一直在readfile(個(gè)人猜測),摁鍵被摁下則做相應處理。由于在按鍵時(shí)有一定的抖動(dòng)產(chǎn)生干擾,導致按一次鍵應用程序可能會(huì )讀到好幾個(gè)按下的狀態(tài)。
在這里,消除干擾無(wú)非就是用時(shí)間來(lái)?yè)Q取??梢远啻螜z測取值比對,這個(gè)辦法也不是很穩定,因為無(wú)法確定該取多少次值。我的辦法很土,不過(guò)比較有效。在驅動(dòng)中如果一個(gè)寄存器的值為1(即鍵被按下),則等待300ms并將這個(gè)狀態(tài)返回給應用程序。之所以這么做是因為在不按鍵時(shí)是不會(huì )產(chǎn)生干擾的,假如按鍵了不管有沒(méi)有干擾總會(huì )產(chǎn)生一個(gè)1狀態(tài),而驅動(dòng)程序總能捕獲到這樣一個(gè)狀態(tài),不管你后面有沒(méi)有干擾先等著(zhù)再說(shuō)。這樣應用程序就不知道有干擾的存在(驅動(dòng)還沒(méi)有返回值給它,這里所謂的干擾就是0和1之間的不確定跳動(dòng)),這也必然會(huì )影響應用程序的響應速度。根據我們測試的能接受的時(shí)間,在驅動(dòng)中設置100-300ms比較合適。
在這種地方真不應該用輪循的方法,要是中斷的話(huà)就沒(méi)有這么多麻煩了。至少在處理一個(gè)中斷的時(shí)候可以將這個(gè)中斷給屏蔽掉。
本文出自 “bluefish” 博客,請務(wù)必保留此出處http://bluefish.blog.51cto.com/214870/58117
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。