汽車軟件RTOS概念——進程,線程,任務

一、前言

一般看《計算機操作系統》的書籍,都會有進程(Process),線程(Thread)的概念。但是在嵌入式RTOS裏面,比如應用於汽車軟件的OSEK/VDX Operating System Specification 2.2.3規範裏沒有這兩個概念,有的是任務(Task)。那麼這三個概念是什麼關係呢?本文闡述一下作者的理解。

 

二、進程的概念:

進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是系統進行資源分配和調度的基本單位。進程是一個動態的概念,是一個活動的實體。

  1. “獨立功能”表示進程是面向使用者的定義,它關心的是要做什麼?比如,在電腦上我要寫一篇文章,打開Word。那麼計算機就會創建一個Microsoft Word的進程,如果我想同步寫兩篇文章,就要再打開一個Word,計算機就又創建一個Microsoft Word的進程。

普通的計算機機可以同步做幾件事情,比如“上網”,“看電影”,“打遊戲”,就是說可以運行很多進程。但是嵌入式計算機通常設計成只做一件事情,比如在汽車領域,整車控制器VCU,發動機噴油點火控制器ECU,變速箱換擋控制器TCU,車身控制器BCM等。這樣類比,傳統的一個電子控制單元ECU相當於只運行一個進程。未來的XCU就是可以運行多進程的ECU

  1. “資源分配”表示進程操作的對象,它關心的是用什麼做?比如整車控制器VCU,

輸入資源:加速踏板傳感器,剎車踏板傳感器等

輸出資源:驅動水泵的PWM模塊等

通信資源:與TCU,EMS交互數據的CAN通信等。

     2. 每個具體的電氣資源都會抽象成軟件裏面的一個具體對象(變量)。

 

 3. “資源調度”表示進程操作對象的方法,它關心的是怎麼用?調度是操作系統的核心,如果沒有調度,就算給ECU通電,執行器也不能動作,就不能實現控制功能。

調度的過程是多樣的,怎樣調度才能最有效的利用資源是軟件設計師要考慮的問題。在所有資源中,“CPU”資源是最核心的資源。傳感器不夠了,可以擴展電路增加一個。但是在單CPU系統中,特別的又只有一個Core,不可能簡單的增加一個CPU,這無異於重新設計一個ECU系統。而在原來的CPU上增加一個Core,不是ECU開發商能做的事情。圍繞如何有效的利用“CPU資源”,引入了線程。

三、線程的概念

線程(英語:thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。

  1. “運算調度”,表示線程是面向運算器的,即CPU的。在這個層面上,它只關心CPU一個資源,其它的資源不考慮。
  2. “最小單位”,表示一旦被定義爲線程,就不應該再向下分子線程了,如果可以分那麼在設計程序時應該先分。比如,某個Thread_10ms(),分析發現當中的某些邏輯執行週期應該是2ms,那麼就應該把它拆分成Thread_10ms()和Thread_2ms()
  3. “單一順序流”,表示一個線程一旦啓動,它就應該按順序從頭執行完。如果中間被暫停應該記錄暫停點,等恢復後從暫停點繼續執行。如果恢復後沒有從暫停點繼續執行,應該爲錯誤。
  4. “不同的任務”,表示一個任務只能交給一個線程執行。否則的話,會導致非預期的結果。比如,有一個任務Task_Printf(“Hello World”),當把它單獨掛在10ms進程裏,那麼屏幕上每隔10ms輸出一個“Hello World”;當把它單獨掛在2ms進程裏,那麼屏幕上每隔2ms輸出一個“Hello World”。但是在一個可搶佔式操作系統裏,如果把它們都掛在2個線程裏,2ms任務可能會搶佔10ms任務。屏幕上可能會輸出“Hello Wo Hello World rld”等奇怪的字符串。
Thread_10ms()
{
    Task_Printf(“Hello World”);
}

Thread_2ms()
{
    Task_Printf(“Hello World”);
}

四、任務的概念

         筆者翻了很多資料和文章,發現對任務的定義可謂五花八門,例如:

百度的定義:

多道程序多進程環境中,要由計算機來完成的基本工作元,它是由控制程序處理的一 個或多個指令序列。

OSEK OS 2.2.3的定義:

複雜的控制軟件可以方便地細分爲根據其實時性要求執行的部件。這些部件可以通過任務來實現。任務提供了執行功能的框架。操作系統提供任務的併發和異步執行。調度程序組織任務執行的順序。

μCOS-III的定義:

任務(也稱爲線程)是一個簡單的程序,認爲它本身具有中央處理器(CPU)。在單個CPU上,任何給定時間只能執行一個任務。

任務看起來就像任何其他C函數一樣,除了一些小的區別。任務有兩種類型:完成運行(清單5-1)和無限循環(清單5-2)。在大多數嵌入式系統中,任務通常採取無限循環的形式。同樣,不允許任何任務像其他C函數一樣返回。鑑於任務是常規C函數,它可以聲明局部變量。

TASKING-OS的定義

任務是具有特定目的的半獨立程序段。大多數現代的實時應用程序需要多個任務。任務提供了執行功能的框架。 RTOS提供任務的併發和異步執行。調度程序組織任務執行的順序,包括一種在沒有其他系統或應用程序功能處於活動狀態時處於活動狀態的機制:空閒機制。

任務具有靜態優先級,是否可以被搶佔,可以或不能進入等待狀態,是否是或不是優先級的唯一所有者,依此類推。

SylixOS的定義

         總結下來,在通用計算機操作系統裏,只強調進程和線程的概念。而在嵌入式操作系統裏,任務就是線程的意思。怎麼會這樣呢?這是因爲一個嵌入式系統設計爲只實現一個具體功能的是專用計算機系統,在通用計算機系統只相當於一個進程。而且,通用計算機的一個進程可衍生出幾個獨立進程,好比你可以打開兩個Word文檔交互編輯。但是,一個汽車ECU不可能用軟件複製的方法控制兩臺發動機。所以,在一般的嵌入式系統裏說進程沒有意義(智能手機等多用途設備除外)。從事嵌入式開發的很多都不是計算機專業科班出身的,大多數是電子技術專業畢業,因爲硬件開發需要才轉入研究嵌入式計算機系統,而線程是計算機術語,沒有進程的襯托,一般人不好理解。而任務本身就面向人的詞語,所以在大多數嵌入式RTOS裏都只講任務(Task)

         然而,筆者覺得還是有必要從計算機術語的角度對這些概念加以清晰的理解。理由有兩點:

  • 嵌入式系統的功能逐漸強大,越來越接近通用計算機功能,比如智能手機。在汽車電子領域,XCU是發展的方向,一個XCU肯定是多進程的,光定義任務不夠,還要定義它屬於發動機,或者變速箱。
  • 任務和線程還是不一樣的。比如下面這兩句話。

老闆給員工說:“你到我辦公室來一下”

老闆給員工說:“你5點鐘到我辦公室來一下”

定義“到辦公室來”是任務。第一句話沒有調度的概念,就是沒有線程,什麼時候“到辦公室來”沒有講(這裏不附加默認是現在的意義),那麼員工在任何時候都可以去辦公室,所以這個任務的執行是不確定的。第二句話,增加了調度時刻“5點鐘”,那麼這件事情就清晰了。從而,我們可以嚴格定義進程、線程、任務的關係。

五、OSEK OS的Application modes

         筆者不打算推翻嵌入RTOS的概念,當然也沒有這個必要。在面對計算機時,軟件工程師一般都清楚他要做什麼,雖然表達上又差異,但不影響對內涵的理解。就像有人喜歡叫“貓”,有人喜歡叫“咪”,都是同一個事情。注意到,在OSEK OS裏有Application modes的概念

       應用程序模式旨在允許OSEK操作系統在不同的操作模式下運行。許多ECU可能會執行完全獨立的應用程序,例如工廠測試,Flash編程或正常運行。應用模式是一種根據這些不同條件構造在ECU中運行的軟件的方法,並且是開發完全獨立的系統的簡潔機制。通常,每種應用程序模式都使用其自己的所有任務,ISR,警報和計時條件的子集,儘管在不同模式下運行任務或ISR不受限制。如果再次需要相同的功能,建議在不同模式之間共享任務/ ISR /警報。

       這看起來有點兒像“進程”的概念,前面我們說一個執行特定功能的ECU只有一個進程,但這個只是主進程。一個只有主進程的ECU功能上還是受限制的。比如,ECU在出廠前要測試功能,執行測試的程序肯定與正常工作的程序不一樣。舊的程序需要被更新到新的程序,此時需要切換到Boot程序裏運行。這實際上就是不同的進程。只是,嵌入式軟件裏的進程和通用計算機裏的進程還不一樣。

通用計算機裏的進程執行到一半可以切換到另一個進程,比如打字到一半不關閉Word,而切換到看電影。在汽車裏面,發動機控制器程序運行到一半暫停,跑到Boot模式,過一會兒再切回發動機控制器程序繼續運行?這個在技術上也可以做到,但是肯定不會這樣幹。有幾個理由:

  1. 帶來安全問題
  2. Boot和App程序要分配獨立RAM空間保存各自狀態,浪費資源
  3. 沒有必要,從頭開始運行App程序到執行到某個斷點也就幾十到幾百毫秒,保護現場的進程切換節省不了多少時間。
  4. 達不到控制目的,汽車軟件的一個程序只要運行中停止了,無論是主動的行爲還是被動的異常,都會導致當前功能的喪失。程序必須要重新運行才能重啓功能。

第4條是最主要的功能,所以汽車軟件的進程就三個狀態。這樣就不需要進程控制塊,不需要進程棧。必須要先結束一個進程才能切換到另一個進程。

六、AutoSar OSOsApplication

在AutoSarOS標準裏新增加了OsApplication的概念,乍一看和OSEK OS的Application modes一樣, AUTOSAR OS必須能夠支持構成內聚功能單元的一系列操作系統對象(任務,ISR,警報,計劃表,計數器)。該對象集合稱爲OS應用程序。但本質上是不一樣的。

AutoSarOS引入OS-Application的目的是爲了防止程序的錯誤傳播,引入Trusted OS-A和Non-trusted OS-A屬於功能安全的要求。Non-trusted OS-A可以訪問Trusted OS-A,反之不可。這類似於面向對象編程的“public”和“private”屬性。Private可訪問public對象,反之不可。

一個OS Application mode下面可以有很多個OS-Application, OS-Application不是運行實體。它只是定義了資源的隸屬關係,當某個調度表/任務訪問某個資源的時候,要首先判定我沒有這個權限?這個權限來自一張靜態定義的OS Application表。

與OS Application類似的是,汽車診斷規範裏定義了不同的會話模式能訪問的診斷服務的權限。例如,默認會話下不能調用$27服務。但會話模式既不是一個進程,也不是一個OS Application,這個純粹是軟件設計邏輯,與用什麼操作系統沒關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章