第二章 RTOS基礎(chǔ)知識
2.1什么是RTOS?
打個比方,若是單片機不跑RTOS,用主循環(huán)+中斷處理程序完成功能(前后臺系統(tǒng)),就好比老板一人開了一家公司,老板一人負責“研發(fā)”、“銷售”、“售后”三種工作(任務(wù))。比如老板正在搞研發(fā),突然來客戶了,老板就要暫停研發(fā)轉(zhuǎn)而去搞“銷售”,銷售完后再回來繼續(xù)研發(fā)(把銷售看成一種中斷)。那比如客戶買的產(chǎn)品出了問題,那老板得暫停研發(fā)去做售后(售后是另一種中斷)。問題就出來了,老板一個人始終無法同時顧及研發(fā)、銷售、售后三個工作,導(dǎo)致公司運營不佳。這里讀者們想到了,可以多顧幾名員工啊?說對了,單片機跑RTOS就是相當于開公司多了很多員工。RTOS就是一個可以將單片機擴展成多個“相對獨立小任務(wù)”的平臺,老板可以顧3名員工,讓3個員工分別負責“研發(fā)”、“銷售”、“售后”三個工作,老板的工作就是負責將3名員工各自的任務(wù)分配好即可。
各個“相對獨立小任務(wù)”宏觀上來看是同時執(zhí)行的,這是RTOS一個顯著特點,可能有人要問“只有一個CPU,怎么能做到同時執(zhí)行多個代碼呢?”巧妙之處就在這里,RTOS在微觀上是在各個“相對獨立小任務(wù)”之間快速切換的,切換速度快到宏觀上感覺小任務(wù)是同時運行的。這個“切換速度”,就是RTOS里邊所說的系統(tǒng)節(jié)拍。
怎么理解“相對獨立小任務(wù)”中“獨立”二字呢?獨立的意思就是各個小任務(wù)之間的執(zhí)行過程是相對獨立的,互不干擾。3名員工的工作是各不相同的,各執(zhí)其責的。但為何要“相對獨立”呢?比方搞研發(fā)的員工沒有開發(fā)出產(chǎn)品,那么銷售就沒東西可賣,售后也相應(yīng)沒事兒做了,要想整體運行正確,則各個任務(wù)必須協(xié)調(diào)好,互相匯報進度。這就是RTOS中的任務(wù)間通信概念。
這三名員工的工作其實是有輕重緩急之分的。前期搞研發(fā)的優(yōu)先級最高,搞出產(chǎn)品后銷售就是主角了,銷售完后呢?售后就要做的更好。要想經(jīng)營好整個公司,老板就要決定哪個員工何時該抓點緊,哪個員工工作可以放慢些,總也有個任務(wù)分配策略。這個分配策略,就是RTOS中的調(diào)度算法。
相信讀者對RTOS有個簡單的概念了吧。RTOS從功能上是將單片機單一的執(zhí)行結(jié)構(gòu)擴展成了多個“相對獨立小任務(wù)”。從開發(fā)角度上由原來的“主循環(huán)+中斷處理程序”思想擴展成了“編寫N個執(zhí)行任務(wù)”思想。為我們開發(fā)復(fù)雜多任務(wù)程序提供了便利。
2.2 RTOS的優(yōu)點與缺點
2.2.1 RTOS優(yōu)點
1.提高開發(fā)效率
RTOS使單片機開發(fā)多任務(wù)程序變得簡單直觀,用戶只關(guān)心任務(wù)分配即可,比如我們要做一個電子時鐘的程序,完全可以把“數(shù)碼管刷新”、“秒計時”、“按鍵檢測“、”調(diào)節(jié)時間程序”分為4個任務(wù),這樣程序會編寫容易而且維護方便。
2.運行效率高
我們平時編程用到延時是很常見的,在RTOS里面延時OS_Delay()和普通程序的Delay()是完全不一樣的。普通的程序延時僅僅是CPU執(zhí)行循環(huán)代碼,是不是感覺做了很多無用功?在RTOS里邊,延時其實是主動將CPU讓給其他任務(wù)代碼,等到延時時間一到,再將CPU“拽”回來。
3.移植方便
各種平臺之間程序大體風格是不變的,得益于RTOS的標準框架,使得程序整體代碼風格趨于一致化,這將使程序移植變得簡單可靠。
2.2.2 RTOS缺點
1.需要占用額外的資源
單片機使用RTOS,由于要在各個任務(wù)代碼之間進行快速切換,以達到“同時”運行的目的,執(zhí)行調(diào)度函數(shù)最增加CPU負荷。
2.使單片機中斷響應(yīng)變差
一般微型RTOS在切換任務(wù)時候需要關(guān)閉系統(tǒng)總中斷,否則會錯誤的操作堆棧,這段時間是不響應(yīng)任何中斷的。從而使單片機在中斷響應(yīng)上要慢一些。
2.3單片機跑RTOS有必要嗎?
這估計是愛好者們爭論最多的了,既然看到了RTOS的利與弊,我們應(yīng)當正確對待RTOS在單片機開發(fā)中的位置。
因為RTOS需要單片機提供額外的RAM ROM運行,并且會增加一些CPU負荷,如果一個單片機在項目上有很大余量,那么可以選擇使用RTOS來做。如果單片機本身資源就很緊張,那就得不償失了,不僅RTOS跑不起來,連基本功能代碼都放不下了。
本文要在51上寫一個小型RTOS,主要為了學(xué)習RTOS原理用,以后讀者從51編程轉(zhuǎn)ARM學(xué)習會容易很多。筆者曾將該RTOS移植在AVR和STM8上,占用200B ram 1KB rom,運行良好。
2.4 RTOS的一些基本概念
2.4.1 任務(wù)(TASK)
任務(wù)(Task)是RTOS中最重要的操作對象,每個任務(wù)在RTOS調(diào)用下由CPU分時運行。
2.4.2 調(diào)度(Sched)
調(diào)度是RTOS的核心,調(diào)度就是RTOS使CPU在各個任務(wù)之間進行切換,達到宏觀上同時執(zhí)行的效果,調(diào)度也稱為“上下文切換”。
2.4.3 搶占和協(xié)作
在21ic上有一個經(jīng)典例子比喻,“你(小工)在用廁所,經(jīng)理在外面排第一,老板在外面排第二。如果是前后臺,不管是誰,都必須按排隊的次序使用廁所;如果是協(xié)作式,那么可以等你用完廁所,老板就要比經(jīng)理先進入;如果是占先式,只要有更高級的人在外面等,那么廁所里無論是誰,都要第一時間讓出來,讓最高級別的人先用!
2.4.4 系統(tǒng)節(jié)拍
RTOS調(diào)度時候是一直在各個TASK之間切換的,切換的快慢就是系統(tǒng)節(jié)拍,如果系統(tǒng)節(jié)拍是100Hz,那么每秒TASK會被RTOS切換100次(不算主動切換次數(shù))。
2.4.5 中斷級調(diào)度和任務(wù)級調(diào)度
中斷級調(diào)度就是由系統(tǒng)節(jié)拍引起的被動的調(diào)度,在當前執(zhí)行任務(wù)即使還未釋放CPU時也會發(fā)生的。任務(wù)級調(diào)度是任務(wù)主動去釋放CPU而發(fā)生的調(diào)度。
2.4.6 任務(wù)堆棧
每個任務(wù)(TASK)執(zhí)行都有自己的一個任務(wù)堆棧,存放著自己的入口,各個寄存器值、中間執(zhí)行結(jié)果等。各個任務(wù)的任務(wù)環(huán)境都是獨立私有的,互不干擾。比如TASK1有自己的堆棧Task1Stack[20],TASK2有自己的堆棧Task2Stack[20],兩個堆棧內(nèi)容是不一樣的。
RTOS基本術(shù)語還有很多,就不一一羅列了,筆者盡量用簡練的語言來讓讀者學(xué)會單片機RTOS的概念,爭取也寫出自己的RTOS。