1. 程式人生 > >嵌入式Linux基礎知識0(什麼是真正的實時作業系統--硬實時 軟實時)

嵌入式Linux基礎知識0(什麼是真正的實時作業系統--硬實時 軟實時)

需求說明:IPC專案需要Linux系統,知識儲備

來自:http://blog.csdn.net/zhourui1982/article/details/5282361

閱讀精華整理:

1、根據實際應用,可以選擇採用硬實時作業系統或軟實時作業系統,硬實時當然比軟實時好,但是,如果你的公司正在準備開發一款商用軟體,那請你注意了,業界公認比較好的VxWorks(WindRiver開發),會花光你本來就很少的銀子,而軟實時的作業系統,如某些實時Linux,一般是開源免費的,我們公司本來的產品就是基於VxWorks的,現在業界都在Cost Reduction,為了響應號召,正在調研如何把平臺換成免費的嵌入式實時Linux。同學們,如何選擇,自己考慮吧:-)

2、硬實時 - 代表產品 VxWorks

舉一個經常使用的例項,中高檔汽車中使用的氣囊。當報告車輛碰撞的感測器中斷CPU後,作業系統應快速地分配展開氣囊的任務,並且不允許任何其他非實時處理進行干擾,晚一秒鐘展開氣囊比沒有氣囊的情況更糟糕,這就是一個典型的必須使用硬實時的系統。

硬實時系統指系統要有確保的最壞情況下的服務時間,即對於事件的響應時間的截止期限是無論如何都必須得到滿足。

3、軟實時 - 代表產品 軟實時Linux

再舉一個例項,IPTV數字電視機頂盒,需要實時的處理(解碼)視訊流,如果丟失了一個或幾個視訊幀,顯然會造成視訊的品質更差,但是隻要做過簡單的抖動處理的系統,丟失幾個視訊幀就不會對整個系統造成不可挽救的影響。

軟實時系統就是那些從統計的角度來說,一個任務能夠得到有確保的處理時間,到達系統的事件也能夠在截止期限到來之前得到處理,但違反截止期限並不會帶來致命的錯誤。

4、請注意:講到這裡,想花點墨水區分一下實時和嵌入式的概念,因為筆者也長時間把這兩者混為一談。實時作業系統的概念上文已經講的很清楚了,主要就是要能確定性的滿足時間要求。嵌入式系統很難下一個定義,有興趣的可以百科一下“嵌入式系統”,一般可以認為是板子或晶片上軟硬體的總和,嵌入式系統一定要對實時任務有很強的支援能力,所以一般嵌入式系統都會採用實時作業系統,根據不同應用,選擇採用硬實時或軟實時

5、如何衡量一個實時作業系統的實時效能?

指標1、中斷響應時間(可遮蔽中斷)

指標2、任務切換時間

6、實時作業系統的核心 - 任務排程(VxWorks)

既然實時性對於實時作業系統如此重要,同學們,我們下面就來學習一下實現實時性的核心模組 - 任務排程。筆者所在的公司花了大把銀子購買風河的VxWorks,但是為了實現自己的可控性,除了任務排程模組以外全部重寫,包括記憶體管理、檔案管理等其他核心模組,但唯獨任務排程模組除外,這可是人家的壓箱底法寶:-)

構成應用軟體系統的程式集合中,獨立的、相互作用的程式單元,在其執行時稱之為任務,從系統的角度來看,任務是競爭系統資源的最小執行單元。單個CPU 中,多工機制製造了一個多個任務同時執行的假象。其實系統只是根據一個多工排程演算法,將核心插入到這些任務中執行。實時系統VxWorks的一個任務可有多種狀態,但最基本的狀態有以下四種:

1) 就緒態(Ready):任務只等待系統分配CUP資源。

2) 掛起態(Pend):任務需等待某些不可利用的資源而被阻塞。
3) 休眠態(Sleep):如果系統不需要某一個任務工作,則這個任務處於休眠狀態。
4) 延遲態(Delay):任務被延遲時所處的狀態。

7、任務由系統核心排程執行一段固定長度的時間,稱為時間片。排程是指為任務分配資源和時間,使系統滿足特定的效能要求。排程演算法的目的是在正常情況下,儘可能滿足所有任務的時限:在峰值負載條件下,保證強實時任務滿足時限。因為時限是區分實時系統和非實時系統的關鍵因素,因此排程演算法是實時系統的基本問題。實時作業系統所具有的執行效能,如吞吐量的大小、週轉時間的長短、相應的及時性和可預測性等在很大程度上都取決於實時排程。

程序排程可採用下述兩種方式:

1. 非搶佔方式。採用這種排程方式,一旦把處理機分配給某程序後,便讓該程序一直執行,直到該程序完成或發生某事件而被阻塞,才再把處理機分配給其他程序,決不允許某程序搶佔已經分配出去的處理機。顯然它難於滿足緊急任務的要求,實時系統中不宜採用這種排程方式。

2. 搶佔方式。允許排程程式根據某種原則,去停止某個正在執行的程序,將已分配給該程序的處理機,重新分配給另一程序。搶佔的原則有:

- 時間片原則。各程序按時間片執行,當一個時間片用完後,便停止該程序的執行而重新進行排程。

- 優先權原則。當一個程序到來時,如果其優先順序比正在執行的程序的優先順序高,便停止正在執行的程序,將處理機分配給優先順序高的程序,使之執行。實時系統中一般採用基於優先順序的搶佔式排程和輪轉排程的程序排程和中程排程相結合的排程策略。因此既可具有較大的靈活性,又能獲得極小的排程延遲。

文章原文

做嵌入式系統開發有一段時間了,做過用於手機平臺的嵌入式Linux,也接觸過用於交換機、媒體閘道器平臺的VxWorks,實際應用後回過頭來看理論,才發現自己理解的膚淺,也發現CSDN上好多同學們都對實時、嵌入式這些概念似懂非懂,畢竟如果不做類似的產品,平時接觸的機會很少,即使做嵌入式產品開發,基本也是隻管呼叫Platform team封裝好的API。所以在此總結一下這些概念,加深自己的理解,同時也給新手入門,歡迎大家拍磚,爭取寫個連載,本文先總結一下實時的概念,什麼是真正的實時作業系統?

1. 首先說一下實時的定義及要求:

參見 Donal Gillies 在 Realtime Computing FAQ 中提出定義:實時系統指系統的計算正確性不僅取決於計算的邏輯正確性,還取決於產生結果的時間。如果未滿足系統的時間約束,則認為系統失效。
http://www.faqs.org/faqs/realtime-computing/faq/

一個實時作業系統面對變化的負載(從最小到最壞的情況)時必須確定性地保證滿足時間要求。請注意,必須要滿足確定性,而不是要求速度足夠快!例如,如果使用足夠強大的CPU,Windows在CPU空閒時可以提供非常短的典型中斷響應,但是,當某些後臺任務正在執行時,有時候響應會變得非常漫長,以至於某一個簡單的讀取檔案的任務會長時間無響應,甚至直接掛死。這是一個基本的問題:並不是Windows不夠快或效率不夠高,而是因為它不能提供確定性所以,Windows不是一個實時作業系統

根據實際應用,可以選擇採用硬實時作業系統或軟實時作業系統,硬實時當然比軟實時好,但是,如果你的公司正在準備開發一款商用軟體,那請你注意了,業界公認比較好的VxWorks(WindRiver開發),會花光你本來就很少的銀子,而軟實時的作業系統,如某些實時Linux,一般是開源免費的,我們公司本來的產品就是基於VxWorks的,現在業界都在Cost Reduction,為了響應號召,正在調研如何把平臺換成免費的嵌入式實時Linux。同學們,如何選擇,自己考慮吧:-)

硬實時 - 代表產品 VxWorks

舉一個經常使用的例項,中高檔汽車中使用的氣囊。當報告車輛碰撞的感測器中斷CPU後,作業系統應快速地分配展開氣囊的任務,並且不允許任何其他非實時處理進行干擾,晚一秒鐘展開氣囊比沒有氣囊的情況更糟糕,這就是一個典型的必須使用硬實時的系統。

硬實時系統指系統要有確保的最壞情況下的服務時間,即對於事件的響應時間的截止期限是無論如何都必須得到滿足。

軟實時 - 代表產品 軟實時Linux

再舉一個例項,IPTV數字電視機頂盒,需要實時的處理(解碼)視訊流,如果丟失了一個或幾個視訊幀,顯然會造成視訊的品質更差,但是隻要做過簡單的抖動處理的系統,丟失幾個視訊幀就不會對整個系統造成不可挽救的影響。

軟實時系統就是那些從統計的角度來說,一個任務能夠得到有確保的處理時間,到達系統的事件也能夠在截止期限到來之前得到處理,但違反截止期限並不會帶來致命的錯誤。

---------------------------------------------

請注意:講到這裡,想花點墨水區分一下實時和嵌入式的概念,因為筆者也長時間把這兩者混為一談。實時作業系統的概念上文已經講的很清楚了,主要就是要能確定性的滿足時間要求。嵌入式系統很難下一個定義,有興趣的可以百科一下“嵌入式系統”,一般可以認為是板子或晶片上軟硬體的總和,嵌入式系統一定要對實時任務有很強的支援能力,所以一般嵌入式系統都會採用實時作業系統,根據不同應用,選擇採用硬實時或軟實時。

---------------------------------------------

2. 如何衡量一個實時作業系統的實時效能?

主要有以下兩個重要指標:

指標1、中斷響應時間(可遮蔽中斷)

計算機接收到中斷訊號到作業系統作出響應,並完成切換轉入中斷服務程式的時間。對於搶先式核心,要先呼叫一個特定的函式,該函式通知核心即將進行中斷服務,使得核心可以跟蹤中斷的巢狀。搶先式核心的中斷響應時間由下式給出:
中斷響應時間=關中斷的最長時間+保護CPU 內部暫存器的時間+進入中斷服務函式的執行時間+開始執行中斷服務例程(ISR)的第一條指令時間

請注意:中斷響應時間是系統在最壞情況下響應中斷的時間,某系統100次中有99次在50ms之內響應中斷,只有一次響應中斷的時間是250ms,只能認為中斷響應時間是250ms。

指標2、任務切換時間

除為中斷處理提供確定性外,實時處理也需要支援週期性間隔的任務排程。大量控制系統要求週期性取樣與處理。某個特定任務必須按照固定的週期(p)執行,從而確保系統的穩定性。考慮一下汽車的防抱死系統(ABS)。控制系統對車輛的每個車輪的轉速進行取樣(每秒最多 20 次)並控制每個制動器的壓力(防止它鎖死)。為了保持控制系統的正常工作,感測器的取樣與控制必須按照一定的週期間隔。這意味著必須搶佔其他處理,以便 ABS 任務能按照期望的週期執行。

當多工核心決定執行另外的任務時,它把正在執行任務的當前狀態(即CPU 暫存器中的全部內容)儲存到任務自己的棧區之中。然後把下一個將要執行的任務的當前狀態從該任務的棧中重新裝入CPU 的暫存器,並開始下一個任務的執行。這個過程就稱為任務切換。做任務切換所需要的時間取決於CPU 有多少暫存器要入棧。CPU 的暫存器越多,額外負荷就越重。

系統實時效能重要指標的典型值
-----------------------------------------------------
                  VxWorks    uC/OS-II        RT-Linux2.0  QNX6  
硬體平臺  MC68000  33MHz-486  60MHz-486   33MHz-486  
任務切換  3.8us          < 9us            不詳                12.57us  
中斷響應  < 3us          < 7.5us         25us                7.54us  
-----------------------------------------------------

參考文獻:《4種實時作業系統實時性的分析對比》 - 百度一下可以搜到

3. 實時作業系統的核心 - 任務排程(VxWorks)

既然實時性對於實時作業系統如此重要,同學們,我們下面就來學習一下實現實時性的核心模組 - 任務排程。筆者所在的公司花了大把銀子購買風河的VxWorks,但是為了實現自己的可控性,除了任務排程模組以外全部重寫,包括記憶體管理、檔案管理等其他核心模組,但唯獨任務排程模組除外,這可是人家的壓箱底法寶:-)

構成應用軟體系統的程式集合中,獨立的、相互作用的程式單元,在其執行時稱之為任務,從系統的角度來看,任務是競爭系統資源的最小執行單元。單個CPU 中,多工機制製造了一個多個任務同時執行的假象。其實系統只是根據一個多工排程演算法,將核心插入到這些任務中執行。實時系統VxWorks的一個任務可有多種狀態,但最基本的狀態有以下四種:

1) 就緒態(Ready):任務只等待系統分配CUP資源。
2) 掛起態(Pend):任務需等待某些不可利用的資源而被阻塞。
3) 休眠態(Sleep):如果系統不需要某一個任務工作,則這個任務處於休眠狀態。
4) 延遲態(Delay):任務被延遲時所處的狀態。

大家可以在網上搜一下VxWorks任務排程的相關文章,一般都會配狀態機圖。

----------------------------

請注意:任務(task)、程序(process)、執行緒(thread)等概念相互聯絡又相互區別,因為不是本文的重點,這裡不多解釋,如果想詳細瞭解推薦看一看“Windows Kernel Programming”。在VxWorks中,因為每個任務沒有自己獨立的虛擬記憶體空間,可以把任務理解為執行緒。 

----------------------------

任務由系統核心排程執行一段固定長度的時間,稱為時間片。排程是指為任務分配資源和時間,使系統滿足特定的效能要求。排程演算法的目的是在正常情況下,儘可能滿足所有任務的時限:在峰值負載條件下,保證強實時任務滿足時限。因為時限是區分實時系統和非實時系統的關鍵因素,因此排程演算法是實時系統的基本問題。實時作業系統所具有的執行效能,如吞吐量的大小、週轉時間的長短、相應的及時性和可預測性等在很大程度上都取決於實時排程。

程序排程可採用下述兩種方式:

1. 非搶佔方式。採用這種排程方式,一旦把處理機分配給某程序後,便讓該程序一直執行,直到該程序完成或發生某事件而被阻塞,才再把處理機分配給其他程序,決不允許某程序搶佔已經分配出去的處理機。顯然它難於滿足緊急任務的要求,實時系統中不宜採用這種排程方式。

2. 搶佔方式。允許排程程式根據某種原則,去停止某個正在執行的程序,將已分配給該程序的處理機,重新分配給另一程序。搶佔的原則有:

- 時間片原則。各程序按時間片執行,當一個時間片用完後,便停止該程序的執行而重新進行排程。

- 優先權原則。當一個程序到來時,如果其優先順序比正在執行的程序的優先順序高,便停止正在執行的程序,將處理機分配給優先順序高的程序,使之執行。實時系統中一般採用基於優先順序的搶佔式排程和輪轉排程的程序排程和中程排程相結合的排程策略。因此既可具有較大的靈活性,又能獲得極小的排程延遲。

VxWorks的wind核心預設排程機制為基於優先順序的搶佔式排程。採用這種機制時,系統把處理機分配給優先順序最高的程序,使之執行。一旦出現了另一個優先順序更高的程序時,程序排程程式剝奪當前任務的執行,將處理機分配給高優先順序任務。而在相同優先順序的多個任務之間,採用時間片輪轉排程機制。採用這種機制時,當一個任務到達時,它被排在輪轉佇列的後面,等待分配給自己的時間片的到來,如果在時間片內沒有結束,則再等待屬於自己的時間片的到來,直到任務完成。

- 優先順序搶佔式
    採用基於優先順序的搶佔式排程,系統中每個任務都有一個介於最高0到最低255之間的優先順序。任一時刻,系統核心一旦發現一個優先順序更
高的任務轉變為就緒態,核心就儲存當前任務的上下文並把當前任務狀態轉換為阻塞態,同時切換到這個高優先順序任務的上下文執行。
- 輪轉排程演算法
    採用輪轉排程演算法,系統讓處於就緒態的優先順序相同的一組任務依次輪流執行預先確定長度的時間片。這是一種處理機平均分配的方法。如果不使用輪轉排程演算法,優先順序相同的一組任務中第一個獲得處理機的任務將不會被阻塞而獨佔處理機,如果沒有阻塞或其他情況發生,它
不會放棄處理機的使用權。
- 搶佔排程與輪轉排程混合方式
    有時,基於優先順序的搶佔式排程可與輪轉排程相結合。當優先順序相同的一組任務依次輪流平均分配處理機時,若有高優先順序的任務轉變為
就緒態則可搶佔該組任務。直到再一次符合執行條件時,該組任務才可再次共享處理機。
    為了任務控制的靈活性,VxWorks核心還提供了動態優先順序機制,任務的優先順序在執行期間可動態地變化。同時,為了防止優先順序反轉,還具有優先順序繼承機制,通過使用互斥訊號量可以防止高優先順序的任務被迫等待一段不確定時間,直到一個低優先順序任務完成。

參考文獻:《實時作業系統VxWorks的核心任務排程研究》 - 百度一下可以搜到

4. Linux的任務排程

通用Linux系統支援實時和非實時兩種程序,實時程序相對於普通程序具有絕對的優先順序。對應地,實時程序採用SCHED_FIFO或者SCHED_RR排程策略,普通的程序採用SCHED_OTHER排程策略。

在排程演算法的實現上,Linux中的每個任務有四個與排程相關的引數,它們是rt_priority、policy、priority(nice)、counter。排程程式根據這四個引數進行程序排程。

在 SCHED_OTHER排程策略中,排程器總是選擇那個priority+counter值最大的程序來排程執行。從邏輯上分析SCHED_OTHER 排程策略存在著排程週期(epoch),在每一個排程週期中,一個程序的priority和counter值的大小影響了當前時刻應該排程哪一個程序來執行,其中priority是一個固定不變的值,在程序建立時就已經確定,它代表了該程序的優先順序,也代表這該程序在每一個排程週期中能夠得到的時間片的多少;counter是一個動態變化的值,它反映了一個程序在當前的排程週期中還剩下的時間片。在每一個排程週期的開始,priority的值被賦給 counter,然後每次該程序被排程執行時,counter值都減少。當counter值為零時,該程序用完自己在本排程週期中的時間片,不再參與本排程週期的程序排程。當所有程序的時間片都用完時,一個排程週期結束,然後周而復始。另外可以看出Linux系統中的排程週期不是靜態的,它是一個動態變化的量,比如處於可執行狀態的程序的多少和它們priority值都可以影響一個epoch的長短。值得注意的一點是,在2.4以上的核心中,priority被nice所取代,但二者作用類似。

可見SCHED_OTHER排程策略本質上是一種比例共享的排程策略,它的這種設計方法能夠保證程序排程時的公平性--一個低優先順序的程序在每一個epoch中也會得到自己應得的那些CPU執行時間,另外它也提供了不同程序的優先順序區分,具有高priority值的程序能夠獲得更多的執行時間。對於實時程序來說,它們使用的是基於實時優先順序rt_priority的優先順序排程策略,但根據不同的排程策略,同一實時優先順序的程序之間的排程方法有所不同:

- SCHED_FIFO:不同的程序根據靜態優先順序進行排隊,然後在同一優先順序的佇列中,誰先準備好執行就先排程誰,並且正在執行的程序不會被終止直到以下情況發生:1.被有更高優先順序的程序所強佔CPU;2.自己因為資源請求而阻塞;3.自己主動放棄CPU(呼叫sched_yield);

- SCHED_RR:這種排程策略跟上面的SCHED_FIFO一模一樣,除了它給每個程序分配一個時間片,時間片到了正在執行的程序就放棄執行;時間片的長度可以通過sched_rr_get_interval呼叫得到;

由於Linux系統本身是一個面向桌面的系統,所以將它應用於實時應用中時存在如下的一些問題:

- Linux系統中的排程單位為10ms,所以它不能夠提供精確的定時; 
- 當一個程序呼叫系統呼叫進入核心態執行時,它是不可被搶佔的; 
- Linux核心實現中使用了大量的封中斷操作會造成中斷的丟失; 
- 由於使用虛擬記憶體技術,當發生頁出錯時,需要從硬碟中讀取交換資料,但硬碟讀寫由於儲存位置的隨機性會導致隨機的讀寫時間,這在某
些情況下會影響一些實時任務的截止期限; 
- 雖然Linux程序排程也支援實時優先順序,但缺乏有效的實時任務的排程機制和排程演算法;它的網路子系統的協議處理和其它裝置的中斷處理都沒有與它對應的程序的排程關聯起來,並且它們自身也沒有明確的排程機制;

參考文獻:《基於Linux的實時系統》 - 百度一下可以搜到

5. 實時Linux研究

呼哧呼哧寫了半天,終於到了重頭戲,實時Linux研究。前文說過,風河的VxWorks雖然效能大大的好,但是要花很多銀子,對於一般的軟實時應用系統來說,還是用開源免費的實時Linux比較好。筆者所在的公司也正在研究將平臺轉為Linux。有許多種方法可以賦予普通Linux實時的能力:

5.1 瘦核心(微核心)- Thin-Kernel

瘦核心(或微核心)方法使用了第二個核心作為硬體與 Linux 核心間的抽象介面。非實時 Linux 核心在後臺執行,作為瘦核心的一項低優先順序任務託管全部非實時任務。實時任務直接在瘦核心上執行。瘦核心主要用於(除了託管實時任務外)中斷管理。瘦核心擷取中斷以確保非實時核心無法搶佔瘦核心的執行。這允許瘦核心提供硬實時支援。

thin-kernel

雖然瘦核心方法有自己的優勢(硬實時支援與標準 Linux 核心共存),但這種方法也有缺點。實時任務和非實時任務是獨立的,這造成了除錯困難。而且,非實時任務並未得到 Linux 平臺的完全支援(瘦核心執行稱為瘦 的一個原因)。

使用這種方法的例子有 RTLinux (現在由 Wind River Systems 專有),實時應用程式介面(RTAI)和 Xenomai。

5.2 超微核心

這裡瘦核心方法依賴於包含任務管理的最小核心,而超微核心法對核心進行更進一步的縮減。通過這種方式,它不像是一個核心而更像是一個硬體抽象層(HAL)。超微核心為運行於更高級別的多個作業系統提供了硬體資源共享。因為超微核心對硬體進行了抽象,因此它可為更高級別的作業系統提供優先權,從而支援實時性。

對硬體進行抽象的超微核心法

注意,這種方法和執行多個作業系統的虛擬化方法有一些相似之處。使用這種方法的情況下,超微核心在實時和非實時核心中對硬體進行抽象。這與 hypervisor 從客戶(guest)作業系統對裸機進行抽象的方式很相似。

關於超微核心的示例是作業系統的 Adaptive Domain Environment for Operating Systems (ADEOS)。ADEOS 支援多個併發作業系統同步執行。當發生硬體事件後,ADEOS 對鏈中的每個作業系統進行查詢以確定使用哪一個系統處理事件。

5.3 資源核心(Resource-kernel)

另一個實時架構是資源核心法。這種方法為核心增加一個模組,為各種資源提供預留(reservation)。這種機制保證了對時分複用(time- multiplexed)系統資源的訪問(CPU、網路或磁碟頻寬)。這些資源擁有多個預留引數,如迴圈週期、需要的處理時間(也就是完成處理所需的時間),以及截止時間。

實現資源預留的資源核心法

資源核心提供了一組應用程式程式設計介面(API),允許任務請求這些預留資源。然後資源核心可以合併這些請求,使用任務定義的約束定義一個排程,從而提供確定的訪問(如果無法提供確定性則返回錯誤)。通過排程演算法,如 Earliest-Deadline-First (EDF),核心可以處理動態的排程負載。

資源核心法實現的一個示例是 CMU 公司的 Linux/RK,它把可移植的資源核心整合到 Linux 中作為一個可載入模組。這種實現演化成商用的 TimeSys Linux/RT 產品。

5.4 標準的Linux核心最新版本2.6中加入了實時功能

目前探討的這些方法在架構上都很有趣,但是它們都在核心的外圍執行。然而,如果對標準 Linux 核心進行必要的修改使其支援實時性,結果會怎麼樣呢?

今天,在 2.6 核心中,通過對核心進行簡單配置使其完全可搶佔,您就可以得到軟實時功能。在標準 2.6 Linux 核心中,當用戶空間的程序執行核心呼叫時(通過系統呼叫),它便不能被搶佔。這意味著如果低優先順序程序進行了系統呼叫後,高優先順序程序必須等到呼叫結束後才能訪問 CPU。

新的配置選項 CONFIG_PREEMPT 改變了這一核心行為,在高優先順序任務可用的情況下(即使此程序正在進行系統呼叫),它允許程序被搶佔。

允許搶佔的標準 2.6 Linux 核心

但這種配置選項也是一種折衷。雖然此選項實現了軟實時效能並且即使在負載條件下也可使作業系統順利地執行,但這樣做也付出了代價。代價就是略微減低了吞吐量以及核心效能,原因是 CONFIG_PREEMPT 選項增加了開銷。這種選項對桌面和嵌入式系統而言是有用的,但並不是在任何場景下都有用(例如,伺服器)。

在 2.6 核心中另一項有用的配置選項是高精度定時器。這個新選項允許定時器以 1μs 的精度執行(如果底層硬體支援的話),並通過紅黑樹實現對定時器的高效管理。通過紅黑樹,可以使用大量的定時器而不會對定時器子系統(O(log n))的效能造成影響。

只需要一點額外的工作,就可以通過 PREEMPT_RT 補丁實現硬實時。PREEMPT_RT 補丁提供了多項修改,可實現硬實時支援。其中一些修改包括重新實現一些核心鎖定原語,從而實現完全可搶佔,實現核心互斥的優先順序繼承,並把中斷處理程式轉換為核心執行緒以實現執行緒可搶佔。

-------------------------------------------------------------------------

本文就到此告一段落,結合自己的實際專案經驗,總結了實時作業系統的概念,效