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