頻繁中斷狂轟亂炸,操作系統(tǒng)很難招架
3
本文引用地址:http://m.butianyuan.cn/article/201812/396004.htm春困秋乏夏打盹,睡不醒的冬三月。灑家一面克制著午飯后不斷襲來的陣陣睡意,一面添加著遙控接收程序,不過是從裸機(jī)下挪到操作系統(tǒng)的框架下,應(yīng)該問題不大。筆者復(fù)制、粘貼、修改,一頓操作猛如虎,掃視一番信心鼓,便開始志得意滿地調(diào)試起來。
按了一下遙控器,嗯?仿真器怎么好像和電腦斷開連接了?哎,天殺的windows!肯定是windows恰好把仿真器的驅(qū)動(dòng)程序給搞死了。筆者重新把仿真器插拔了一番,繼續(xù)下載程序、運(yùn)行、調(diào)試。按下遙控器,嗯?沒反應(yīng),把程序停下來,嗯?停不下來!不死心地重啟了電腦,重新來過,原來,確乎是一按遙控器就貌似死了機(jī)了。
一絲陰影從灑家心頭掠過,盤旋在腦中的困意也一瞬間消失的無影無蹤。不消說,碰上事了!
夏天,最是一個(gè)容易上火焦躁的時(shí)節(jié),在烈日的威逼下,干渴的大地冒著騰騰的熱氣,不住地?zé)o聲喘息。白楊樹兀自矗立在似火的驕陽里,慢慢扇動(dòng)著被曬得快要冒煙的綠葉,顯出一副無精打采的樣子。知了不停地求饒,可是熾熱的太陽全然不聽它的禱告。鳥兒忍受著饑腸轆轆,也不愿意出來覓食。頂著日頭匆匆趕路的俊男靚女們,揮汗如雨,被汗水一遍遍刷過的臉上早已沒有了香水的氣息。
時(shí)間不多了,快要提交樣機(jī)了,卻碰上這等大問題,盡管身處空調(diào)房,灑家依然心中發(fā)涼,倍感不爽。
4
灑家揉了揉已然刻上了幾條皺紋的額頭,站起身,茫然環(huán)顧,有的同事正在熱火朝天地打游戲,有的同事看著小說,有的同事叉著腰、扎煞著胳膊,嘮著閑嗑,看我站起身來,隨即送來帶著笑意的目光。哎,多么和諧的場(chǎng)景?。?/p>
佛家有謂,因果不欺,自作自受,白話就是,誰的福誰享,誰的罪誰受。他們玩他們的,灑家干灑家的!
那么,好端端的,程序怎么就死了機(jī)呢?看調(diào)試器的反應(yīng),倒像是跑不動(dòng)了一樣,既如此,統(tǒng)計(jì)一下系統(tǒng)負(fù)載率吧,ucos正好提供了這項(xiàng)功能。
果不其然,一按遙控器,系統(tǒng)負(fù)載率就蹭蹭蹭地摸高到了100%,屢試不爽,本來系統(tǒng)負(fù)載率在百分之二三十之間,只要按下遙控,系統(tǒng)立馬死給你看。
筆者工作多年,身經(jīng)百戰(zhàn),掰著腳趾頭掐指一算,肯定是遙控接收中斷太頻繁了,導(dǎo)致ucos把大量的時(shí)間用在系統(tǒng)調(diào)度上,以至于根本就沒有了空閑時(shí)間,為何如此,且聽灑家娓娓道來。
系統(tǒng)被ucos劃分成多個(gè)任務(wù),這些任務(wù)平時(shí)處于“等待”某些信號(hào)的狀態(tài),信號(hào)一來,便進(jìn)入“就緒”狀態(tài),倘若沒有更高優(yōu)先級(jí)的任務(wù),處于就緒態(tài)的任務(wù)就得到了MCU的計(jì)算資源,進(jìn)入任務(wù)執(zhí)行程序,執(zhí)行完后,便再次回到等待狀態(tài)。倘若來了中斷,ucos便中斷當(dāng)前任務(wù),存儲(chǔ)系統(tǒng)上下文、任務(wù)上下文,執(zhí)行中斷服務(wù)程序,然后判斷是否存在被中斷服務(wù)程序推入就緒態(tài)、優(yōu)先級(jí)高于被中斷任務(wù)的任務(wù),如果有,進(jìn)入新任務(wù),如果沒有,恢復(fù)被中斷任務(wù)的上下文繼續(xù)執(zhí)行。
ucos本來在系統(tǒng)的各個(gè)任務(wù)之間調(diào)度得好好的,偶爾來了個(gè)中斷,就存一下任務(wù)上下文,執(zhí)行以下上文所述的操作,只要中斷次數(shù)有限,系統(tǒng)還是可以正常穩(wěn)定運(yùn)行的。可是,一旦中斷非常頻繁,以至于中斷時(shí)間間隔和ucos存儲(chǔ)任務(wù)上下文、執(zhí)行中斷服務(wù)程序、恢復(fù)任務(wù)上下文的時(shí)間很接近的話,顯然,ucos就基本上干不了有用的事情了,它會(huì)把幾乎所有時(shí)間消耗在存儲(chǔ)、恢復(fù)任務(wù)上下文這些“輔助性”的操作上。
遙控報(bào)文是一連串射頻信號(hào),每個(gè)上升沿都會(huì)觸發(fā)中斷,對(duì)于ucos和所選用MCU的主頻來說,遙控報(bào)文的頻繁中斷簡(jiǎn)直就是狂轟亂炸,搞得操作系統(tǒng)很難招架。
5
行文至此,腦力敏捷的讀者可能會(huì)搶答說,既然如此,那就不用ucos了,解決方法很簡(jiǎn)單,把操作系統(tǒng)去掉,再換成裸機(jī)形式不就可以了嗎?
對(duì)此,我只想套用一下《賣拐》里本山大叔對(duì)腦袋大、脖子粗的伙夫范偉的一句評(píng)語:恭喜你,都會(huì)搶答了!
我們都聽說過一個(gè)大致類似的典故,說有一個(gè)家伙想學(xué)鋼琴,打聽學(xué)費(fèi)幾何,老師問清楚這個(gè)家伙有一點(diǎn)基礎(chǔ)之后,就故作高深地說,如果沒學(xué)過,學(xué)費(fèi)1萬,如果學(xué)過,學(xué)費(fèi)2萬。不等學(xué)員把詫異的眼睛睜圓,老師悠悠地自問自答,為什么需要多交費(fèi)?原因無他,只是需要多花時(shí)間把你的錯(cuò)誤習(xí)慣改過來而已。
筆者在ucos的框架下已經(jīng)寫了那么多程序,你提議讓我去掉ucos,然后改寫那些依賴于ucos的任務(wù)、信號(hào)、消息機(jī)制的諸多代碼?時(shí)日無多,徒奈其何,哪里有那么多的時(shí)間呢?最好是不僅能去掉ucos,把ucos切割開,同時(shí)盡量把其它相關(guān)代碼的修改量降到最低,不改那些依賴它的任務(wù)、信號(hào)機(jī)制的代碼!
“怎么辦?最簡(jiǎn)單也最困難,飯要粒粒分開,還要沾著蛋,嘿,蛋炒飯。”
評(píng)論