<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 裸奔的雙任務(wù)系統(tǒng)-嵌入式微系統(tǒng)連載之十一

          裸奔的雙任務(wù)系統(tǒng)-嵌入式微系統(tǒng)連載之十一

          作者: 時(shí)間:2014-10-01 來源:網(wǎng)絡(luò) 收藏

            2014年春節(jié)里的一天上午,msOS QQ群里面討論的很激烈,“傳說中的火槍手”認(rèn)為msOS-Mcu51已經(jīng)很好了,對于msOS-Stm32引入uC/OS-II意見比較大。雖然他也用過uC/OS-II,但并不喜歡,有一種不確定感,所以很喜歡裸奔。但他的觀點(diǎn)受到群內(nèi)不少用戶網(wǎng)友的反駁,以“獨(dú)釣千古愁”為代表,持續(xù)了將近半個(gè)多小時(shí),我一直在旁圍觀。

          本文引用地址:http://www.ex-cimer.com/article/263541.htm

            通過這次辯論,雙方都把各自的觀點(diǎn)表達(dá)的非常清晰、明了。有它的優(yōu)點(diǎn),但確實(shí)存在很明顯的缺點(diǎn),這個(gè)無可爭議,尤其是大家提出的幾個(gè)問題:

            1、 帶RTOS系統(tǒng),不便于移植,這個(gè)對msOS的跨硬件平臺推廣是很不利的。

            2、 嵌入式工程師,往往有強(qiáng)烈的掌控欲,而理解透徹RTOS有一定的難度,有一種把握不住的感覺而拒絕RTOS。

            3、 現(xiàn)實(shí)中絕大多數(shù)嵌入式項(xiàng)目,只要通過合理的設(shè)計(jì),不需要RTOS。

            4、 帶RTOS的系統(tǒng),在任務(wù)調(diào)度時(shí)進(jìn)入臨界態(tài),這個(gè)時(shí)候無法響應(yīng)中斷,不適合應(yīng)用于實(shí)時(shí)性要求高的地方。

            以上四個(gè)原因,讓我認(rèn)識到需要推出一個(gè)msOS的無RTOS版本,但還要實(shí)現(xiàn)類似RTOS的功能,把業(yè)務(wù)邏輯與菜單界面分離。在討論中,“傳說中的火槍手”有一句話提醒了我,他提到他自己有一套類似MS3(msOS的前身)的架構(gòu),他用了一個(gè)中斷處理各種消息,而這個(gè)時(shí)候,我也在想著如何改造uC/OS-II的任務(wù)切換軟中斷,實(shí)現(xiàn),思路完全一致,他的話說明了這個(gè)方案是可行的。

            后來的一段時(shí)間,忙著msOS文檔,進(jìn)一步完善msOS代碼,一直沒有著手寫。直到三月份才開始按照軟中斷方式,粗粗的寫了一個(gè)無OS的版本msOS,實(shí)現(xiàn)了這個(gè)功能,但因?yàn)楫?dāng)時(shí)對Stm32的中斷系統(tǒng)理解不深,所以放到群內(nèi)讓大家一起分析,尋找bug,這個(gè)時(shí)候,“獨(dú)釣千古愁”對無OS版本msOS提出了很多建議,并且直接在這個(gè)版本基礎(chǔ)上修改,完全的丟棄了匯編代碼,移植非常容易,其中部分處理方式引用了他跟“傳說中的火槍手”交流時(shí)提供的代碼。我再在“獨(dú)釣千古愁”提供的版本基礎(chǔ)上進(jìn)一步優(yōu)化,統(tǒng)一風(fēng)格,定型后在群內(nèi)發(fā)布,當(dāng)“傳說中的火槍手”看到最終版本,就覺得有他的影子存在。

            這個(gè)無OS版本的msOS,最終的命名是“Tomsu”起的,他參考軟件的命名習(xí)慣,因?yàn)檫@是一個(gè)無OS簡化版本,所以推薦為msOS-Lite版本,Lite的意思是“精簡”??梢哉f,msOS-Lite版本,是整個(gè)msOS群大家參與討論出來的,雖然有幾個(gè)相對重要的網(wǎng)友積極推動,但其它網(wǎng)友的貢獻(xiàn)是不能抹殺的,集體的力量是強(qiáng)大的。我對這個(gè)版本非常滿意,因?yàn)樗鼫?zhǔn)確的反應(yīng)了msOS理念:簡單、易用。

            無RTOS實(shí)現(xiàn)雙任務(wù),甚至多任務(wù),本質(zhì)上講跟RTOS方法類似的,只是RTOS是把一個(gè)main大循環(huán)斬成多個(gè)具有優(yōu)先級的小循環(huán),消息觸發(fā)決定在最高優(yōu)先級的小循環(huán)中執(zhí)行。因?yàn)槭切⊙h(huán),死循環(huán),一直循環(huán)下去,所以必須要有觸發(fā)進(jìn)入條件和等待資源掛起條件,否則這個(gè)小循環(huán)一直執(zhí)行下去,別的小循環(huán)就執(zhí)行不了了。

            無RTOS版本多任務(wù),把中斷看作是任務(wù),因?yàn)橹袛鄡?yōu)先級高于main大循環(huán),建立一個(gè)最低優(yōu)先級的,可以被消息觸發(fā)的軟中斷來實(shí)現(xiàn)任務(wù),但因?yàn)樵谥袛嘀?,所以建立的這個(gè)任務(wù)不是一個(gè)死循環(huán),而是執(zhí)行完畢就跳出的。而這一點(diǎn)恰好符合msOS的業(yè)務(wù)邏輯中的消息機(jī)制,執(zhí)行完消息就退出的特點(diǎn),不需要死循環(huán)等待在哪兒。

            多個(gè)中斷,就實(shí)現(xiàn)多個(gè)任務(wù),尤其是systick系統(tǒng)節(jié)拍中斷,有很多事務(wù)在系統(tǒng)節(jié)拍中例行處理,類似任務(wù),雖然這個(gè)任務(wù)不是嚴(yán)格意義上的,功能不強(qiáng)大,但夠我們用了,尤其是對msOS來說,只需要兩個(gè)任務(wù),恰好合適。

            為了跟uC/OS-II兼容,選擇了軟中斷PendSV,把優(yōu)先級設(shè)置為最低。

            

           

            其次,宏定義形式定義軟中斷PendSV的觸發(fā)指令,只要EnterInterrupt這個(gè)宏指令被調(diào)用,就激活PendSV中斷。這部分代碼“獨(dú)釣千古愁”和“傳說中的火槍手”提供的,寫的非常好,原來這部分在匯編中的,移到了C語言中,這樣子msOS-Lite就沒有了匯編代碼。

            

           

            再次,編寫PendSV的中斷響應(yīng)代碼,考慮到有多個(gè)消息源同時(shí)拋出消息,但響應(yīng)中斷只有一次,所以在中斷響應(yīng)中必須要把消息隊(duì)列中的消息處理完,否則會導(dǎo)致后續(xù)的消息因?yàn)橹袛啻饲氨徽加枚粫俅萎a(chǎn)生中斷標(biāo)記而無法重入的問題。這兒增加了CheckMessage函數(shù)來實(shí)現(xiàn)。

            

           

            最后,改寫拋出消息入隊(duì)列函數(shù),調(diào)用EnterInterrupt觸發(fā)PendSV中斷。

            

           

            至此,無RTOS的msOS-Lite版本完成,非常感謝msOS QQ群的所有網(wǎng)友的支持與合作



          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();