最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

使用RTOS做單片機(jī)開發(fā)有什么優(yōu)勢

2020-09-15 23:49 作者:奧大梨呀  | 我要投稿


????隨著單片機(jī)性能的提高,逐漸誕生了一些輕量級(jí)的操作系統(tǒng),可以在MCU上運(yùn)行,這樣的操作系統(tǒng)被稱為實(shí)時(shí)操作系統(tǒng)(Real Time Operating System),簡稱RTOS。盡管RTOS如此的輕巧(一些RTOS裁剪過后僅10幾KByte),但“麻雀雖小,五臟俱全”。操作系統(tǒng)所包含的基本元素RTOS都具備,比如任務(wù)調(diào)度、信號(hào)量、消息隊(duì)列等。那么在程序開發(fā)時(shí)使用RTOS有什么優(yōu)勢呢,就以筆者的親身經(jīng)歷來介紹吧。由于筆者接觸到的第一個(gè)RTOS是uCOS-III,常用的也是這款RTOS,因此本文主要以u(píng)COS-III為例子來介紹RTOS的優(yōu)勢。

????首先先簡述一下裸機(jī)的開發(fā)方式,一般情況下一個(gè)裸機(jī)程序通常分為兩個(gè)部分,一個(gè)大循環(huán)和若干個(gè)中斷服務(wù)程序,也稱為前后臺(tái)系統(tǒng),其中前臺(tái)指的是各種中斷所執(zhí)行的任務(wù),一般是設(shè)置一些標(biāo)志位。而后臺(tái)則是一個(gè)無限循環(huán),主要根據(jù)標(biāo)志位來執(zhí)行相關(guān)的任務(wù),以及管理系統(tǒng)的資源。

?

前后臺(tái)系統(tǒng)簡單模型

????在前后臺(tái)系統(tǒng)下,所有的任務(wù)的優(yōu)先級(jí)是平等的,且是以FIFO的方式排列。也就是說,后面的任務(wù)必須等待前面的任務(wù)都完成之后才可以執(zhí)行。在前后臺(tái)系統(tǒng)下,實(shí)時(shí)性非常差,而且隨著任務(wù)數(shù)量的增多,實(shí)時(shí)性會(huì)愈差。就好像我們上課時(shí)突然內(nèi)急(非常急),需要立刻去WC,但是卻不得不等到下課。這種情況下大概率會(huì)發(fā)生什么樣的事情相信大家應(yīng)該也猜得到吧。在程序上表現(xiàn)出來可能就是數(shù)據(jù)丟失,或者響應(yīng)慢(比如步進(jìn)電機(jī)過沖)等效果了。

????盡管也可以利用定時(shí)器等手段去手動(dòng)分配時(shí)間片來增強(qiáng)實(shí)時(shí)性,但這樣的方法容易造成程序的高度耦合,與程序開發(fā)的“高內(nèi)聚,低耦合”相悖,這樣的代碼肯定是很難管理和維護(hù)的。筆者在廠里修改一個(gè)別人寫的程序時(shí)(主要是添加功能),親切的體會(huì)到了這一點(diǎn)。 該代碼是一個(gè)非常標(biāo)準(zhǔn)的前后臺(tái)系統(tǒng),其中還利用定時(shí)器劃分了一些時(shí)間片來執(zhí)行相關(guān)任務(wù)??蓛H僅在main函數(shù)所在的C文件中就定義了十幾個(gè)flag標(biāo)志變量,筆者在讀代碼時(shí)也是花費(fèi)了不少功夫。再加上一些外設(shè)在大循環(huán)和定時(shí)器中斷中都有可能被訪問,協(xié)調(diào)不好就容易造成錯(cuò)誤。

????再說說RTOS。在RTOS下進(jìn)行程序開發(fā),每個(gè)任務(wù)都是獨(dú)立運(yùn)行的一個(gè)有限次或無限次循環(huán),一般情況下不會(huì)互相影響(除非棧溢出等因素),因而很容易管理和維護(hù)。每個(gè)任務(wù)都可以設(shè)置優(yōu)先級(jí),RTOS的內(nèi)核大多都是可搶占式的。高優(yōu)先級(jí)的任務(wù)一但就緒就可以奪走低優(yōu)先級(jí)任務(wù)的CPU使用權(quán),實(shí)時(shí)性相比于前后臺(tái)系統(tǒng)大幅度提高。而且RTOS會(huì)提供一些內(nèi)核對(duì)象供用戶使用,比如信號(hào)量,常用作任務(wù)同步和共享資源保護(hù)等。

搶占式內(nèi)核任務(wù)調(diào)度模型

?

下圖就是一個(gè)在uCOS-III操作系統(tǒng)下讓LED以500ms的周期閃爍的任務(wù)。

?

LED閃爍任務(wù)

????當(dāng)然,RTOS還包含任務(wù)休眠的機(jī)制,比如當(dāng)一個(gè)任務(wù)需要等待某個(gè)發(fā)生頻率不高的事件時(shí)(如按鍵按下,或者延時(shí)一段時(shí)間),就可以令這個(gè)任務(wù)暫時(shí)休眠,休眠的任務(wù)不會(huì)再占用CPU的時(shí)間,待事件發(fā)生時(shí)(按鍵按下,或者延時(shí)時(shí)間到),將這個(gè)任務(wù)喚醒即可。不需要像前后臺(tái)系統(tǒng)那樣,需要不斷地查詢標(biāo)志位。

下圖就是利用任務(wù)內(nèi)建消息隊(duì)列和休眠機(jī)制來進(jìn)行任務(wù)間通信的例子。

?

任務(wù)內(nèi)建消息隊(duì)列實(shí)現(xiàn)任務(wù)間通信

????如果利用操作系統(tǒng)中的進(jìn)程和線程的概念來類比RTOS,那么整個(gè)程序可以看成一個(gè)進(jìn)程,每個(gè)任務(wù)可以看成是線程。因?yàn)檎麄€(gè)程序包含且管理所有的系統(tǒng)資源,而每個(gè)任務(wù)僅包含自己的??臻g,共享系統(tǒng)資源,CPU在任務(wù)之間進(jìn)行調(diào)度。這不正是符合進(jìn)程和線程的概念嗎。因此在RTOS中,任務(wù)也被稱為線程。

????再用信號(hào)量舉兩個(gè)例子。信號(hào)量做任務(wù)同步就好比泡咖啡,首先肯定要燒水,泡咖啡肯定是需要等待水燒開才可以進(jìn)行,因此在水沒燒開之前。泡咖啡可以暫時(shí)放著不管,對(duì)應(yīng)的就是請(qǐng)求信號(hào)量(請(qǐng)求一杯泡咖啡用的開水),請(qǐng)求不到而暫時(shí)休眠任務(wù)。當(dāng)水燒開時(shí),水壺開關(guān)斷開,我們聽到開關(guān)斷開的聲音后,就會(huì)拿開水去泡咖啡,對(duì)應(yīng)的就是釋放一個(gè)信號(hào)量(把一杯開水拿過來),然后操作系統(tǒng)會(huì)喚醒先前休眠的任務(wù)(泡咖啡),在沒有其他更高優(yōu)先級(jí)任務(wù)的時(shí)候,就會(huì)執(zhí)行這個(gè)任務(wù)(泡咖啡)。這樣就實(shí)現(xiàn)了一個(gè)任務(wù)之間同步的效果。

????而共享資源的保護(hù)就好比一個(gè)公廁,每次只能進(jìn)去一個(gè)或若干個(gè)人,進(jìn)去的人會(huì)將門鎖上,對(duì)應(yīng)的就是請(qǐng)求信號(hào)量,當(dāng)公廁人滿了之后,后面的人肯定就不能進(jìn)去了,對(duì)應(yīng)的就是其他任務(wù)請(qǐng)求不到信號(hào)量。那么外面的人就需要等待有人出來才能進(jìn)去,對(duì)應(yīng)的就是正在使用共享資源的任務(wù)釋放信號(hào)量(廁所里的人開門出來)。這樣也就實(shí)現(xiàn)了對(duì)共享資源的保護(hù)了。

????我們現(xiàn)在再從RTOS的角度看剛才筆者所說的例子。如果采用RTOS,那么只需要?jiǎng)?chuàng)建若干個(gè)任務(wù),任務(wù)之間使用消息隊(duì)列進(jìn)行通信或者信號(hào)量同步,使用信號(hào)量或者互斥鎖對(duì)共享資源進(jìn)行保護(hù),再設(shè)置每個(gè)任務(wù)的優(yōu)先級(jí),讓重要且緊急的任務(wù)可以第一時(shí)間得到執(zhí)行。這么看來,明顯降低了程序的耦合性,程序就好管理多了。而且后期添加功能也很方便,只需要再創(chuàng)建任務(wù)即可。

????當(dāng)然,RTOS的優(yōu)勢還不止如此,筆者如今做MCU項(xiàng)目時(shí)基本上都采用RTOS進(jìn)行程序開發(fā)。在能夠熟練使用RTOS提供的內(nèi)核對(duì)象進(jìn)行程序開發(fā)后,你會(huì)發(fā)現(xiàn),其實(shí)采用RTOS開發(fā)的難度會(huì)遠(yuǎn)低于裸機(jī)開發(fā),隨著項(xiàng)目復(fù)雜度的提高,RTOS帶來的優(yōu)勢將會(huì)更明顯。

????在現(xiàn)在這個(gè)時(shí)代,一個(gè)合格的單片機(jī)工程師通常都要求至少需要掌握一款RTOS。畢竟,這是單片機(jī)開發(fā)的發(fā)展趨勢。而且根據(jù)筆者的學(xué)習(xí)經(jīng)驗(yàn),掌握RTOS的相關(guān)知識(shí)對(duì)往后學(xué)習(xí)Linux開發(fā)(驅(qū)動(dòng)或應(yīng)用)有著非常大的幫助,在學(xué)習(xí)Linux開發(fā)時(shí)會(huì)感覺到非常親切,容易上手而且更有學(xué)習(xí)動(dòng)力。

????當(dāng)然也不是非得使用RTOS不可,一切均要視具體項(xiàng)目而定。筆者這里只是說明了RTOS相比裸機(jī)開發(fā)的一些優(yōu)勢。

????以上內(nèi)容為筆者個(gè)人拙見,若有不合理之處還請(qǐng)批評(píng)指正。


使用RTOS做單片機(jī)開發(fā)有什么優(yōu)勢的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
偃师市| 沙田区| 天长市| 华宁县| 平南县| 麦盖提县| 石柱| 安岳县| 吕梁市| 伊通| 鹤壁市| 临洮县| 永年县| 黔西| 湖州市| 渭南市| 石柱| 宁河县| 元朗区| 阳东县| 石家庄市| 青阳县| 松阳县| 东乡族自治县| 浏阳市| 石嘴山市| 六盘水市| 乐安县| 泾源县| 高清| 遂川县| 行唐县| 盖州市| 盐城市| 陇南市| 固安县| 无为县| 兴宁市| 吉木乃县| 丽水市| 舟曲县|