一、前言:
一般看《計算機作業系統》的書籍,都會有行程(Process),執行緒(Thread)的概念,但是在嵌入式RTOS里面,比如應用于汽車軟體的OSEK/VDX Operating System Specification 2.2.3規范里沒有這兩個概念,有的是任務(Task),那么這三個概念是什么關系呢?本文闡述一下作者的理解,
二、行程的概念:
行程是一個具有獨立功能的程式關于某個資料集合的一次運行活動,它可以申請和擁有系統資源,是系統進行資源分配和調度的基本單位,行程是一個動態的概念,是一個活動的物體,
- “獨立功能”表示行程是面向使用者的定義,它關心的是要做什么?比如,在電腦上我要寫一篇文章,打開Word,那么計算機就會創建一個Microsoft Word的行程,如果我想同步寫兩篇文章,就要再打開一個Word,計算機就又創建一個Microsoft Word的行程,

普通的計算機機可以同步做幾件事情,比如“上網”,“看電影”,“打游戲”,就是說可以運行很多行程,但是嵌入式計算機通常設計成只做一件事情,比如在汽車領域,整車控制器VCU,發動機噴油點火控制器ECU,變速箱換擋控制器TCU,車身控制器BCM等,這樣類比,傳統的一個電子控制單元ECU相當于只運行一個行程,未來的XCU就是可以運行多行程的ECU
- “資源分配”表示行程操作的物件,它關心的是用什么做?比如整車控制器VCU,
輸入資源:加速踏板傳感器,剎車踏板傳感器等
輸出資源:驅動水泵的PWM模塊等
通信資源:與TCU,EMS互動資料的CAN通信等,
2. 每個具體的電氣資源都會抽象成軟體里面的一個具體物件(變數),

3. “資源調度”表示行程操作物件的方法,它關心的是怎么用?調度是作業系統的核心,如果沒有調度,就算給ECU通電,執行器也不能動作,就不能實作控制功能,
調度的程序是多樣的,怎樣調度才能最有效的利用資源是軟體設計師要考慮的問題,在所有資源中,“CPU”資源是最核心的資源,傳感器不夠了,可以擴展電路增加一個,但是在單CPU系統中,特別的又只有一個Core,不可能簡單的增加一個CPU,這無異于重新設計一個ECU系統,而在原來的CPU上增加一個Core,不是ECU開發商能做的事情,圍繞如何有效的利用“CPU資源”,引入了執行緒,
三、執行緒的概念
執行緒(英語:thread)是作業系統能夠進行運算調度的最小單位,它被包含在行程之中,是行程中的實際運作單位,一條執行緒指的是行程中一個單一順序的控制流,一個行程中可以并發多個執行緒,每條執行緒并行執行不同的任務,
- “運算調度”,表示執行緒是面向運算器的,即CPU的,在這個層面上,它只關心CPU一個資源,其它的資源不考慮,
- “最小單位”,表示一旦被定義為執行緒,就不應該再向下分子執行緒了,如果可以分那么在設計程式時應該先分,比如,某個Thread_10ms(),分析發現當中的某些邏輯執行周期應該是2ms,那么就應該把它拆分成Thread_10ms()和Thread_2ms()
- “單一順序流”,表示一個執行緒一旦啟動,它就應該按順序從頭執行完,如果中間被暫停應該記錄暫停點,等恢復后從暫停點繼續執行,如果恢復后沒有從暫停點繼續執行,應該為錯誤,
- “不同的任務”,表示一個任務只能交給一個執行緒執行,否則的話,會導致非預期的結果,比如,有一個任務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模式,過一會兒再切回發動機控制器程式繼續運行?這個在技術上也可以做到,但是肯定不會這樣干,有幾個理由:
- 帶來安全問題
- Boot和App程式要分配獨立RAM空間保存各自狀態,浪費資源
- 沒有必要,從頭開始運行App程式到執行到某個斷點也就幾十到幾百毫秒,保護現場的行程切換節省不了多少時間,
- 達不到控制目的,汽車軟體的一個程式只要運行中停止了,無論是主動的行為還是被動的例外,都會導致當前功能的喪失,程式必須要重新運行才能重啟功能,
第4條是最主要的功能,所以汽車軟體的行程就三個狀態,這樣就不需要行程控制塊,不需要行程堆疊,必須要先結束一個行程才能切換到另一個行程,

六、AutoSar OS的OsApplication
在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,這個純粹是軟體設計邏輯,與用什么作業系統沒關系,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/236140.html
標籤:其他
