大疆嵌入式三面:RTOS 系統(tǒng)是如何任務(wù)調(diào)度的?
在眾多實(shí)際項(xiàng)目里,像無(wú)人機(jī)飛行控制這類對(duì)實(shí)時(shí)響應(yīng)要求近乎嚴(yán)苛的場(chǎng)景,RTOS 系統(tǒng)通過高效的任務(wù)調(diào)度,保障飛行姿態(tài)調(diào)整、傳感器數(shù)據(jù)處理等關(guān)鍵任務(wù)有序且及時(shí)地執(zhí)行,讓無(wú)人機(jī)能夠精準(zhǔn)應(yīng)對(duì)復(fù)雜多變的飛行環(huán)境 。又比如在大疆的一些智能影像設(shè)備中,RTOS 任務(wù)調(diào)度確保視頻拍攝、圖像傳輸與處理等任務(wù)協(xié)同工作,為用戶呈現(xiàn)高質(zhì)量的影像效果。
對(duì)于本次面試中 “RTOS 系統(tǒng)是如何任務(wù)調(diào)度的” 這一問題,我將從任務(wù)調(diào)度的基本概念入手,詳細(xì)剖析常見的調(diào)度策略,如優(yōu)先級(jí)搶占調(diào)度、時(shí)間片輪轉(zhuǎn)調(diào)度以及協(xié)同調(diào)度等,闡述它們各自的工作原理與適用場(chǎng)景 。接著深入探討任務(wù)調(diào)度的實(shí)現(xiàn)機(jī)制,包括任務(wù)狀態(tài)的轉(zhuǎn)換流程,以及調(diào)度器如何基于這些狀態(tài)和特定時(shí)機(jī)完成任務(wù)切換。同時(shí),我也會(huì)針對(duì)任務(wù)調(diào)度過程中可能出現(xiàn)的優(yōu)先級(jí)反轉(zhuǎn)問題,給出具體的解決方案和實(shí)際案例分析 。通過這些方面的闡述,全面且深入地展示我對(duì) RTOS 系統(tǒng)任務(wù)調(diào)度的理解,希望能契合大疆在嵌入式開發(fā)領(lǐng)域?qū)ο嚓P(guān)知識(shí)和技能的高要求 。
Part1.RTOS系統(tǒng)基礎(chǔ)入門
1.1RTOS 系統(tǒng)是什么
RTOS,即實(shí)時(shí)操作系統(tǒng)(Real-Time Operating System) ,從定義上來(lái)說,它是一種能夠在規(guī)定時(shí)間內(nèi)對(duì)外部事件做出響應(yīng),并完成相應(yīng)任務(wù)的操作系統(tǒng)。與我們?nèi)粘=佑|的普通操作系統(tǒng),如 Windows、Linux 等相比,RTOS 的最大特點(diǎn)就在于 “實(shí)時(shí)性”。
普通操作系統(tǒng)更側(cè)重于系統(tǒng)資源的均衡分配和多任務(wù)的并發(fā)處理,以滿足用戶多樣化的需求。例如,當(dāng)我們?cè)?Windows 系統(tǒng)上同時(shí)打開多個(gè)應(yīng)用程序,如瀏覽器、文檔編輯軟件、音樂播放器時(shí),系統(tǒng)會(huì)盡量公平地分配 CPU 時(shí)間給各個(gè)應(yīng)用,讓它們看起來(lái)像是在同時(shí)運(yùn)行。但在這個(gè)過程中,我們可能會(huì)感覺到某些操作的延遲,比如打開一個(gè)大型文件時(shí)需要等待幾秒鐘,這在普通操作系統(tǒng)的使用場(chǎng)景中是可以接受的。
而 RTOS 則截然不同,它對(duì)任務(wù)的處理及時(shí)性有著極高的要求。在 RTOS 中,每個(gè)任務(wù)都有明確的時(shí)間限制,系統(tǒng)必須確保這些任務(wù)在規(guī)定的時(shí)間內(nèi)完成,否則可能會(huì)導(dǎo)致嚴(yán)重的后果。例如在工業(yè)自動(dòng)化生產(chǎn)線上,機(jī)器人的動(dòng)作控制必須精確到毫秒級(jí),一旦控制指令的執(zhí)行出現(xiàn)延遲,就可能導(dǎo)致產(chǎn)品質(zhì)量問題甚至生產(chǎn)事故;在航空航天領(lǐng)域,飛行器的飛行姿態(tài)調(diào)整也依賴于 RTOS 的實(shí)時(shí)控制,任何微小的延遲都可能引發(fā)飛行安全事故。
對(duì)于大疆的嵌入式設(shè)備而言,實(shí)時(shí)性更是關(guān)乎產(chǎn)品性能和安全的核心要素。以大疆無(wú)人機(jī)為例,在飛行過程中,無(wú)人機(jī)需要實(shí)時(shí)采集來(lái)自各種傳感器的數(shù)據(jù),如陀螺儀、加速度計(jì)、GPS 等,這些傳感器不斷地向系統(tǒng)反饋無(wú)人機(jī)的飛行姿態(tài)、位置、速度等信息。RTOS 必須在極短的時(shí)間內(nèi)對(duì)這些數(shù)據(jù)進(jìn)行處理和分析,并根據(jù)預(yù)設(shè)的算法生成相應(yīng)的控制指令,以調(diào)整無(wú)人機(jī)的飛行姿態(tài)和飛行路徑,確保其穩(wěn)定飛行。如果 RTOS 不能及時(shí)處理這些任務(wù),無(wú)人機(jī)就可能出現(xiàn)失控、墜毀等嚴(yán)重后果。
1.2為什么大疆選擇 RTOS 系統(tǒng)
大疆的產(chǎn)品,尤其是無(wú)人機(jī),在運(yùn)行過程中需要實(shí)時(shí)處理大量復(fù)雜的任務(wù),這就決定了它對(duì)操作系統(tǒng)的實(shí)時(shí)性和可靠性有著極高的要求,而 RTOS 系統(tǒng)恰好能夠滿足這些需求,主要體現(xiàn)在以下幾個(gè)方面:
⑴多任務(wù)并行處理:大疆無(wú)人機(jī)在飛行時(shí),要同時(shí)處理飛行姿態(tài)控制、傳感器數(shù)據(jù)采集與處理、影像數(shù)據(jù)傳輸與處理、通信數(shù)據(jù)收發(fā)等多個(gè)任務(wù)。例如,在進(jìn)行航拍時(shí),無(wú)人機(jī)一方面要通過復(fù)雜的算法實(shí)時(shí)調(diào)整自身的飛行姿態(tài),以保持穩(wěn)定的拍攝角度;另一方面,要快速采集相機(jī)拍攝的高清影像數(shù)據(jù),并通過無(wú)線通信模塊將這些數(shù)據(jù)實(shí)時(shí)傳輸?shù)降孛婵刂贫恕TOS 系統(tǒng)支持多任務(wù)并行處理,能夠?yàn)槊總€(gè)任務(wù)分配獨(dú)立的資源和執(zhí)行時(shí)間,確保各個(gè)任務(wù)之間互不干擾,高效協(xié)同工作。通過 RTOS 的任務(wù)調(diào)度機(jī)制,可以根據(jù)任務(wù)的優(yōu)先級(jí)和時(shí)間要求,合理安排 CPU 等系統(tǒng)資源,使無(wú)人機(jī)能夠同時(shí)兼顧多個(gè)任務(wù)的執(zhí)行,保證飛行的穩(wěn)定性和數(shù)據(jù)處理的及時(shí)性。
⑵實(shí)時(shí)性保障:在無(wú)人機(jī)的飛行過程中,許多任務(wù)都具有嚴(yán)格的時(shí)間限制,如飛行姿態(tài)控制任務(wù)需要在毫秒級(jí)的時(shí)間內(nèi)完成對(duì)傳感器數(shù)據(jù)的處理和控制指令的生成,以應(yīng)對(duì)飛行過程中的各種突發(fā)情況。RTOS 系統(tǒng)通過優(yōu)化的任務(wù)調(diào)度算法和高效的中斷處理機(jī)制,能夠確保高優(yōu)先級(jí)任務(wù)在規(guī)定的時(shí)間內(nèi)得到及時(shí)響應(yīng)和執(zhí)行,滿足無(wú)人機(jī)對(duì)實(shí)時(shí)性的苛刻要求。例如,當(dāng)無(wú)人機(jī)遇到突然的氣流干擾時(shí),RTOS 能夠迅速響應(yīng)傳感器檢測(cè)到的姿態(tài)變化信號(hào),優(yōu)先調(diào)度飛行姿態(tài)控制任務(wù),及時(shí)調(diào)整無(wú)人機(jī)的飛行姿態(tài),避免發(fā)生飛行事故。
⑶可靠性與穩(wěn)定性:大疆無(wú)人機(jī)廣泛應(yīng)用于各種復(fù)雜環(huán)境和關(guān)鍵領(lǐng)域,如影視拍攝、測(cè)繪、農(nóng)業(yè)植保、電力巡檢等,這就要求無(wú)人機(jī)的操作系統(tǒng)具備極高的可靠性和穩(wěn)定性,以確保任務(wù)的順利完成。RTOS 系統(tǒng)經(jīng)過嚴(yán)格的測(cè)試和驗(yàn)證,具有完善的錯(cuò)誤檢測(cè)和恢復(fù)機(jī)制,能夠在系統(tǒng)出現(xiàn)故障時(shí)快速進(jìn)行自我修復(fù),保證系統(tǒng)的穩(wěn)定運(yùn)行。同時(shí),RTOS 對(duì)任務(wù)的管理和調(diào)度更加精細(xì),能夠有效避免任務(wù)之間的沖突和死鎖等問題,提高系統(tǒng)的可靠性。例如,在電力巡檢任務(wù)中,無(wú)人機(jī)需要長(zhǎng)時(shí)間、穩(wěn)定地飛行在復(fù)雜的輸電線路環(huán)境中,RTOS 系統(tǒng)的高可靠性和穩(wěn)定性能夠確保無(wú)人機(jī)持續(xù)穩(wěn)定地工作,準(zhǔn)確地檢測(cè)輸電線路的故障隱患。
Part2.RTOS 系統(tǒng)的任務(wù)調(diào)度核心機(jī)制
2.1調(diào)度策略總覽
大疆在其嵌入式系統(tǒng)中采用了 FreeRTOS 與 μC/OS - III 混合架構(gòu),這一創(chuàng)新的架構(gòu)融合了兩者的優(yōu)勢(shì),為無(wú)人機(jī)系統(tǒng)提供了高效、穩(wěn)定的任務(wù)調(diào)度支持。在這個(gè)混合架構(gòu)中,涉及到兩種主要的任務(wù)調(diào)度策略:優(yōu)先級(jí)搶占調(diào)度和時(shí)間片輪轉(zhuǎn)調(diào)度 ,它們各自有著獨(dú)特的工作方式和適用場(chǎng)景,共同協(xié)作以確保無(wú)人機(jī)系統(tǒng)的正常運(yùn)行。
優(yōu)先級(jí)搶占調(diào)度,顧名思義,是基于任務(wù)優(yōu)先級(jí)的一種調(diào)度方式。在這種調(diào)度策略下,系統(tǒng)會(huì)為每個(gè)任務(wù)分配一個(gè)優(yōu)先級(jí),當(dāng)有高優(yōu)先級(jí)任務(wù)進(jìn)入就緒狀態(tài)時(shí),它會(huì)立即打斷正在執(zhí)行的低優(yōu)先級(jí)任務(wù),搶占 CPU 的控制權(quán),從而保證高優(yōu)先級(jí)任務(wù)能夠得到及時(shí)處理。這種調(diào)度策略適用于那些對(duì)實(shí)時(shí)性要求極高的任務(wù),例如飛控指令的處理、緊急避障任務(wù)等。在無(wú)人機(jī)飛行過程中,飛控指令直接關(guān)系到無(wú)人機(jī)的飛行安全和穩(wěn)定性,一旦有新的飛控指令產(chǎn)生,必須立即得到執(zhí)行,優(yōu)先級(jí)搶占調(diào)度就能很好地滿足這一需求。
而時(shí)間片輪轉(zhuǎn)調(diào)度則是針對(duì)相同優(yōu)先級(jí)任務(wù)的一種調(diào)度策略。當(dāng)多個(gè)任務(wù)具有相同的優(yōu)先級(jí)時(shí),系統(tǒng)會(huì)為每個(gè)任務(wù)分配一個(gè)相等的時(shí)間片段(即時(shí)間片),這些任務(wù)按照順序輪流在 CPU 上運(yùn)行。當(dāng)一個(gè)任務(wù)的時(shí)間片用完后,即使它還沒有完成,也會(huì)被暫停,然后被放入就緒隊(duì)列的末尾,等待下一輪的調(diào)度,下一個(gè)任務(wù)則開始在 CPU 上運(yùn)行。這種調(diào)度策略確保了相同優(yōu)先級(jí)任務(wù)之間的公平性,使得每個(gè)任務(wù)都能有機(jī)會(huì)得到執(zhí)行,避免了某個(gè)任務(wù)長(zhǎng)時(shí)間占用 CPU 而導(dǎo)致其他任務(wù)得不到處理的情況。例如在無(wú)人機(jī)的影像傳輸和一些輔助數(shù)據(jù)處理任務(wù)中,這些任務(wù)可能具有相同的優(yōu)先級(jí),時(shí)間片輪轉(zhuǎn)調(diào)度就可以保證它們都能得到合理的 CPU 時(shí)間,從而實(shí)現(xiàn)影像數(shù)據(jù)的穩(wěn)定傳輸和輔助數(shù)據(jù)的及時(shí)處理。
2.2優(yōu)先級(jí)搶占調(diào)度詳解
優(yōu)先級(jí)搶占調(diào)度的核心原理在于系統(tǒng)對(duì)任務(wù)優(yōu)先級(jí)的實(shí)時(shí)監(jiān)測(cè)和響應(yīng)。在大疆無(wú)人機(jī)的 RTOS 系統(tǒng)中,每個(gè)任務(wù)都被賦予了一個(gè)特定的優(yōu)先級(jí)數(shù)值,數(shù)值越小表示優(yōu)先級(jí)越高。當(dāng)系統(tǒng)運(yùn)行時(shí),調(diào)度器會(huì)不斷地檢查就緒任務(wù)隊(duì)列,一旦發(fā)現(xiàn)有高優(yōu)先級(jí)任務(wù)進(jìn)入就緒狀態(tài),它就會(huì)立即采取行動(dòng)。首先,調(diào)度器會(huì)暫停當(dāng)前正在執(zhí)行的低優(yōu)先級(jí)任務(wù),將該任務(wù)的上下文信息(包括 CPU 寄存器的值、任務(wù)堆棧指針等)保存到該任務(wù)的堆棧中,這些上下文信息記錄了任務(wù)當(dāng)前的執(zhí)行狀態(tài),以便后續(xù)任務(wù)恢復(fù)執(zhí)行時(shí)能夠從暫停的地方繼續(xù)。然后,調(diào)度器會(huì)從高優(yōu)先級(jí)任務(wù)的堆棧中加載其上下文信息到 CPU 寄存器中,使 CPU 的狀態(tài)切換到高優(yōu)先級(jí)任務(wù)被暫停時(shí)的狀態(tài),從而讓高優(yōu)先級(jí)任務(wù)獲取 CPU 的控制權(quán),開始執(zhí)行。
以飛控指令任務(wù)為例,在無(wú)人機(jī)飛行過程中,飛控系統(tǒng)會(huì)實(shí)時(shí)接收來(lái)自各種傳感器的數(shù)據(jù),如陀螺儀、加速度計(jì)等,這些傳感器數(shù)據(jù)會(huì)被快速處理并生成相應(yīng)的飛控指令,這些飛控指令任務(wù)通常被設(shè)置為高優(yōu)先級(jí)。當(dāng)新的飛控指令任務(wù)就緒時(shí),無(wú)論此時(shí)系統(tǒng)正在執(zhí)行什么低優(yōu)先級(jí)任務(wù),如一些非關(guān)鍵的設(shè)備狀態(tài)監(jiān)測(cè)任務(wù),飛控指令任務(wù)都會(huì)立即搶占 CPU,確保無(wú)人機(jī)能夠及時(shí)根據(jù)新的指令調(diào)整飛行姿態(tài),保證飛行的穩(wěn)定性和安全性。
實(shí)際案例:在大疆無(wú)人機(jī)的實(shí)際應(yīng)用中,優(yōu)先級(jí)搶占調(diào)度發(fā)揮著至關(guān)重要的作用。例如,當(dāng)無(wú)人機(jī)在飛行過程中遇到突發(fā)狀況,如前方突然出現(xiàn)障礙物需要快速避障時(shí),高優(yōu)先級(jí)的飛控任務(wù)就會(huì)通過優(yōu)先級(jí)搶占機(jī)制及時(shí)響應(yīng)。無(wú)人機(jī)上的避障傳感器(如雙目視覺傳感器、毫米波雷達(dá)等)一旦檢測(cè)到障礙物,會(huì)迅速將信號(hào)傳遞給 RTOS 系統(tǒng),系統(tǒng)會(huì)立即生成高優(yōu)先級(jí)的避障飛控任務(wù)。
此時(shí),正在執(zhí)行的其他低優(yōu)先級(jí)任務(wù)(如實(shí)時(shí)圖傳畫面的一些圖像優(yōu)化處理任務(wù))會(huì)被暫停,避障飛控任務(wù)搶占 CPU 控制權(quán)。系統(tǒng)會(huì)根據(jù)傳感器數(shù)據(jù)快速計(jì)算出避障所需的飛行姿態(tài)調(diào)整參數(shù),并向無(wú)人機(jī)的電機(jī)、舵機(jī)等執(zhí)行機(jī)構(gòu)發(fā)送控制指令,使無(wú)人機(jī)能夠迅速改變飛行方向,避開障礙物。待避障任務(wù)完成后,系統(tǒng)再恢復(fù)之前被暫停的低優(yōu)先級(jí)任務(wù)的執(zhí)行,確保整個(gè)飛行過程的連續(xù)性和穩(wěn)定性。通過這種優(yōu)先級(jí)搶占調(diào)度機(jī)制,大疆無(wú)人機(jī)能夠在復(fù)雜的飛行環(huán)境中快速、準(zhǔn)確地應(yīng)對(duì)各種突發(fā)情況,保障飛行安全。
2.3時(shí)間片輪轉(zhuǎn)調(diào)度詳解
時(shí)間片輪轉(zhuǎn)調(diào)度主要應(yīng)用于處理相同優(yōu)先級(jí)的任務(wù)。在大疆嵌入式的 RTOS 系統(tǒng)中,當(dāng)多個(gè)任務(wù)被設(shè)定為相同優(yōu)先級(jí)時(shí),系統(tǒng)會(huì)為這些任務(wù)創(chuàng)建一個(gè)就緒隊(duì)列,并為每個(gè)任務(wù)分配一個(gè)固定時(shí)長(zhǎng)的時(shí)間片。例如,假設(shè)影像傳輸任務(wù)和一些后臺(tái)數(shù)據(jù)記錄任務(wù)被設(shè)置為相同優(yōu)先級(jí),它們會(huì)被放入同一個(gè)就緒隊(duì)列中。
圖片
調(diào)度器會(huì)按照隊(duì)列的順序,依次選取任務(wù)并讓其在 CPU 上運(yùn)行一個(gè)時(shí)間片的時(shí)長(zhǎng)。當(dāng)一個(gè)任務(wù)開始運(yùn)行時(shí),系統(tǒng)會(huì)啟動(dòng)一個(gè)定時(shí)器,用于記錄該任務(wù)的運(yùn)行時(shí)間。當(dāng)定時(shí)器計(jì)時(shí)達(dá)到時(shí)間片的長(zhǎng)度時(shí),無(wú)論該任務(wù)是否完成當(dāng)前操作,系統(tǒng)都會(huì)暫停該任務(wù)的執(zhí)行,并將其放回就緒隊(duì)列的末尾。
然后,調(diào)度器從就緒隊(duì)列的頭部選取下一個(gè)任務(wù),為其加載上下文信息到 CPU,使其開始運(yùn)行,如此循環(huán)往復(fù)。在影像傳輸任務(wù)中,每個(gè)時(shí)間片內(nèi),任務(wù)會(huì)讀取一定量的影像數(shù)據(jù),并通過無(wú)線通信模塊將其發(fā)送出去;而在后臺(tái)數(shù)據(jù)記錄任務(wù)中,每個(gè)時(shí)間片內(nèi),任務(wù)會(huì)將無(wú)人機(jī)的一些關(guān)鍵狀態(tài)數(shù)據(jù)(如電池電量、飛行高度等)記錄到存儲(chǔ)設(shè)備中。通過時(shí)間片輪轉(zhuǎn)調(diào)度,這兩個(gè)相同優(yōu)先級(jí)的任務(wù)能夠交替執(zhí)行,實(shí)現(xiàn)影像數(shù)據(jù)的持續(xù)傳輸和關(guān)鍵數(shù)據(jù)的及時(shí)記錄。
與優(yōu)先級(jí)搶占的協(xié)同:在大疆無(wú)人機(jī)的實(shí)際系統(tǒng)運(yùn)行中,優(yōu)先級(jí)搶占調(diào)度和時(shí)間片輪轉(zhuǎn)調(diào)度并不是孤立存在的,而是相互配合,共同保障系統(tǒng)的高效運(yùn)行。優(yōu)先級(jí)搶占調(diào)度確保了關(guān)鍵任務(wù)能夠在第一時(shí)間得到處理,避免因低優(yōu)先級(jí)任務(wù)的執(zhí)行而延誤關(guān)鍵任務(wù)的響應(yīng),保障了系統(tǒng)的實(shí)時(shí)性和安全性。而時(shí)間片輪轉(zhuǎn)調(diào)度則在相同優(yōu)先級(jí)任務(wù)之間實(shí)現(xiàn)了公平的 CPU 資源分配,保證了各個(gè)任務(wù)都能有機(jī)會(huì)執(zhí)行,提高了系統(tǒng)資源的利用率。
例如,在無(wú)人機(jī)進(jìn)行復(fù)雜的飛行任務(wù)時(shí),飛控任務(wù)作為最高優(yōu)先級(jí)任務(wù),一旦有新的飛控指令產(chǎn)生,它會(huì)立即搶占 CPU,確保無(wú)人機(jī)的飛行姿態(tài)得到及時(shí)調(diào)整。而在飛控任務(wù)執(zhí)行的間隙,當(dāng)沒有更高優(yōu)先級(jí)任務(wù)就緒時(shí),相同優(yōu)先級(jí)的影像傳輸任務(wù)和其他輔助任務(wù)則通過時(shí)間片輪轉(zhuǎn)調(diào)度機(jī)制,輪流使用 CPU。這樣,既保證了飛控任務(wù)等關(guān)鍵任務(wù)的優(yōu)先執(zhí)行,又兼顧了同級(jí)別任務(wù)的公平執(zhí)行,使得大疆無(wú)人機(jī)能夠在各種復(fù)雜的飛行場(chǎng)景下,穩(wěn)定、高效地完成飛行、數(shù)據(jù)傳輸、任務(wù)處理等多項(xiàng)任務(wù)。
Part3.任務(wù)調(diào)度中的關(guān)鍵技術(shù)
3.1上下文切換技術(shù)
在大疆嵌入式的 RTOS 系統(tǒng)中,上下文切換是任務(wù)調(diào)度過程中的一項(xiàng)關(guān)鍵技術(shù),它就像是一場(chǎng)精心編排的舞臺(tái)換幕,確保每個(gè)任務(wù)都能在合適的時(shí)間登上 CPU 這個(gè) “舞臺(tái)”,并且在離開時(shí)保留好自己的 “演出狀態(tài)”,以便下次能夠無(wú)縫銜接。
當(dāng)系統(tǒng)決定進(jìn)行任務(wù)切換時(shí),首先要做的就是保存當(dāng)前任務(wù)的上下文。上下文主要包括 CPU 寄存器的狀態(tài),這些寄存器就像是任務(wù)執(zhí)行過程中的 “小助手”,記錄著任務(wù)運(yùn)行時(shí)的各種關(guān)鍵信息,如程序計(jì)數(shù)器(PC),它指示著任務(wù)下一條要執(zhí)行的指令地址,就如同導(dǎo)航為任務(wù)指引前進(jìn)的方向;通用寄存器(如 R0 - R12 等),它們存儲(chǔ)著任務(wù)執(zhí)行過程中的臨時(shí)數(shù)據(jù)和操作數(shù),是任務(wù)進(jìn)行各種計(jì)算和操作的重要依托;堆棧指針(SP),它指向任務(wù)的堆棧,堆棧則用于存儲(chǔ)函數(shù)調(diào)用的返回地址、局部變量等信息,是任務(wù)運(yùn)行時(shí)的 “數(shù)據(jù)倉(cāng)庫(kù)”。
為了更形象地理解,我們可以把任務(wù)比作一場(chǎng)正在進(jìn)行的戲劇表演,CPU 寄存器狀態(tài)就是演員們?cè)谖枧_(tái)上的站位、表情、動(dòng)作等表演狀態(tài),而堆棧則是后臺(tái)存放道具、服裝等物品的倉(cāng)庫(kù),堆棧指針就像是倉(cāng)庫(kù)管理員,知道每個(gè)道具和服裝放在哪里。當(dāng)需要切換到另一個(gè)任務(wù)時(shí),就好比要暫停這場(chǎng)戲劇表演,讓另一組演員上臺(tái)表演。此時(shí),舞臺(tái)工作人員(調(diào)度器)會(huì)迅速記錄下當(dāng)前演員們的表演狀態(tài)(保存 CPU 寄存器狀態(tài)),并把倉(cāng)庫(kù)里的物品整理好(保存堆棧信息),以便后續(xù)這場(chǎng)戲劇能夠繼續(xù)表演。
在保存上下文的過程中,通常會(huì)使用匯編語(yǔ)言來(lái)實(shí)現(xiàn),因?yàn)閰R編語(yǔ)言能夠直接對(duì)硬件進(jìn)行操作,實(shí)現(xiàn)高效、精準(zhǔn)的上下文保存。例如,在 ARM 架構(gòu)的處理器中,會(huì)使用 PUSH 指令將寄存器的值壓入堆棧,從而實(shí)現(xiàn)寄存器狀態(tài)的保存。
完成當(dāng)前任務(wù)上下文的保存后,調(diào)度器會(huì)從就緒任務(wù)隊(duì)列中選擇下一個(gè)要執(zhí)行的任務(wù)。然后,開始恢復(fù)下一個(gè)任務(wù)的上下文,這就像是為新上臺(tái)的演員們布置舞臺(tái)、準(zhǔn)備道具。調(diào)度器會(huì)從選定任務(wù)的堆棧中讀取之前保存的寄存器值,并將其加載到 CPU 寄存器中,同時(shí)設(shè)置好堆棧指針,讓 CPU 切換到新任務(wù)的執(zhí)行環(huán)境。這樣,新任務(wù)就可以從上次暫停的地方繼續(xù)執(zhí)行,就像戲劇表演無(wú)縫切換到了下一幕。
快速的上下文切換對(duì)于系統(tǒng)的實(shí)時(shí)性能至關(guān)重要。在大疆無(wú)人機(jī)的飛行過程中,任務(wù)的執(zhí)行時(shí)間往往是以毫秒甚至微秒來(lái)計(jì)算的,如果上下文切換的時(shí)間過長(zhǎng),就會(huì)導(dǎo)致任務(wù)執(zhí)行的延遲增加。例如,在飛控任務(wù)中,如果上下文切換時(shí)間過長(zhǎng),可能會(huì)導(dǎo)致無(wú)人機(jī)對(duì)飛行姿態(tài)的調(diào)整不及時(shí),從而影響飛行的穩(wěn)定性和安全性;在影像傳輸任務(wù)中,過長(zhǎng)的上下文切換時(shí)間可能會(huì)導(dǎo)致圖像數(shù)據(jù)的丟失或卡頓,影響圖像的實(shí)時(shí)傳輸質(zhì)量。因此,大疆通過優(yōu)化上下文切換的算法和流程,采用高效的匯編語(yǔ)言實(shí)現(xiàn),盡可能地減少上下文切換的時(shí)間開銷,確保系統(tǒng)能夠快速響應(yīng)各種任務(wù)的需求,保障無(wú)人機(jī)的高性能運(yùn)行。
3.2優(yōu)先級(jí)反轉(zhuǎn)問題及解決
①問題呈現(xiàn):在多任務(wù)系統(tǒng)中,優(yōu)先級(jí)反轉(zhuǎn)是一個(gè)可能出現(xiàn)的棘手問題,就像一場(chǎng)混亂的交通堵塞,高優(yōu)先級(jí)的任務(wù)被低優(yōu)先級(jí)的任務(wù)阻擋,無(wú)法順利前行。在大疆嵌入式系統(tǒng)中,當(dāng)多個(gè)任務(wù)共享資源時(shí),就有可能發(fā)生優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象。例如,假設(shè)無(wú)人機(jī)系統(tǒng)中有三個(gè)任務(wù):任務(wù) A 是高優(yōu)先級(jí)的飛控指令處理任務(wù),它負(fù)責(zé)根據(jù)傳感器數(shù)據(jù)實(shí)時(shí)調(diào)整無(wú)人機(jī)的飛行姿態(tài),對(duì)實(shí)時(shí)性要求極高;任務(wù) B 是中優(yōu)先級(jí)的影像數(shù)據(jù)處理任務(wù),它負(fù)責(zé)對(duì)相機(jī)拍攝的圖像進(jìn)行實(shí)時(shí)處理和傳輸;任務(wù) C 是低優(yōu)先級(jí)的設(shè)備狀態(tài)監(jiān)測(cè)任務(wù),它定期檢查無(wú)人機(jī)的各個(gè)設(shè)備狀態(tài)。
在某一時(shí)刻,任務(wù) C 正在執(zhí)行,并占用了一個(gè)共享資源(比如一個(gè)用于數(shù)據(jù)存儲(chǔ)的緩沖區(qū))。此時(shí),任務(wù) A 等待的事件發(fā)生,任務(wù) A 獲得 CPU 使用權(quán)開始執(zhí)行。但當(dāng)任務(wù) A 執(zhí)行到需要訪問任務(wù) C 占用的共享資源時(shí),由于資源被占用,任務(wù) A 不得不掛起,等待任務(wù) C 釋放資源。而在任務(wù) C 執(zhí)行過程中,任務(wù) B 進(jìn)入就緒態(tài),由于任務(wù) B 的優(yōu)先級(jí)高于任務(wù) C,任務(wù) B 剝奪任務(wù) C 的 CPU 使用權(quán)開始執(zhí)行。這樣就導(dǎo)致了高優(yōu)先級(jí)的任務(wù) A 需要等待低優(yōu)先級(jí)的任務(wù) C 釋放資源,而在等待期間,中優(yōu)先級(jí)的任務(wù) B 卻先于任務(wù) A 執(zhí)行,使得任務(wù) A 的執(zhí)行被延遲。
這種優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象對(duì)大疆嵌入式系統(tǒng)的危害是巨大的。在無(wú)人機(jī)飛行過程中,飛控指令處理任務(wù)的延遲可能會(huì)導(dǎo)致無(wú)人機(jī)無(wú)法及時(shí)響應(yīng)飛行姿態(tài)的變化,增加飛行失控的風(fēng)險(xiǎn);影像數(shù)據(jù)處理任務(wù)的延遲可能會(huì)導(dǎo)致圖像傳輸不及時(shí),影響操作人員對(duì)無(wú)人機(jī)飛行狀態(tài)的實(shí)時(shí)監(jiān)控;設(shè)備狀態(tài)監(jiān)測(cè)任務(wù)雖然優(yōu)先級(jí)較低,但如果因?yàn)閮?yōu)先級(jí)反轉(zhuǎn)導(dǎo)致其長(zhǎng)時(shí)間無(wú)法執(zhí)行,也可能會(huì)使無(wú)人機(jī)在出現(xiàn)設(shè)備故障時(shí)無(wú)法及時(shí)被發(fā)現(xiàn)和處理,從而影響無(wú)人機(jī)的整體性能和安全性。
②解決方案分析:為了解決優(yōu)先級(jí)反轉(zhuǎn)問題,大疆在其 RTOS 系統(tǒng)中采用了優(yōu)先級(jí)繼承和優(yōu)先級(jí)天花板等機(jī)制。
優(yōu)先級(jí)繼承機(jī)制就像是給低優(yōu)先級(jí)任務(wù) “穿上了高優(yōu)先級(jí)的外衣”,讓它暫時(shí)擁有高優(yōu)先級(jí)任務(wù)的權(quán)力,盡快完成資源的使用并釋放資源。當(dāng)?shù)蛢?yōu)先級(jí)任務(wù)占用了高優(yōu)先級(jí)任務(wù)需要的資源時(shí),并且高優(yōu)先級(jí)任務(wù)正在等待該資源,系統(tǒng)會(huì)臨時(shí)將低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)提升到與高優(yōu)先級(jí)任務(wù)相同的水平。在上述例子中,當(dāng)任務(wù) A 等待任務(wù) C 占用的共享資源時(shí),任務(wù) C 的優(yōu)先級(jí)會(huì)被提升到與任務(wù) A 相同。這樣,任務(wù) C 就不會(huì)被任務(wù) B 搶占 CPU 使用權(quán),能夠盡快執(zhí)行并釋放資源,任務(wù) A 也就能盡快獲得資源繼續(xù)執(zhí)行,從而避免了優(yōu)先級(jí)反轉(zhuǎn)帶來(lái)的延遲。當(dāng)任務(wù) C 釋放資源后,它的優(yōu)先級(jí)會(huì)恢復(fù)到原來(lái)的低優(yōu)先級(jí)水平。
優(yōu)先級(jí)天花板機(jī)制則是從資源的角度出發(fā),為每個(gè)共享資源設(shè)定一個(gè)固定的優(yōu)先級(jí)天花板。這個(gè)優(yōu)先級(jí)天花板等于或者高于所有可能訪問該資源的任務(wù)的最高優(yōu)先級(jí)。當(dāng)一個(gè)任務(wù)想要訪問某個(gè)共享資源時(shí),如果它的優(yōu)先級(jí)低于該資源的優(yōu)先級(jí)天花板,系統(tǒng)會(huì)將其優(yōu)先級(jí)臨時(shí)提升到優(yōu)先級(jí)天花板的水平。在無(wú)人機(jī)系統(tǒng)中,如果共享資源(如數(shù)據(jù)緩沖區(qū))的優(yōu)先級(jí)天花板被設(shè)定為高于任務(wù) A、B、C 的優(yōu)先級(jí),那么當(dāng)任務(wù) C 訪問該資源時(shí),任務(wù) C 的優(yōu)先級(jí)會(huì)被提升到優(yōu)先級(jí)天花板的水平。這樣,在任務(wù) C 占用資源期間,其他任務(wù)(如任務(wù) B)即使進(jìn)入就緒態(tài),也無(wú)法搶占任務(wù) C 的 CPU 使用權(quán),因?yàn)槿蝿?wù) C 此時(shí)的優(yōu)先級(jí)是最高的。只有當(dāng)任務(wù) C 釋放資源后,其優(yōu)先級(jí)才會(huì)恢復(fù)正常,其他任務(wù)才有機(jī)會(huì)競(jìng)爭(zhēng) CPU 使用權(quán)。通過這種方式,優(yōu)先級(jí)天花板機(jī)制有效地避免了優(yōu)先級(jí)反轉(zhuǎn)問題,確保了高優(yōu)先級(jí)任務(wù)能夠及時(shí)獲得所需資源并執(zhí)行,提高了系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性。
Part4.嵌入式面試總結(jié)
4.1 RTOS 任務(wù)有哪些狀態(tài)
RTOS 中的任務(wù)通常有以下幾種狀態(tài):就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)和掛起狀態(tài)。
就緒狀態(tài)表示任務(wù)已經(jīng)準(zhǔn)備好執(zhí)行,只等待被調(diào)度器選中。當(dāng)一個(gè)任務(wù)被創(chuàng)建或者從阻塞狀態(tài)恢復(fù)時(shí),它會(huì)進(jìn)入就緒狀態(tài)。
運(yùn)行狀態(tài)表示任務(wù)正在執(zhí)行。在 RTOS 中,通常只有一個(gè)任務(wù)處于運(yùn)行狀態(tài),其他任務(wù)處于就緒、阻塞或掛起狀態(tài)。
阻塞狀態(tài)表示任務(wù)正在等待某個(gè)事件的發(fā)生,如等待一個(gè)信號(hào)量、等待一個(gè)消息隊(duì)列中的消息等。當(dāng)任務(wù)等待的事件發(fā)生時(shí),它會(huì)從阻塞狀態(tài)恢復(fù)到就緒狀態(tài)。
掛起狀態(tài)表示任務(wù)被暫停執(zhí)行,不會(huì)被調(diào)度器選中。掛起狀態(tài)通常用于暫時(shí)停止一個(gè)任務(wù)的執(zhí)行,以便進(jìn)行調(diào)試、維護(hù)或其他操作。當(dāng)任務(wù)需要恢復(fù)執(zhí)行時(shí),可以從掛起狀態(tài)恢復(fù)到就緒狀態(tài)。
不同的 RTOS 可能會(huì)有一些細(xì)微的差別,但總體上任務(wù)的狀態(tài)可以分為這幾種。了解任務(wù)的狀態(tài)對(duì)于開發(fā)實(shí)時(shí)應(yīng)用程序非常重要,因?yàn)樗梢詭椭_發(fā)人員更好地理解任務(wù)的執(zhí)行流程和系統(tǒng)的行為。
4.2 RTOS 任務(wù)狀態(tài)如何變化
RTOS 任務(wù)的狀態(tài)變化通常由以下幾種情況引起:
當(dāng)任務(wù)被創(chuàng)建時(shí),它會(huì)進(jìn)入就緒狀態(tài),等待被調(diào)度器選中執(zhí)行。如果任務(wù)在執(zhí)行過程中需要等待某個(gè)事件的發(fā)生,如等待一個(gè)信號(hào)量、等待一個(gè)消息隊(duì)列中的消息等,它會(huì)從運(yùn)行狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)。當(dāng)任務(wù)等待的事件發(fā)生時(shí),它會(huì)從阻塞狀態(tài)恢復(fù)到就緒狀態(tài)。
如果任務(wù)在執(zhí)行過程中被更高優(yōu)先級(jí)的任務(wù)搶占,它會(huì)從運(yùn)行狀態(tài)轉(zhuǎn)換為就緒狀態(tài)。當(dāng)更高優(yōu)先級(jí)的任務(wù)執(zhí)行完成后,調(diào)度器會(huì)重新選擇任務(wù)執(zhí)行,如果原來(lái)的任務(wù)仍然是最高優(yōu)先級(jí)的就緒任務(wù),它會(huì)再次進(jìn)入運(yùn)行狀態(tài)。
如果任務(wù)被掛起,它會(huì)從就緒狀態(tài)或運(yùn)行狀態(tài)轉(zhuǎn)換為掛起狀態(tài)。當(dāng)任務(wù)需要恢復(fù)執(zhí)行時(shí),可以從掛起狀態(tài)恢復(fù)到就緒狀態(tài)。
此外,任務(wù)還可以通過調(diào)用特定的函數(shù)來(lái)主動(dòng)改變自己的狀態(tài)。例如,任務(wù)可以調(diào)用函數(shù)將自己掛起,或者調(diào)用函數(shù)將自己從阻塞狀態(tài)恢復(fù)到就緒狀態(tài)。
了解任務(wù)狀態(tài)的變化對(duì)于開發(fā)實(shí)時(shí)應(yīng)用程序非常重要,因?yàn)樗梢詭椭_發(fā)人員更好地理解任務(wù)的執(zhí)行流程和系統(tǒng)的行為,從而更好地進(jìn)行任務(wù)調(diào)度和系統(tǒng)優(yōu)化。
4.3 RTOS 任務(wù)調(diào)度如何滿足實(shí)時(shí)性要求
為了滿足實(shí)時(shí)性要求,RTOS 的任務(wù)調(diào)度需要采取一系列措施。首先,任務(wù)調(diào)度算法需要能夠快速地響應(yīng)任務(wù)的優(yōu)先級(jí)變化和事件的發(fā)生。例如,當(dāng)一個(gè)高優(yōu)先級(jí)的任務(wù)就緒時(shí),調(diào)度器需要能夠立即暫停當(dāng)前正在執(zhí)行的任務(wù),切換到高優(yōu)先級(jí)的任務(wù)執(zhí)行。
其次,任務(wù)調(diào)度需要保證關(guān)鍵任務(wù)能夠在規(guī)定的時(shí)間內(nèi)完成。這可以通過合理地設(shè)置任務(wù)的優(yōu)先級(jí)、使用合適的調(diào)度算法以及優(yōu)化任務(wù)的執(zhí)行時(shí)間等方式來(lái)實(shí)現(xiàn)。例如,對(duì)于一些關(guān)鍵的控制任務(wù),可以將它們的優(yōu)先級(jí)設(shè)置得非常高,以確保它們能夠及時(shí)得到執(zhí)行。
此外,RTOS 還可以采用一些技術(shù)來(lái)提高任務(wù)調(diào)度的實(shí)時(shí)性。例如,可以使用中斷處理機(jī)制來(lái)快速響應(yīng)外部事件的發(fā)生;可以使用定時(shí)器來(lái)精確地控制任務(wù)的執(zhí)行時(shí)間;可以使用多核處理器來(lái)并行執(zhí)行多個(gè)任務(wù),提高系統(tǒng)的處理能力。

























