天靈靈地靈靈 遙控為何會(huì )失靈
3
本文引用地址:http://dyxdggzs.com/article/201811/394465.htm收到測試大姐的反饋后,灑家立馬收拾了心情,屢起袖子,架起示波器,測試了起來(lái)。果不其然,測試了幾十次,示波器上的遙控接收波形好好的,但是BCM就是沒(méi)有響應,統計出來(lái)的失靈概率為20%左右。
不消說(shuō),肯定是遙控報文接收程序出了問(wèn)題。為了敘述方便,先簡(jiǎn)要介紹一下遙控接收程序的設計。
遙控報文是一串射頻位位流,遙控接收程序的目的是從這一串射頻位位流中提取遙控命令數據。為了實(shí)現這一點(diǎn),大致需要進(jìn)行“接收射頻位位流”、“解碼數據位位流”、“提取數據場(chǎng)數據”、“解密數據”四個(gè)步驟。
其中,射頻位到數據位采用了曼徹斯特編碼形式,以射頻位01表示數字位1,以射頻位10表示數字位0,BCM采用上升沿觸發(fā)中斷的方式,根據相鄰兩個(gè)上升沿之間的時(shí)間間隔來(lái)賦值射頻位。BCM根據遙控報文的格式提取出“數據場(chǎng)”中的射頻位位流,然后進(jìn)行曼徹斯特解碼,計算出數據位位流,進(jìn)而提取出字節形式的數據,解密后,提取其中的遙控命令,進(jìn)而執行相關(guān)的閉鎖、解鎖、尋車(chē)等操作。
顯然,肯定是“接收射頻位位流”這個(gè)步驟出了問(wèn)題,因為假若是后面三個(gè)步驟其中之一出了問(wèn)題,那就不是偶爾失靈,而是總是失靈的大故障了。
由于曼徹斯特編碼的射頻位位流中,相鄰兩個(gè)上升沿的間隔取值只可能為2T、3T、4T,T為射頻位位寬。因此,在“接收射頻位位流”的具體實(shí)現中,BCM根據上升沿時(shí)間間隔大小推斷出射頻位,考慮到上升沿中斷觸發(fā)時(shí)刻和中斷服務(wù)程序之間的延遲,考慮到數據捕捉模塊時(shí)鐘源的精度,在程序里,2T、3T、4T的判斷都留了足夠的余量,照理說(shuō),也不該出問(wèn)題。
總之,和往常一樣,“設計”上無(wú)懈可擊,定是“實(shí)現”上出了問(wèn)題。
4
代碼是“實(shí)現”“設計”的載體,灑家盯著(zhù)代碼端詳半天,實(shí)在看不出個(gè)所以然,只好付諸調試。筆者開(kāi)了一個(gè)輪轉型的大數組,存儲在中斷服務(wù)程序中計算出來(lái)的射頻位位寬,一番調試,終于看出了一些端倪:
原來(lái),在一些規整的射頻位位寬之后,竟然存在既不是2T、也不是3T和4T的位寬。射頻位在這里斷了線(xiàn),后面的數據位肯定不正確,遙控失靈自然也是跑不了的了。筆者多次測試之后,發(fā)現了個(gè)規律,即這些異常位寬要么是2T-3T之間,要么是3T-4T之間,也不算過(guò)于異常。
看來(lái),在一個(gè)數據位周期中(2T),貌似有的上升沿出現得早,有的上升沿出現得晚,既如此,把2T-3T之間的處理為3T,3T-4T之間的處理為4T,就可以補救這種上升沿的錯位。
順著(zhù)這種思路,筆者迅速修改了代碼,然后熱火朝天地測試了起來(lái),果然,失靈的幾率大大下降了,測試上50次,只會(huì )失靈一兩次了。
‘也許,這剩下的一兩次真的就是被遙控鑰匙過(guò)濾掉了吧?!瘹v盡劫波的我暗暗想到。不過(guò),為了避免測試大姐再次上門(mén),我決定再多測試幾次。灑家懷揣著(zhù)小小的僥幸心理,一邊看著(zhù)示波器,一邊按著(zhù)按鍵,一邊聽(tīng)著(zhù)測試臺上的門(mén)鎖動(dòng)作聲音,緊張地再次測試起來(lái)。
都說(shuō)好事多磨,但是常人實(shí)在經(jīng)受不住一磨再磨,一通操作下來(lái),灑家悲催地發(fā)現,這剩下的一兩次失靈竟然是真的失靈了!
5
我斜斜地躺在轉椅上,茫然地看著(zhù)天花板,經(jīng)過(guò)一兩天的奮斗,豪氣消耗大半,牙齒也開(kāi)始隱隱作痛了,空空如也的腦袋中兀自循環(huán)播放著(zhù)孫中山先生的臨終遺言:革命尚未成功,同志仍需努力!
‘要不算了吧,失靈概率2%-3%之間,用戶(hù)應該是能接受得了的吧?偶爾失靈一下,再多按一下就是了,用戶(hù)肯定覺(jué)察不出來(lái)的!’在陽(yáng)光的照射下,平時(shí)肉眼看不見(jiàn)的小灰塵在空中慢慢舞動(dòng),‘就像這些灰塵一樣,倘若不是太陽(yáng)這么好,人們怎么能注意到它們的存在呢?’我在心里給自己留好了后路。
正盤(pán)算間,測試大姐爽朗的笑聲從身邊飄過(guò),只見(jiàn)她一雙丹鳳三角眼,兩彎柳葉吊梢眉,身量苗條,體格風(fēng)騷。粉面含春威不露,丹唇未啟笑先聞,活脫脫一個(gè)王熙鳳??!我捫心自問(wèn),‘惹得起嗎?惹不起!’一念至此,灑家一個(gè)激靈,‘對得起用戶(hù)嗎?對不起!’既然如此,走你!繼續解決問(wèn)題!
6
話(huà)不多說(shuō),既然問(wèn)題是由于在一個(gè)數據位周期中有的上升沿出現得早,有的上升沿出現得晚而導致的,那么,現在需要搞明白的是,究竟是上升沿確實(shí)出現得比預期早或者晚,導致位寬異常,還是由于系統運行期間,上升沿觸發(fā)時(shí)刻和中斷服務(wù)程序之間的延遲忽高忽低而導致解析出來(lái)的位寬出現異常。
為了確認這一點(diǎn),筆者開(kāi)始第一次認真地對著(zhù)示波器看起遙控報文的波形來(lái),當然,有的看官可能會(huì )問(wèn)了,為什么之前不看這個(gè)波形???說(shuō)實(shí)在話(huà),我還真的無(wú)言以對,反正之前沒(méi)看過(guò)就是了。所幸遙控報文的header部分有上百個(gè)數據位0,也很規律,灑家身體前傾,扭著(zhù)示波器上的時(shí)間軸,雙目圓睜,看著(zhù)時(shí)間刻度,果然,有的上升沿出現得早,有的上升沿出現得晚,一念至此,筆者懸著(zhù)的心稍稍放了下來(lái),這說(shuō)明不是中斷服務(wù)程序延遲導致的!好心情維持沒(méi)多久,我這顆小心臟又再次懸了起來(lái),因為,既然是鑰匙那端把位寬搞得亂七八糟,BCM這端怎么也解決不了??!
日光漸移,透過(guò)窗戶(hù),將灑家的身影拉得老長(cháng)。我盯著(zhù)影子中的大好頭顱,撓著(zhù)頭皮,手指翻動(dòng),倒像是密宗修行里結的一個(gè)個(gè)手印。阿彌陀佛加持,菩薩保佑,總得想個(gè)解決辦法出來(lái)!
我默默翻動(dòng)著(zhù)在示波器時(shí)間軸上不斷游走的波形,目光慢慢從上升沿移動(dòng)到了下降沿上面,‘上升沿不標準,下降沿是否可能標準呢?’我模模糊糊地想著(zhù),同時(shí)統計著(zhù)下降沿之間的時(shí)間間隔,剛剛統計了四五個(gè),問(wèn)題的解決方案就已經(jīng)向我遙遙招手了。下降沿之間的時(shí)間間隔標準多了,我一口氣統計了20個(gè),發(fā)現報文header部分的波形中相鄰下降沿的時(shí)間間隔都在標準的2T左右,基本上沒(méi)有任何誤差!
剩下的事情就簡(jiǎn)單了,把“接收射頻位位流”程序改一改,改成下降沿觸發(fā)中斷,然后相應地把“解碼數據位位流”程序改一改,再次測試100次,百發(fā)百中!誰(shuí)能想得到,問(wèn)題竟這樣戲劇般地解決了!故障迅速解決掉了,但是它揮一揮衣袖,這牙疼卻不帶走,仍然折磨了我一天才慢慢消退。
事后想來(lái),這跟設計鑰匙的廠(chǎng)家編寫(xiě)鑰匙程序的方式有著(zhù)莫大關(guān)系,他們的程序可以在射頻位的下降沿上保證周期準確性,卻無(wú)法在上升沿上保證時(shí)間精度,倘若反過(guò)來(lái),他們的程序能夠在上升沿上保證周期準確性,我也就不會(huì )遇到鑰匙失靈的問(wèn)題,當然,也就不會(huì )有這么有趣的經(jīng)歷了。
后記
鹵水點(diǎn)豆腐,一物降一物,獅子怕大象,大象怕老鼠。嵌入式產(chǎn)品出了問(wèn)題,千萬(wàn)不要怕,也不要躲,有Bug才是日常工作的常態(tài),真是沒(méi)有Bug,日子也會(huì )很無(wú)聊。正所謂:莫愁前路無(wú)知己,總有Bug跟著(zhù)你。
評論