實(shí)時(shí)系統(tǒng)介紹
實(shí)時(shí)系統(tǒng)有各種各樣的實(shí)現(xiàn)方式和使用情況。本書(shū)的重點(diǎn)是如何使用實(shí)時(shí)操作系統(tǒng)(RTOS)在微控制器單元(MCU)上創(chuàng)建實(shí)時(shí)應(yīng)用程序。
在這一章中,我們將首先概述什么是RTOS,并了解可能有實(shí)時(shí)要求的廣泛系統(tǒng)。從那里,我們將看看實(shí)現(xiàn)實(shí)時(shí)性能的一些不同方法,以及可能使用的系統(tǒng)類(lèi)型(如硬件、固件和軟件)的概述。最后,我們將討論什么時(shí)候在MCU應(yīng)用中使用RTOS是明智的,什么時(shí)候可能完全沒(méi)有必要。
到底什么是實(shí)時(shí)性?
任何對(duì)特定事件有確定響應(yīng)的系統(tǒng)都可以被認(rèn)為是 "實(shí)時(shí) "的。如果一個(gè)系統(tǒng)在不符合時(shí)間要求時(shí)被認(rèn)為是失敗的,它一定是實(shí)時(shí)的。如何定義故障(以及故障系統(tǒng)的后果)可以有很大不同。認(rèn)識(shí)到實(shí)時(shí)性要求可以有很大的不同,這一點(diǎn)極其重要,既包括時(shí)間要求的速度,也包括如果沒(méi)有達(dá)到所要求的實(shí)時(shí)期限,后果的嚴(yán)重性。
時(shí)序要求的范圍
為了說(shuō)明可能遇到的定時(shí)要求的范圍,讓我們考慮從模數(shù)轉(zhuǎn)換器(ADC analog-to-digital converters)獲取讀數(shù)的幾個(gè)不同系統(tǒng)。
我們要看的第一個(gè)系統(tǒng)是一個(gè)控制系統(tǒng),它被設(shè)置為控制烙鐵的溫度(如下圖所示)。我們所關(guān)注的系統(tǒng)部分是MCU、ADC、傳感器和加熱器。
MCU負(fù)責(zé)以下工作:
- 通過(guò)ADC從溫度傳感器獲取讀數(shù)
- 運(yùn)行閉環(huán)控制算法(以保持烙鐵頭的溫度恒定)。
- 根據(jù)需要調(diào)整加熱器的輸出
由于焊頭的溫度變化不是非???,MCU可能只需要每秒獲取50個(gè)ADC樣本(50Hz)。負(fù)責(zé)調(diào)整加熱器的控制算法(以保持恒定的溫度)以更慢的速度運(yùn)行,5赫茲:
ADC將斷言硬件線(xiàn)路,表示轉(zhuǎn)換已經(jīng)完成,并準(zhǔn)備讓MCU將讀數(shù)轉(zhuǎn)移到其內(nèi)部存儲(chǔ)器。讀取ADC的MCU有多達(dá)20毫秒的時(shí)間將數(shù)據(jù)從ADC傳輸?shù)絻?nèi)部存儲(chǔ)器,然后才需要進(jìn)行新的讀取。MCU還需要運(yùn)行控制算法來(lái)計(jì)算加熱器輸出的更新值,頻率為5赫茲(200毫秒)。這兩種情況(雖然不是特別快)都是實(shí)時(shí)要求的例子:
現(xiàn)在,在ADC讀數(shù)的另一端,我們可能有高帶寬的網(wǎng)絡(luò)分析儀或示波器,它將以幾十GHz的速率讀取ADC!在這種情況下,ADC的原始讀數(shù)很可能是在幾百個(gè)小時(shí)內(nèi)完成!原始ADC讀數(shù)可能會(huì)被轉(zhuǎn)換成頻域,并在高分辨率前面板上以圖形方式顯示,每秒幾十次。像這樣的系統(tǒng)需要進(jìn)行大量的處理,必須遵守極其嚴(yán)格的時(shí)間要求,如果它要正常運(yùn)作的話(huà)。
在光譜的中間位置,你會(huì)發(fā)現(xiàn)諸如閉環(huán)運(yùn)動(dòng)控制器等系統(tǒng),它們通常需要在數(shù)百赫茲至數(shù)十千赫茲之間執(zhí)行其PID控制回路,以便在快速移動(dòng)的系統(tǒng)中提供穩(wěn)定性。那么,實(shí)時(shí)性有多快?嗯,僅從ADC的例子就可以看出,這取決于。
在前面的一些例子中,如示波器或電烙鐵,如果不能滿(mǎn)足計(jì)時(shí)要求,就會(huì)導(dǎo)致性能不佳或報(bào)告錯(cuò)誤的數(shù)據(jù)。在電烙鐵的情況下,這可能是溫度控制不佳(這可能導(dǎo)致組件損壞)。對(duì)于測(cè)試設(shè)備來(lái)說(shuō),錯(cuò)過(guò)最后期限可能導(dǎo)致錯(cuò)誤的讀數(shù),這就是失敗。這對(duì)一些人來(lái)說(shuō)可能不是什么大問(wèn)題,但對(duì)該設(shè)備的用戶(hù)來(lái)說(shuō),他們依賴(lài)所報(bào)告數(shù)據(jù)的準(zhǔn)確性,這可能是非常重要的。一些用于標(biāo)準(zhǔn)驗(yàn)證的實(shí)驗(yàn)室設(shè)備對(duì)產(chǎn)品的一致性進(jìn)行檢查。如果設(shè)備中存在未被發(fā)現(xiàn)的故障,導(dǎo)致測(cè)量不準(zhǔn)確,就可能報(bào)告出不正確的數(shù)值??赡苡锌赡苤匦逻M(jìn)行可疑的測(cè)試。然而,最終,如果重新測(cè)試的頻率過(guò)高,可靠的讀數(shù)不能指望,那么測(cè)試設(shè)備將開(kāi)始變得可疑,并被視為不可靠,銷(xiāo)售將下降--所有這些都是因?yàn)橐粋€(gè)實(shí)時(shí)要求沒(méi)有得到持續(xù)滿(mǎn)足。
在其他系統(tǒng)中,如無(wú)人機(jī)的飛行控制或工業(yè)過(guò)程控制中的運(yùn)動(dòng)控制,如果不能及時(shí)運(yùn)行控制算法,可能會(huì)導(dǎo)致更多的物理災(zāi)難,如崩潰。在這種情況下,其后果有可能危及生命。
值得慶幸的是,可以采取一些措施來(lái)避免所有這些故障情況的發(fā)生。
保證實(shí)時(shí)行為的方法
確保一個(gè)系統(tǒng)做它要做的事情的最簡(jiǎn)單的方法之一是確保它在滿(mǎn)足要求的同時(shí)盡可能的簡(jiǎn)單。這意味著要抵制將簡(jiǎn)單的任務(wù)過(guò)度復(fù)雜化的沖動(dòng)。如果烤面包機(jī)是用來(lái)烤面包的,就不要在上面加一個(gè)顯示屏,讓它也告訴你天氣情況;只要讓它在適當(dāng)?shù)臅r(shí)間內(nèi)打開(kāi)加熱元件即可。這個(gè)簡(jiǎn)單的任務(wù)已經(jīng)完成了多年,不需要任何代碼或可編程設(shè)備。
作為程序員,如果我們遇到一個(gè)問(wèn)題,我們傾向于立即伸手去拿最近的MCU并開(kāi)始編碼。然而,產(chǎn)品的一些功能(尤其是當(dāng)產(chǎn)品有電子機(jī)械部件時(shí))最好不用代碼來(lái)處理。車(chē)窗其實(shí)不需要帶輪詢(xún)循環(huán)的MCU來(lái)運(yùn)行,通過(guò)驅(qū)動(dòng)器打開(kāi)電機(jī),觀察傳感器的反饋來(lái)關(guān)閉它們。這項(xiàng)任務(wù)實(shí)際上可以由一些機(jī)械開(kāi)關(guān)和二極管來(lái)處理。如果給定的系統(tǒng)需要一個(gè)反饋報(bào)告機(jī)制--比如在窗口卡住的情況下需要斷言錯(cuò)誤--那么可能別無(wú)選擇,只能使用一個(gè)更復(fù)雜的解決方案。然而,作為工程師,我們的目標(biāo)應(yīng)該始終是相同的--盡可能簡(jiǎn)單地解決問(wèn)題,不增加額外的復(fù)雜性。
如果一個(gè)問(wèn)題可以單獨(dú)通過(guò)硬件來(lái)解決,那么在拿出MCU之前,先與團(tuán)隊(duì)一起探討這種可能性。如果問(wèn)題可以通過(guò)使用簡(jiǎn)單的while循環(huán)來(lái)執(zhí)行一些傳感器狀態(tài)的輪詢(xún)來(lái)處理,那么就簡(jiǎn)單地輪詢(xún)傳感器的狀態(tài);可能沒(méi)有必要開(kāi)始編碼中斷服務(wù)程序(ISRs)。如果設(shè)備的功能是單一用途的,那么在很多情況下,完整的實(shí)時(shí)操作系統(tǒng)可能會(huì)妨礙工作--所以不要使用它!
實(shí)時(shí)系統(tǒng)的類(lèi)型
有許多不同的方法來(lái)實(shí)現(xiàn)實(shí)時(shí)行為。下面的部分是關(guān)于你可能遇到的各種類(lèi)型的實(shí)時(shí)系統(tǒng)的討論。還要注意的是,有可能出現(xiàn)以下系統(tǒng)的組合,作為子系統(tǒng)一起工作。這些不同的子系統(tǒng)可以出現(xiàn)在產(chǎn)品、板卡、甚至是芯片層面(這種方法在第16章多處理器和多核系統(tǒng)中討論)
硬件
最初的實(shí)時(shí)系統(tǒng),即硬件,仍然是滿(mǎn)足極其嚴(yán)格的公差和/或快速定時(shí)要求的首選。它可以用離散數(shù)字邏輯、模擬組件、可編程邏輯或特定應(yīng)用集成組件(ASIC application-specific integrated component)來(lái)實(shí)現(xiàn)??删幊踢壿嬈骷≒LD Programmable logic devices)、復(fù)雜可編程邏輯器件(CPLD complex programmable logic devices)和域可編程門(mén)陣列(FPGA field-programmable gate arrays)是該解決方案中可編程邏輯器件部分的不同成員?;谟布膶?shí)時(shí)系統(tǒng)可以涵蓋從模擬濾波器、閉環(huán)控制和簡(jiǎn)單的狀態(tài)機(jī)到復(fù)雜的視頻編解碼器的任何東西。當(dāng)實(shí)施時(shí)考慮到省電,可以使ASIC比基于MCU的解決方案消耗更少的功率。一般來(lái)說(shuō),硬件的優(yōu)點(diǎn)是可以即時(shí)并行地進(jìn)行操作(當(dāng)然,這是過(guò)度簡(jiǎn)化),而單核MCU則只能給人以并行處理的假象。
實(shí)時(shí)硬件開(kāi)發(fā)的缺點(diǎn)一般包括以下幾點(diǎn):
- 非可編程設(shè)備的不靈活性。
- 所需的專(zhuān)業(yè)技術(shù)通常不如軟件/固件開(kāi)發(fā)人員那么普遍。
- 全功能可編程器件的成本(例如,大型FPGA)。
- 開(kāi)發(fā)定制ASIC的高成本。
裸機(jī)固件
裸機(jī)固件被認(rèn)為是(為我們的目的)不是建立在某種類(lèi)型的預(yù)先存在的內(nèi)核/調(diào)度器之上的任何固件。一些工程師更進(jìn)一步,認(rèn)為真正的裸機(jī)固件不能使用任何預(yù)先存在的庫(kù)(如供應(yīng)商提供的硬件抽象庫(kù)),這種觀點(diǎn)也有一定的道理。裸機(jī)實(shí)現(xiàn)的好處是,用戶(hù)的代碼可以完全控制硬件的所有方面。主循環(huán)代碼執(zhí)行被打斷的唯一方法是中斷發(fā)生時(shí)。在這種情況下,其他東西控制CPU的唯一方法是讓現(xiàn)有的ISR完成,或讓另一個(gè)更優(yōu)先的中斷啟動(dòng)。
當(dāng)有少量相對(duì)簡(jiǎn)單的任務(wù)需要執(zhí)行時(shí),或者有單一的任務(wù)時(shí),裸機(jī)固件解決方案就很出色。如果固件保持專(zhuān)注并遵循最佳實(shí)踐,由于ISR(或在某些情況下,缺乏ISR)之間的相互作用相對(duì)較少,確定的性能通常容易測(cè)量和保證。在一些極端的情況下,對(duì)于高負(fù)載的MCU(或在ROM/RAM方面受到高度限制的MCU),裸機(jī)是唯一的選擇。
隨著裸機(jī)實(shí)現(xiàn)在異步處理事件時(shí)變得更加復(fù)雜,它們開(kāi)始與實(shí)時(shí)操作系統(tǒng)提供的功能重疊。要記住的一個(gè)重要考慮是,通過(guò)使用RTOS--而不是試圖推出你自己的線(xiàn)程安全系統(tǒng)--你會(huì)自動(dòng)受益于RTOS供應(yīng)商所做的所有測(cè)試。你也有機(jī)會(huì)使用具有事后分析能力的代碼--今天所有的RTOS都已經(jīng)存在了好幾年了。作者一直在調(diào)整和增加功能,以使它們?cè)诓煌膽?yīng)用中變得強(qiáng)大和靈活。
基于RTOS的固件
在MCU上運(yùn)行調(diào)度內(nèi)核的固件是基于RTOS的固件。調(diào)度器和一些RTOS原件的引入允許任務(wù)在它們自己擁有處理器的假象下運(yùn)行(在第2章,了解RTOS任務(wù)中詳細(xì)討論)。使用RTOS可以使系統(tǒng)在后臺(tái)執(zhí)行其他復(fù)雜任務(wù)的同時(shí)保持對(duì)最重要事件的響應(yīng)。
所有這些任務(wù)的運(yùn)行都有一些弊端。共享數(shù)據(jù)的任務(wù)之間可能會(huì)出現(xiàn)相互依賴(lài)的情況--如果處理不當(dāng),這種依賴(lài)性會(huì)導(dǎo)致任務(wù)意外地阻塞。雖然有處理這種情況的規(guī)定,但它確實(shí)增加了代碼的復(fù)雜性。中斷一般會(huì)使用任務(wù)信令來(lái)盡快處理中斷,并將盡可能多的處理推遲到任務(wù)中。如果處理得當(dāng),這種解決方案對(duì)于保持復(fù)雜系統(tǒng)的響應(yīng)是非常好的,盡管有許多復(fù)雜的互動(dòng)。然而,如果處理不當(dāng),這種設(shè)計(jì)范式會(huì)導(dǎo)致更多的時(shí)間抖動(dòng)和更少的確定性。
基于RTOS的軟件
運(yùn)行在包含內(nèi)存管理單元(MMU)和中央處理單元(CPU)的完整操作系統(tǒng)上的軟件被認(rèn)為是基于RTOS的軟件。用這種方法實(shí)現(xiàn)的應(yīng)用程序可能非常復(fù)雜,需要在各種內(nèi)部和外部系統(tǒng)之間進(jìn)行許多不同的交互。使用完整的操作系統(tǒng)的好處是伴隨著它的所有能力--包括硬件和軟件。
在硬件方面,通常有更多的CPU核心以更高的時(shí)鐘速率運(yùn)行??梢杂袛?shù)千兆字節(jié)的內(nèi)存和持久性存儲(chǔ)器。增加外圍硬件可以像增加一塊卡一樣簡(jiǎn)單(只要有預(yù)先存在的驅(qū)動(dòng)程序)。
在軟件方面,有大量用于網(wǎng)絡(luò)堆棧、用戶(hù)界面開(kāi)發(fā)、文件處理等的開(kāi)源和供應(yīng)商專(zhuān)有解決方案。在所有這些能力和選項(xiàng)之下,內(nèi)核仍然以這樣一種方式實(shí)現(xiàn),即關(guān)鍵任務(wù)不會(huì)被無(wú)限期地阻斷,這在傳統(tǒng)的操作系統(tǒng)中是可能的。正因?yàn)槿绱?,獲得確定性的性能仍然是可以做到的,就像RTOS固件一樣。
精心制作的操作系統(tǒng)軟件
與基于RTOS的軟件類(lèi)似,一個(gè)標(biāo)準(zhǔn)的操作系統(tǒng)擁有開(kāi)發(fā)者可以要求的所有庫(kù)和功能。然而,缺少的是對(duì)滿(mǎn)足時(shí)間要求的嚴(yán)格關(guān)注。一般來(lái)說(shuō),用傳統(tǒng)操作系統(tǒng)實(shí)現(xiàn)的系統(tǒng)會(huì)有更少的確定性行為(在安全關(guān)鍵的情況下,沒(méi)有一個(gè)可以真正指望的)。如果在沒(méi)有災(zāi)難性后果的情況下,有一個(gè)寬松的實(shí)時(shí)性要求,如果沒(méi)有按時(shí)完成一個(gè)躊躇滿(mǎn)志的最后期限,只要在選擇運(yùn)行什么軟件堆棧和控制它們的資源使用方面謹(jǐn)慎行事,標(biāo)準(zhǔn)的操作系統(tǒng)就可以發(fā)揮作用。帶有PREEMPT_RT補(bǔ)丁的Linux內(nèi)核是這種類(lèi)型的實(shí)時(shí)系統(tǒng)的一個(gè)很好的例子。
所以,現(xiàn)在實(shí)現(xiàn)實(shí)時(shí)系統(tǒng)的所有選項(xiàng)都已被列出,現(xiàn)在是時(shí)候準(zhǔn)確定義我們說(shuō)的RTOS,特別是基于MCU的RTOS是什么意思。
定義實(shí)時(shí)操作系統(tǒng)
操作系統(tǒng)(如Windows、Linux和macOS)的創(chuàng)建是為了提供一個(gè)一致的編程環(huán)境,將底層硬件抽象化,使其更容易編寫(xiě)和維護(hù)計(jì)算機(jī)程序。它們?yōu)閼?yīng)用程序員提供了許多不同的基元(如線(xiàn)程和互斥),可以用來(lái)創(chuàng)建更復(fù)雜的行為。例如,可以創(chuàng)建一個(gè)多線(xiàn)程程序,提供對(duì)共享數(shù)據(jù)的保護(hù)性訪(fǎng)問(wèn):
前面的應(yīng)用程序并沒(méi)有實(shí)現(xiàn)線(xiàn)程和互斥基元,它只是利用了它們。線(xiàn)程和互斥的實(shí)際實(shí)現(xiàn)是由操作系統(tǒng)處理的。這有幾個(gè)優(yōu)點(diǎn):
- 應(yīng)用程序代碼不那么復(fù)雜。
- 更容易理解--無(wú)論哪個(gè)程序員都使用相同的原語(yǔ),從而更容易理解由不同人創(chuàng)建的代碼。
- 硬件可移植性更好--有了適當(dāng)?shù)念A(yù)防措施,代碼可以在操作系統(tǒng)支持的任何硬件上運(yùn)行而無(wú)需修改。
在前面的例子中,mutex被用來(lái)確保每次只有一個(gè)線(xiàn)程可以訪(fǎng)問(wèn)共享數(shù)據(jù)。在通用操作系統(tǒng)的情況下,每個(gè)線(xiàn)程都會(huì)很高興地等待突變體無(wú)限期地可用,然后再去訪(fǎng)問(wèn)共享數(shù)據(jù)。這是實(shí)時(shí)操作系統(tǒng)與通用操作系統(tǒng)不同的地方。在RTOS中,所有阻塞的系統(tǒng)調(diào)用都是有時(shí)間限制的。RTOS不允許無(wú)限期地等待mutex,而是允許指定一個(gè)最大延遲。例如,如果線(xiàn)程1試圖獲取Mutex,但在100毫秒(或1秒)后仍未得到它,它將繼續(xù)等待Mutex變得可用。
在RTOS的實(shí)現(xiàn)中,要指定等待Mutex變得可用的最大時(shí)間。如果線(xiàn)程1指定它必須在100毫秒內(nèi)獲取Mutex,并且在101毫秒后仍未收到Mutex,線(xiàn)程1將收到通知,說(shuō)Mutex沒(méi)有被及時(shí)獲取。指定這個(gè)超時(shí)是為了幫助創(chuàng)建確定性的系統(tǒng)。
任何提供執(zhí)行給定代碼的確定性方式的操作系統(tǒng)都可以被認(rèn)為是實(shí)時(shí)操作系統(tǒng)。這個(gè)實(shí)時(shí)操作系統(tǒng)的定義涵蓋了相當(dāng)多的系統(tǒng)。
有幾個(gè)特征傾向于將RTOS應(yīng)用與另一RTOS應(yīng)用區(qū)分開(kāi)來(lái):不滿(mǎn)足實(shí)時(shí)截止日期的頻率是可以接受的,以及不滿(mǎn)足實(shí)時(shí)截止日期的嚴(yán)重程度。不同范圍的RTOS應(yīng)用通常被歸納為三類(lèi)--硬、固和軟實(shí)時(shí)系統(tǒng)。
不要太糾結(jié)于固和軟實(shí)時(shí)系統(tǒng)之間的區(qū)別。這些術(shù)語(yǔ)的定義在我們的行業(yè)內(nèi)甚至沒(méi)有一致的意見(jiàn)。重要的是,你要知道你的系統(tǒng)的要求,并設(shè)計(jì)一個(gè)解決方案來(lái)滿(mǎn)足這些要求!
如果故障會(huì)導(dǎo)致生命或重大財(cái)產(chǎn)的損失,那么故障的嚴(yán)重程度一般被認(rèn)為是安全關(guān)鍵型的。有一些硬實(shí)時(shí)系統(tǒng)與安全無(wú)關(guān)。
硬實(shí)時(shí)系統(tǒng)
硬實(shí)時(shí)系統(tǒng)必須在100%的時(shí)間內(nèi)滿(mǎn)足其最后期限。如果系統(tǒng)沒(méi)有達(dá)到最后期限,那么它就被認(rèn)為是失敗了。這并不一定意味著如果故障發(fā)生在硬實(shí)時(shí)系統(tǒng)中就會(huì)傷害到人,只是說(shuō)如果系統(tǒng)錯(cuò)過(guò)了一個(gè)截止日期,它就失敗了。
硬實(shí)時(shí)系統(tǒng)的一些例子可以在醫(yī)療設(shè)備中找到,如心臟起搏器和具有極其嚴(yán)格控制參數(shù)的控制系統(tǒng)。在心臟起搏器的情況下,如果心臟起搏器錯(cuò)過(guò)了在正確的時(shí)間點(diǎn)進(jìn)行電脈沖的最后期限,它可能會(huì)殺死病人(這就是為什么心臟起搏器被定義為安全關(guān)鍵型系統(tǒng))。
相反,如果計(jì)算機(jī)數(shù)控(CNC)銑床上的運(yùn)動(dòng)控制系統(tǒng)沒(méi)有及時(shí)對(duì)指令做出反應(yīng),它可能會(huì)將刀具插入正在加工的零件的錯(cuò)誤部位,從而毀掉它。在我們提到的這些案例中,故障造成了生命損失,而另一個(gè)則把一些金屬變成了廢品,但這兩個(gè)故障都是由錯(cuò)過(guò)的最后期限造成的。
固實(shí)時(shí)系統(tǒng)
與硬實(shí)時(shí)系統(tǒng)相比,固實(shí)時(shí)系統(tǒng)幾乎在所有時(shí)間都需要達(dá)到其最后期限。如果視頻和音頻瞬間失去同步,可能不會(huì)被認(rèn)為是系統(tǒng)故障,但可能會(huì)使視頻的消費(fèi)者感到不安。
在大多數(shù)控制系統(tǒng)中(類(lèi)似于前一個(gè)例子中的烙鐵),稍微超出規(guī)定時(shí)間的幾個(gè)樣本的讀取不太可能完全破壞系統(tǒng)控制。如果控制系統(tǒng)有ADC,可以自動(dòng)獲取新的樣本,如果MCU沒(méi)有及時(shí)讀取新的樣本,它將被新的樣本覆蓋。這種情況可能偶爾發(fā)生,但如果發(fā)生得太頻繁或太頻繁,溫度穩(wěn)定性就會(huì)被破壞。在要求特別高的系統(tǒng)中,可能只需要錯(cuò)過(guò)幾個(gè)樣本,整個(gè)控制系統(tǒng)就會(huì)失靈。
軟實(shí)時(shí)系統(tǒng)
當(dāng)涉及到系統(tǒng)必須滿(mǎn)足其最后期限的頻率時(shí),軟實(shí)時(shí)系統(tǒng)是最寬松的。這些系統(tǒng)通常只提供一個(gè)遵守最后期限的最大努力的承諾。
汽車(chē)中的巡航控制是軟實(shí)時(shí)系統(tǒng)的很好的例子,因?yàn)閷?duì)它沒(méi)有硬性規(guī)定或期望。駕駛員通常不期望他們的速度能收斂到設(shè)定速度的+/- x mph/kph之內(nèi)。他們期望在合理的情況下,例如沒(méi)有大的坡度,控制系統(tǒng)最終會(huì)讓他們?cè)诖蠖鄶?shù)時(shí)間內(nèi)接近他們的理想速度。
實(shí)時(shí)操作系統(tǒng)的范圍
實(shí)時(shí)操作系統(tǒng)的功能各不相同,它們最適合的處理器架構(gòu)和尺寸也各不相同。在較小的方面,我們有較小的以8-32位MCU為重點(diǎn)的RTOS,如FreeRTOS、Keil RTX、Micrium μC、ThreadX,以及更多。 這類(lèi)RTOS適合在微控制器上使用,并提供一個(gè)緊湊的實(shí)時(shí)內(nèi)核作為最基本的產(chǎn)品。當(dāng)從MCU轉(zhuǎn)向32位和64位應(yīng)用處理器時(shí),你會(huì)傾向于找到RTOS,如Wind River VxWorks和Wind River Linux、Green Hills的Integrity OS,甚至是帶有PREEMPT_RT內(nèi)核擴(kuò)展的Linux。這些完整的操作系統(tǒng)提供了大量的軟件選擇,為實(shí)時(shí)調(diào)度要求以及一般計(jì)算任務(wù)提供了解決方案。即使有了我們剛剛提到的操作系統(tǒng),我們也只是觸及了可用的表面。在所有級(jí)別的實(shí)時(shí)操作系統(tǒng)中,無(wú)論大小,都有免費(fèi)和付費(fèi)的解決方案(有些價(jià)格遠(yuǎn)遠(yuǎn)超過(guò)10000美元)。
那么,既然有免費(fèi)的解決方案,你為什么還要選擇付費(fèi)呢?免費(fèi)提供的RTOS解決方案和付費(fèi)解決方案之間的主要區(qū)別因素是安全批準(zhǔn)、中間件和客戶(hù)支持。 因?yàn)閷?shí)時(shí)操作系統(tǒng)提供了高度確定的執(zhí)行環(huán)境,它們經(jīng)常被用于復(fù)雜的安全關(guān)鍵型應(yīng)用。我們所說(shuō)的安全關(guān)鍵,一般是指一個(gè)系統(tǒng),其故障可能會(huì)傷害人或造成重大損失。這些系統(tǒng)需要確定性的操作,因?yàn)樗鼈儽仨氁恢币钥深A(yù)測(cè)的方式行事。保證代碼在固定的時(shí)間內(nèi)對(duì)事件做出反應(yīng)是確保它們行為一致的重要一步。這些安全關(guān)鍵型應(yīng)用中的大多數(shù)都受到監(jiān)管,并有自己的一套管理機(jī)構(gòu)和標(biāo)準(zhǔn),如飛機(jī)的DO-178B和DO-178C或工業(yè)應(yīng)用的IEC 61508 SIL 3和ISO 26262 ASILD。為了使安全關(guān)鍵型認(rèn)證更經(jīng)濟(jì)實(shí)惠,設(shè)計(jì)者通常會(huì)保持這些系統(tǒng)的代碼極其簡(jiǎn)單(因此有可能從數(shù)學(xué)上證明系統(tǒng)將穩(wěn)定運(yùn)行,不會(huì)出錯(cuò)),或者轉(zhuǎn)向已經(jīng)通過(guò)認(rèn)證的商業(yè)RTOS解決方案,作為一個(gè)起點(diǎn)。威騰斯丁公司的SafeRTOS是FreeRTOS的衍生產(chǎn)品,已獲得工業(yè)、醫(yī)療和汽車(chē)領(lǐng)域的認(rèn)證。
中間件也可以是復(fù)雜系統(tǒng)中的一個(gè)極其重要的組成部分。中間件是運(yùn)行在用戶(hù)代碼(你,應(yīng)用程序員編寫(xiě)的代碼)和較低層,如RTOS或裸機(jī)(無(wú)RTOS)之間的代碼。付費(fèi)解決方案的另一個(gè)價(jià)值主張是,生態(tài)系統(tǒng)提供了一套預(yù)集成的高質(zhì)量中間件(如文件系統(tǒng)、網(wǎng)絡(luò)堆棧、GUI框架、工業(yè)協(xié)議等),最大限度地減少了開(kāi)發(fā),降低了整體項(xiàng)目風(fēng)險(xiǎn)。使用中間件而不是自己開(kāi)發(fā)的原因是為了減少內(nèi)部開(kāi)發(fā)團(tuán)隊(duì)編寫(xiě)的原始代碼量。這既降低了風(fēng)險(xiǎn),也減少了團(tuán)隊(duì)花費(fèi)的總時(shí)間--因此,根據(jù)項(xiàng)目復(fù)雜性和進(jìn)度要求等因素,這可能是一項(xiàng)值得的投資。
付費(fèi)解決方案通常也會(huì)直接由固件供應(yīng)商提供某種程度的客戶(hù)支持。雇傭和保留工程師的成本很高。管理人員最害怕的莫過(guò)于走進(jìn)一個(gè)滿(mǎn)是工程師的房間,這些人正在為他們的工具而困惑,而不是為需要解決的真正問(wèn)題而工作。有了專(zhuān)家的幫助,只需一封電子郵件或一個(gè)電話(huà),就可以大大提高團(tuán)隊(duì)的生產(chǎn)力,從而縮短周轉(zhuǎn)時(shí)間,使每個(gè)人的工作環(huán)境更加愉快。
FreeRTOS有付費(fèi)的支持和培訓(xùn)選項(xiàng),以及付費(fèi)的中間件解決方案,這些都可以被整合。然而,也有開(kāi)放源碼和/或免費(fèi)提供的中間件組件,其中一些將在本書(shū)中討論。
本書(shū)使用的RTOS
什么這本書(shū)只涉及一個(gè)MCU模型上的一個(gè)RTOS?有幾個(gè)原因,其中一個(gè)原因是我們要講的大部分概念幾乎適用于任何可用的RTOS,就像良好的編碼習(xí)慣超越了你碰巧要編碼的語(yǔ)言一樣。通過(guò)專(zhuān)注于一個(gè)RTOS和一個(gè)MCU的單一實(shí)現(xiàn),我們將能夠更深入地探討一些話(huà)題,而不是在嘗試討論所有的替代方案時(shí)才有可能。
FreeRTOS是最流行的用于MCU的RTOS實(shí)現(xiàn)之一,而且非常廣泛。它已經(jīng)存在了15年之久,并且已經(jīng)被移植到幾十個(gè)平臺(tái)。如果你曾經(jīng)與熟悉RTOS編程的真正的底層嵌入式系統(tǒng)工程師交談過(guò),他們肯定聽(tīng)說(shuō)過(guò)FreeRTOS,而且很可能至少使用過(guò)一次。通過(guò)把注意力集中在FreeRTOS上,你將有能力迅速地把你的FreeRTOS知識(shí)遷移到其他硬件上,或者在情況需要時(shí)過(guò)渡到其他RTOS。
我們使用FreeRTOS的另一個(gè)原因?嗯,它是免費(fèi)的! FreeRTOS是在MIT許可下發(fā)布的。
下面的圖表顯示了FreeRTOS在一個(gè)典型的ARM固件堆棧中的位置。堆棧指的是構(gòu)成系統(tǒng)的所有不同層的固件組件,以及它們是如何堆疊在一起的。這里的用戶(hù)是指使用FreeRTOS的程序員(而不是嵌入式系統(tǒng)的終端用戶(hù)):
一些值得注意的項(xiàng)目如下:
- 用戶(hù)代碼能夠訪(fǎng)問(wèn)相同的FreeRTOS API,不管底層的硬件端口實(shí)現(xiàn)如何。
- FreeRTOS并不阻止用戶(hù)代碼使用供應(yīng)商提供的驅(qū)動(dòng)程序、CMSIS或原始硬件寄存器。
- 擁有一個(gè)在不同硬件間一致的標(biāo)準(zhǔn)化的API意味著代碼可以很容易地在硬件目標(biāo)之間遷移,而不需要不斷地重寫(xiě)。讓代碼直接與硬件對(duì)話(huà)的能力也提供了必要時(shí)編寫(xiě)極其有效的代碼的手段(以犧牲可移植性為代價(jià))。
何時(shí)使用實(shí)時(shí)操作系統(tǒng)
偶爾,當(dāng)有人第一次了解到實(shí)時(shí)操作系統(tǒng)這個(gè)術(shù)語(yǔ)時(shí),他們會(huì)錯(cuò)誤地認(rèn)為實(shí)時(shí)操作系統(tǒng)是在嵌入式系統(tǒng)中實(shí)現(xiàn)實(shí)時(shí)行為的唯一方法。這當(dāng)然是可以理解的(尤其是考慮到這個(gè)名字),但這與事實(shí)相去甚遠(yuǎn)。有時(shí),最好把RTOS看作是一種潛在的解決方案,而不是用于一切的解決方案。一般來(lái)說(shuō),對(duì)于一個(gè)基于MCU的RTOS來(lái)說(shuō),要成為一個(gè)特定問(wèn)題的理想解決方案,它需要有Goldilocks級(jí)別的復(fù)雜性--不要太簡(jiǎn)單,但也不要太復(fù)雜。
如果有一個(gè)極其簡(jiǎn)單的問(wèn)題,例如監(jiān)測(cè)兩個(gè)狀態(tài)并在它們同時(shí)出現(xiàn)時(shí)觸發(fā)警報(bào),那么解決方案可能是一個(gè)直接的硬件解決方案(例如一個(gè)AND門(mén))。在這種情況下,可能沒(méi)有理由使事情進(jìn)一步復(fù)雜化,因?yàn)锳ND門(mén)的解決方案將是非??斓?,具有高度的確定性和極端的可靠性。它也將需要很少的開(kāi)發(fā)時(shí)間。
現(xiàn)在,考慮一下只有一兩個(gè)任務(wù)需要執(zhí)行的情況,如控制電機(jī)的速度和觀察編碼器以確保正確的距離被穿越。這當(dāng)然可以用離散的模擬和數(shù)字硬件來(lái)實(shí)現(xiàn),但有可配置的距離會(huì)增加一些復(fù)雜性。此外,調(diào)整控制環(huán)路的系數(shù)很可能需要調(diào)整電位器的設(shè)置(可能是針對(duì)每個(gè)單獨(dú)的板子),按照今天的制造標(biāo)準(zhǔn),這在某些或大多數(shù)情況下是不可取的。因此,在硬件解決方案方面,我們只能用CPLD或FPGA來(lái)實(shí)現(xiàn)運(yùn)動(dòng)控制算法和跟蹤行走的距離。這恰好是一個(gè)非常合適的選擇,因?yàn)樗锌赡苄〉娇梢匝b入CPLD,但在某些情況下,F(xiàn)PGA的成本可能是不可接受的。這個(gè)問(wèn)題也是由MCU經(jīng)常處理的。如果現(xiàn)有的內(nèi)部資源不具備硬件語(yǔ)言或工具鏈所需的專(zhuān)業(yè)知識(shí),那么裸機(jī)MCU固件解決方案可能是一個(gè)不錯(cuò)的選擇。
假設(shè)問(wèn)題更加復(fù)雜,例如控制幾個(gè)不同執(zhí)行器的設(shè)備,從傳感器中讀取數(shù)據(jù),并將這些值存儲(chǔ)在本地存儲(chǔ)器中。也許該設(shè)備還需要坐在某種網(wǎng)絡(luò)上,如以太網(wǎng)、Wi-Fi、控制器區(qū)域網(wǎng)絡(luò)(CAN),等等。一TOS可以很好地解決這種類(lèi)型的問(wèn)題。事實(shí)上,有許多不同的任務(wù)需要完成,或多或少地相互異步,這使得我們很容易認(rèn)為RTOS帶來(lái)的額外復(fù)雜性將得到回報(bào)。實(shí)時(shí)操作系統(tǒng)幫助我們確保低優(yōu)先級(jí)的、更復(fù)雜的任務(wù),如網(wǎng)絡(luò)和文件系統(tǒng)堆棧,不會(huì)干擾時(shí)間更緊迫的任務(wù)(如控制執(zhí)行器和讀取傳感器)。在許多情況下,可能會(huì)有某種形式的控制系統(tǒng),通常會(huì)從在明確的時(shí)間間隔內(nèi)運(yùn)行中受益,這是實(shí)時(shí)操作系統(tǒng)的優(yōu)勢(shì)。
現(xiàn)在,考慮一個(gè)與前面類(lèi)似的系統(tǒng),但現(xiàn)在有多種網(wǎng)絡(luò)要求,例如為網(wǎng)頁(yè)提供服務(wù),處理復(fù)雜的企業(yè)環(huán)境中的用戶(hù)認(rèn)證,以及將文件推送到需要基于不同網(wǎng)絡(luò)文件協(xié)議的各種共享目錄。這種復(fù)雜程度可以用RTOS來(lái)實(shí)現(xiàn),但同樣,根據(jù)可用的團(tuán)隊(duì)資源,這可能最好留給完整的操作系統(tǒng)來(lái)處理(無(wú)論是RTOS還是通用的),因?yàn)樵S多所需的復(fù)雜軟件堆棧已經(jīng)存在。有時(shí),可以采取多核方法,其中一個(gè)核心運(yùn)行RTOS,另一個(gè)運(yùn)行通用操作系統(tǒng)。
現(xiàn)在,可能很明顯,沒(méi)有確切的方法來(lái)確定哪種實(shí)時(shí)解決方案對(duì)所有情況都是正確的。每個(gè)項(xiàng)目和團(tuán)隊(duì)都有自己獨(dú)特的要求、背景、技能組合和背景,為這個(gè)決定提供了舞臺(tái)。選擇一個(gè)問(wèn)題的解決方案有很多因素;重要的是要保持開(kāi)放的心態(tài),選擇在那個(gè)時(shí)間點(diǎn)上最適合你的團(tuán)隊(duì)和項(xiàng)目的解決方案。
評(píng)論