日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 中斷和主循環(huán)不登對(duì) 系統(tǒng)一直休眠久睡

          中斷和主循環(huán)不登對(duì) 系統(tǒng)一直休眠久睡

          作者:寂寞君 時(shí)間:2019-05-28 來源:電子產(chǎn)品世界 收藏

          你永遠(yuǎn)也喚不醒一個(gè)裝睡的人,但是你可以一巴掌呼醒他。

          本文引用地址:http://yuyingmama.com.cn/article/201905/400938.htm

          1559007449797597.jpg

          可如果一個(gè)系統(tǒng)休眠之后,就猶抱琵琶半遮面,千呼萬喚醒不來了呢?筆者擔(dān)綱開發(fā)的中控鎖模塊就醒不過來了。

          1

          這個(gè)問題已經(jīng)折磨我整整兩天了,搞得我心力憔悴。合作伙伴一天幾個(gè)電話,恨不得從手機(jī)里面直接跳過來當(dāng)面質(zhì)問我:為什么喚不醒,為什么死睡?

          平時(shí)對(duì)我愛答不理的領(lǐng)導(dǎo)也一改常態(tài),轉(zhuǎn)而死死地盯著我。老實(shí)厚道的我呢,自然也十分緊張且惶恐,因?yàn)閱栴}十有八九確實(shí)出在我寫的代碼上。

          關(guān)鍵是這個(gè)問題出現(xiàn)在馬上大批量供貨的前夜,太不是時(shí)候了!我們給某車廠供貨的中控鎖模塊已經(jīng)走到了小批量供貨階段,前期供貨20套倒是無驚無險(xiǎn),沒發(fā)現(xiàn)什么問題,按照流程,接下來要供貨100套。

          如果阿彌陀佛的話,就再供貨200套,再?zèng)]有什么問題,就進(jìn)入大批量供貨階段了。到時(shí),合作伙伴開始穩(wěn)定盈利,領(lǐng)導(dǎo)政績(jī)、獎(jiǎng)金到手,不會(huì)爭(zhēng)功只會(huì)攬過的我呢,揮一揮手退到幕后,深藏功與名,一切就萬事大吉,只待歲月靜好了??墒牵∏≡诠┴?00套期間,忘了求菩薩保佑,結(jié)果就出事了。

          一天,車廠的生產(chǎn)線上下線了裝配了我們的中控鎖模塊的50輛新車,本來一切順利,在生產(chǎn)線上操作中控鎖沒什么問題,匹配學(xué)習(xí)了遙控鑰匙,也能用遙控正常操作。但是到了下線后車廠人員要把新車開回倉庫時(shí),突然發(fā)現(xiàn)有幾臺(tái)車用遙控鑰匙、機(jī)械鑰匙死活也喚醒不了了??!

          事關(guān)重大,車廠立馬通知了中控鎖的供貨商—我們的合作伙伴,合作伙伴立馬找到了我們(中控鎖的開發(fā)商)領(lǐng)導(dǎo),領(lǐng)導(dǎo)立馬找到了我。我也立即給自己上緊了發(fā)條,進(jìn)入戰(zhàn)斗狀態(tài)。

          2

          眼看到手的政績(jī)和獎(jiǎng)金要飛,領(lǐng)導(dǎo)心急火燎,早被晾到一邊的我卻頗不以為然。

          到了現(xiàn)在這個(gè)階段,軟件肯定沒問題,有問題早就測(cè)出來了嘛,還能等到現(xiàn)在?肯定是中控鎖的線束出了問題。

          當(dāng)我把輕描淡寫的分析說與領(lǐng)導(dǎo)時(shí),領(lǐng)導(dǎo)一改往日的溫和,一下子急了:人家線束供了這么多年了,按你的說法,有問題早就測(cè)出來了,還能等到現(xiàn)在?

          歲月的風(fēng)霜早已經(jīng)消去了我性情中所有的剛硬和火熱,只剩下如水的柔和。看到領(lǐng)導(dǎo)急了,我心中起著嘀咕,臉上泛起笑容,小心翼翼地對(duì)領(lǐng)導(dǎo)言道:“要不我再看一下代碼,沒準(zhǔn)真是哪里出了岔子呢?”

          得到我的表態(tài)后,領(lǐng)導(dǎo)轉(zhuǎn)身踱了開去,一邊嘴里念叨著得跟車廠確認(rèn)一下線束有沒有問題,一邊轉(zhuǎn)過頭來再次叮嚀我一番:抓緊??!看著領(lǐng)導(dǎo)那殷切的眼神和黑黑的眼圈,我用力地點(diǎn)了點(diǎn)頭,一個(gè)猛子扎進(jìn)代碼的汪洋大海,迅速游至中控鎖的休眠和喚醒之地。

          代碼的設(shè)計(jì)思路總是簡(jiǎn)單而且正確的。中控鎖進(jìn)入休眠之前,設(shè)置了兩個(gè)喚醒條件:①機(jī)械解鎖信號(hào)的上升沿喚醒MCU;②定期檢查遙控鑰匙信號(hào)的定時(shí)器周期喚醒MCU。當(dāng)出現(xiàn)有效的機(jī)械鎖信號(hào)時(shí),或者檢測(cè)到有效的遙控信號(hào)時(shí),中控鎖禁止這兩個(gè)喚醒條件并返回正常狀態(tài)。

          在具體的代碼實(shí)現(xiàn)上,把中控鎖的休眠模式處理分成了兩部分:服務(wù)程序和循環(huán)體。由機(jī)械鎖解鎖開關(guān)信號(hào)觸發(fā),執(zhí)行完ISR后先返回循環(huán)體,再退出休眠模式。循環(huán)體中反復(fù)休眠和臨時(shí)喚醒,在臨時(shí)喚醒期間通過三級(jí)濾波機(jī)制檢查是否存在有效的遙控鑰匙信號(hào)。存在遙控信號(hào)時(shí),這個(gè)循環(huán)體層層地通過三級(jí)濾波后,退出休眠模式。

          邏輯上清晰,代碼也很簡(jiǎn)單,我反反復(fù)復(fù)檢查了幾遍,沒看出個(gè)子丑演卯來,就準(zhǔn)時(shí)準(zhǔn)點(diǎn)地下班回家了。

          第二天上班后,我還沒在工位上坐定,還沒來得及平復(fù)一下自己的燥熱勁頭,領(lǐng)導(dǎo)就帶著于我少有的笑意貓過來了。不等他開口,老實(shí)巴交的我就主動(dòng)匯報(bào)了檢查代碼后沒有發(fā)現(xiàn)什么問題的情況,no news is good news,但是此時(shí)代碼沒有問題就是大問題??!

          話音甫落,領(lǐng)導(dǎo)臉上還沒來得及展開的笑容就凝固不動(dòng)了,他張著口,默默地看著我。

          我們倆就這么站著,不說話,就十分地不美好!

          城府甚深的領(lǐng)導(dǎo)終于沒有說話,他不動(dòng)聲色地安排了一位同事搭建了中控鎖的測(cè)試系統(tǒng),讓他反復(fù)測(cè)試休眠、喚醒的情況。

          3

          測(cè)試的方法很簡(jiǎn)單,把電流表串進(jìn)中控鎖的供電線上,看著電流下降到休眠電流范圍后,便操作一下遙控鑰匙,或者給一個(gè)機(jī)械解鎖信號(hào),看能否執(zhí)行解閉鎖操作。

          我在一邊冷眼觀察著測(cè)試人員的操作,心情竟然無比地矛盾,既希望他快點(diǎn)測(cè)出來不能正常喚醒的故障,又盼著最好測(cè)試不出來問題。

          1559007483134162.jpg

          大半天下來,中控鎖反反復(fù)復(fù)地正常休眠、被正常喚醒,我的心也反反復(fù)復(fù)地七上八下,百般煎熬。后來,測(cè)試人員的電話響了,我默默轉(zhuǎn)身離開,同時(shí)發(fā)現(xiàn)自己竟然更加惶恐了!

          剛剛坐到電腦前,測(cè)試人員就大呼小叫著跑了過來:“寂寞君,問題再現(xiàn)了!”我就像屁股上安了個(gè)彈簧一樣,一下子被凳子彈了起來,待我三步并作兩步跨到測(cè)試臺(tái)前時(shí),領(lǐng)導(dǎo)也已經(jīng)聞聲迅速趕來。

          我抓著遙控鑰匙一邊操作,一邊注視著電流表的讀數(shù),電流一直穩(wěn)定在2毫安左右。

          問題確認(rèn)了,確實(shí)死活也喚不醒了。

          我又一屁股栽倒在凳子上,抬起頭來,正趕上領(lǐng)導(dǎo)意味深長(zhǎng)的目光。我抿著嘴笑了笑,剛想說點(diǎn)什么,測(cè)試臺(tái)上測(cè)試人員的電話又嗡嗡響了起來。

          聽著熟悉的手機(jī)鈴聲在耳邊縈繞,看著手機(jī)在桌子上震動(dòng)個(gè)不停,我回想起測(cè)試人員剛才打電話時(shí)的情景,暗鈍的思維再度轉(zhuǎn)動(dòng)起來:之前只是考慮了機(jī)械解鎖單獨(dú)觸發(fā)喚醒、遙控鑰匙單獨(dú)觸發(fā)喚醒的情況,沒有考慮過遙控信號(hào)通過了前兩級(jí)濾波而此時(shí)機(jī)械解鎖信號(hào)突然觸發(fā)執(zhí)行了ISR這種罕見情況,莫非...?

          測(cè)試人員剛才打電話時(shí),由于手機(jī)的輻射,RF信號(hào)線上出現(xiàn)了若干有效的射頻位,造成RF信號(hào)通過了前兩級(jí)濾波,此時(shí)要在循環(huán)體的第三級(jí)濾波程序要等待200ms,判斷是否是遙控按鍵信號(hào)。

          對(duì)于系統(tǒng)而言,200ms是一個(gè)不容忽視的時(shí)間段,倘若測(cè)試人員在這期間試圖機(jī)械解鎖,觸發(fā)中斷執(zhí)行ISR后會(huì)發(fā)生什么呢?

          我繼續(xù)扒拉開代碼看進(jìn)去,一絲寒意向我心頭襲來。

          原來我在ISR中執(zhí)行了退出休眠模式的函數(shù)-ExitSleepMode(這個(gè)函數(shù)里面會(huì)禁能喚醒條件),當(dāng)ISR執(zhí)行結(jié)束后回到循環(huán)體中時(shí),它會(huì)在200ms超時(shí)后進(jìn)入循環(huán)體第三級(jí)濾波,當(dāng)然它會(huì)發(fā)現(xiàn)不是有效的遙控按鍵信號(hào),于是再度進(jìn)入休眠。

          但是這個(gè)時(shí)候已經(jīng)禁能了喚醒條件,這就意味著它再也喚不醒了呀??!

          4

          人的思維真的很奇怪,本來bug明明就在眼前卻視而不見,可是一旦猜到了bug的可能原因,就立馬火眼金睛起來。

          為了幫助讀者的理解,筆者給出了下面的偽代碼,相信聰慧的讀者也能看出問題所在。

          void interrupt Wake_ISR(void)

          {

          ...

             ExitSleepMode();//disable wakeup event

          ...

          }

          static void ConfirmRkeWakeUp(void)

          {

             __delay_ms(200);

             if(Rke is valid){

          ...

             ExitSleepMode();

          ...

             }

             else{

                       return to sleep ;

             }

          }

          再讓大家加深一下理解。

          假設(shè)機(jī)械解鎖信號(hào)觸發(fā)ISR時(shí),循環(huán)體正運(yùn)行到RF信號(hào)的第三級(jí)濾波程序ConfirmRkeWakeUp之前,MCU會(huì)先執(zhí)行ISR,在ISR中禁能喚醒條件,然后返回循環(huán)體中執(zhí)行ConfirmRkeWakeUp。

          ConfirmRkeWakeUp函數(shù)延時(shí)200ms后,判斷這200ms之間有沒有有效的遙控鑰匙信號(hào),顯然這里是沒有的,于是Return to sleep。

          但是,這個(gè)時(shí)候喚醒條件已經(jīng)被禁能了(在ISR中被禁能了),系統(tǒng)就永遠(yuǎn)不會(huì)被喚醒了。

          眼尖的讀者可能會(huì)納悶,這種故障之前為什么沒有測(cè)試出來?

          因?yàn)榘凑罩暗臏y(cè)試條件,這種情況發(fā)生的幾率非常?。?span style="text-indent: 2em;">循環(huán)體內(nèi)執(zhí)行ConfirmRkeWakeUp函數(shù)之前需要經(jīng)過雙重RF濾波,這要求中控鎖的RF信號(hào)線上必須在較短的時(shí)間內(nèi)存在較多的符合寬度要求的RF信號(hào)位,否則就不會(huì)執(zhí)行ConfirmRkeWakeUp這個(gè)函數(shù);平時(shí)用機(jī)械鑰匙解鎖時(shí),雖然ISR中禁能了喚醒條件,但是由于不會(huì)執(zhí)行ConfirmRkeWakeUp,ISR回到循環(huán)體之后,系統(tǒng)依然會(huì)退出休眠。

          平時(shí)用遙控鑰匙解鎖時(shí),無論期間有沒有發(fā)生機(jī)械解鎖ISR,最終都會(huì)執(zhí)行ConfirmRkeWakeUp并退出休眠。

          所以,只有無效的遙控按鍵信號(hào)觸發(fā)執(zhí)行ConfirmRkeWakeUp函數(shù)時(shí)機(jī)械解鎖信號(hào)同時(shí)有效,才會(huì)觸發(fā)這種故障。

          汽車生產(chǎn)線上為什么測(cè)試出來這種故障了呢?

          那是因?yàn)樵谏a(chǎn)線上裝配了中控鎖的車太多了,產(chǎn)線后端的中控鎖模塊進(jìn)了休眠之后,用機(jī)械鑰匙喚醒時(shí)很容易被其它車的遙控鑰匙操作誤觸發(fā),導(dǎo)致循環(huán)體執(zhí)行到ConfirmRkeWakeUp上來。

          但是其它車的遙控鑰匙對(duì)于本車來說是無效的,所以,根據(jù)上面的原因,故障就出現(xiàn)了。

          結(jié)語

          定位了故障的原因之后,我不禁又洋洋得意起來,‘這么高級(jí)的bug都被我逮出來了!’。好似全然忘記了這個(gè)故障就是我自己埋下的坑。

          事后,領(lǐng)導(dǎo)讓我寫總結(jié)原因時(shí),我意識(shí)到了這種故障背后的深層次原因在于中斷和循環(huán)體的不登對(duì):中斷服務(wù)程序結(jié)束后必然回到主循環(huán)體中被中斷的位置;系統(tǒng)中,中斷可能發(fā)生在主循環(huán)體的任何位置;ISR和循環(huán)體程序之間不存在執(zhí)行時(shí)間的先后順序關(guān)系,先后次序不同可能導(dǎo)致不同的運(yùn)行結(jié)果;由于ISR發(fā)生時(shí)循環(huán)體可能會(huì)執(zhí)行到任何代碼位置上,如果代碼設(shè)計(jì)地不嚴(yán)謹(jǐn)就有可能會(huì)造成問題!

          煮熟的鴨子最終沒有飛走,領(lǐng)導(dǎo)又笑意盈盈地踱了過來,跟我討教故障的原因??粗潜患磳⒌绞值莫?jiǎng)金鼓舞地有些腫脹的胸膛,我一邊默默地念叨著‘狡兔死走狗烹,飛鳥盡良弓藏’,一邊悠悠地說了一句總結(jié)陳詞:中斷和主循環(huán)不登對(duì),系統(tǒng)會(huì)一直休眠久睡!



          關(guān)鍵詞: 中斷 嵌入式

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉