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