天天看點

2019備考[嵌入式系統設計師]之作業系統

一、引言

  • 我覺得,嵌入式系統設計主要包含系統設計、硬體設計和軟體設計。其中大部分工作是嵌入式軟體方面,包括作業系統的移植、系統體系架構設計、裝置驅動程式編寫、使用者應用程式設計等等。是以在嵌入式系統設計師的考試中也應該集中在這幾點上面。
  • 前面的幾篇文章對嵌入式硬體方面做了幾個總結,現在對嵌入式軟體方面做一些個人的歸納,再結合曆年真題分析一下,對我認為常見的考點梳理了一下,不知道對大家有沒有用處。
  • 在嵌入式軟體設計中,作業系統基礎尤為重要,可以考查的考點也特别的多。我覺得它的地位就跟四六級英語考試中的閱讀部分一樣。這部分内容不能吃透,很難将這個考試拿下來,當然也有例外的。我隻是想說明這部分的重要性。閑話少數,進入正題。

二、複習筆記

1、嵌入式軟體基礎

(1)嵌入式軟體的特點:

A、規模較小。

B、開發難度大。

C、實時性和可靠性要求高。

D、要求固化存儲。

(2)嵌入式軟體分類:

A、系統軟體:控制和管理嵌入式系統資源,如嵌入式作業系統、驅動程式、中間件等。

B、應用軟體:定義嵌入式裝置的主要功能和用途,負載與使用者進行互動。

C、支撐軟體:輔助軟體開發的工具軟體。

(3)無作業系統的嵌入式軟體的兩種實作方式:

A、循環輪轉

優點:簡單、直覺、開銷小、可預測。

缺點:過于簡單,所有代碼順序執行,無法處理異步事件,缺乏并行處理能力。

B、前背景系統(在循環輪轉的基礎上增加了中斷處理功能)

前台(事件處理級):中斷服務程式,負載處理異步事件。

背景(任務級):一個無限循環,負載資源配置設定、任務管理和系統排程。

(4)有作業系統的三大優點:

A、提高系統的可靠性。

B、提高了系統的開發效率,降低了開發成本,縮短了開發周期。

C、有利于系統的擴充與移植。

(5)裝置驅動層

也叫闆級支援包BSP:包含了嵌入式系統中所有與硬體相關的代碼。大多數的嵌入式硬體裝置都需要某種類型軟體的初始化和管理。這部分工作由裝置驅動層來完成的,它負責直接與硬體大交道,對硬體進行管理和控制,為上層軟體提供所需的驅動支援,類似PC系統中的BIOS和驅動程式。

(6)闆級支援包BSP的基本思想

把嵌入式作業系統與具體的硬體平台隔離開來。在BSP當中,把所有與硬體相關的代碼都封裝起來,并向上提供一個虛拟的硬體平台,而作業系統就運作在這個虛拟的硬體平台上。它使用一組定義好的程式設計接口來與BSP進行互動,并通過BSP來通路真正的硬體。

(7)BSP内容

BSP主要包括兩個方面的内容:

A、引導加載程式BootLoader。

B、裝置驅動程式。

(8)關于引導加載程式BoorLoader

引導加載程式是嵌入式系統加電後運作的第一段軟體代碼,是在作業系統核心運作之前運作的一段小程式,它的實作高度依賴于具體的硬體平台,主要的基本功能如下:

A、片級初始化:純硬體初始化過程,把微處理器從上電的預設狀态設定成系統要求的工作狀态。

B、闆級初始化:同時有軟體和硬體在内的初始化過程,設定各種硬體的寄存器和設定某些軟體的資料結構和參數。

C、加載核心:将作業系統和應用程式的映象從Flash存儲器複制到系統記憶體當中,然後跳轉到系統核心的第一條指令處繼續執行。

補充:PC系統的引導加載過程。

PC系統的引導加載程式由兩部分代碼組成――BIOS和MBR中的引導程式。BIOS在完成硬體檢測和資源配置後,将硬碟主引導記錄MBR中的引導程式讀到系統的記憶體當中,然後将控制權交給它,由它負責把作業系統的核心映象從硬碟讀入到記憶體,然後跳轉到核心入口去運作,即啟動作業系統。

(9)裝置驅動程式

在一個嵌入式系統中,作業系統可能有也可能無,但是裝置驅動程式是必不可少的。裝置驅動程式,就是一組庫函數,用來對硬體進行初始化和管理,并向上層軟體提供良好的通路接口。大多數裝置驅動程式都具備下面的基本功能:啟動、關閉、停用、啟用、讀操作、寫操作。這些功能一般用函數的形式來實作,這些函數之間的組織結構主要有兩種:分層結構和混合結構。

(10)關于分層結構

A、硬體接口:直接操作和控制硬體。

B、調用接口:不直接跟硬體大交道,為上層軟體提供服務和函數接口。

C、優點:把所有與硬體相關的細節都封裝在硬體接口中,在硬體需要更新,需要更新裝置驅動程式的時候,隻需要改動硬體接口中的函數即可,而上層調用接口中的函數不用做任何修改。

D、混合結構:在裝置驅動程式當中,沒有明确的層次關系,上層接口和硬體接口混在一起,互相調用。

(11)嵌入式中間件

它是在作業系統核心、裝置驅動程式和應用軟體之外的所有系統軟體,其基本思路是:把原本屬于應用軟體層的一些通用的功能子產品抽取出來,形成獨立的一層軟體,進而為運作在它上面的那些應用軟體提供一個靈活、安全、移植性好、互相通信、協同工作的平台。

2、嵌入式作業系統概述

(1)核心

核心是指作業系統中的一個元件,它包含了OS的主要功能,即OS的各種特性及其互相之間的依賴關系,這些功能主要包括:

A、任務管理:對系統中運作的軟體進行描述和管理,并完成處理器資源配置設定和排程。

B、存儲管理:提高記憶體的使用率,友善使用者使用,提供足夠的存儲空間。

C、裝置管理:友善裝置的使用,提高CPU和I/O裝置的使用率。

D、檔案管理:解決檔案資源存儲、共享、保密和保護等問題。

注:不同嵌入式作業系統的核心設計各不相同,取決于系統設計和實際需求。

(2)嵌入式作業系統分類:

A、按系統類型:商業系統、專用系統、開源系統。

B、按響應時間:硬實時系統、軟實時系統。

C、按軟體結構:單體結構(uCOS)、分層結構(MS-DOS)、微核心結構(Vxworks)。

3、任務管理

(1)分類

嵌入式作業系統的任務管理可以分為:

A、單道程式技術:作業系統中,任何時候隻能有一個程式在運作。

B、多道程式技術:作業系統中,允許多個程式同時存在并運作。

(2)程序

程序,簡單的說,是一個正在運作的程式。

程序與程式既有聯系又有差別,主要表現為下面幾個方面:

  • A、程式由資料和代碼兩部分内容組成,它是一個靜态的概念。而程序是正在執行的程式,它也由兩部分組成:

    程式和該程式的運作上下文。它是一個動态的概念。

  • B、程式和程序之間并不是一一對應的。一個程序在運作的時候可以啟動一個或多個程式。反之,同一個程式也可能由多程序同時執行。
  • C、程式可以作為一種軟體資源長期儲存,以檔案的形式存放在CD光牒或硬碟上,而程序則是一次執行的過程,它是暫時的,是動态的産生和終止。

一個程序至少應包括三個方面:相應的程式、CPU上下文、一組系統資源。

程序有三個特性:

A、動态性:程序是正在運作的程式,而程式的運作狀态是不斷變化的。

B、獨立性:程序是系統資源的使用機關,每個進行有自己的運作上下文和内部狀态。

C、并發性:宏觀來看,系統中同時有多個程序存在,它們互相獨立地運作。

注:對于并發的了解。

在單CPU的情況下,所謂的并發性指的是宏觀上的并發運作,而微觀上還是順序進行,各個程序輪流去使用CPU資源。在單核CPU中,真正的、實體上的PC寄存器隻有一個,程序在輪流執行的時候,實體PC的取值也在不斷變化。而邏輯PC其實就是一個記憶體變量。每個程序都有一個邏輯PC,當一個程序要運作的時候,就把它的邏輯PC裝載到實體PC中去;反之,當一個程序暫不運作的時候,就把實體PC中的值儲存在它的邏輯PC當中。

(3)線程

線程就是程序當中的一條執行流程。

程序其實包含兩個部分:資源平台和執行流程(線程)。在一個程序當中,或者說在一個資源平台上,可以同時存在多個線程;可以用線程作為CPU的基本排程機關,使得各個線程之間可以并發執行;對于同一個程序當中的各個線程來說,他們可以共享該程序的大部分資源。每個線程都有自己獨立的CPU運作上下文和棧,這是不能共享的。

(4)任務

A、硬體接口:直接操作和控制硬體。

B、調用接口:不直接跟硬體大交道,為上層軟體提供服務和函數接口。

C、優點:把所有與硬體相關的細節都封裝在硬體接口中,在硬體需要更新,需要更新裝置驅動程式的時候,隻需要改動硬體接口中的函數即可,而上層調用接口中的函數不用做任何修改。

在嵌入式系統中,任務其實就是線程,它是能夠獨立運作的一個實體。原因有二:

A、任務具有獨立的優先級和棧空間,CPU上下文一般存放在棧空間中。

B、任務之間可以很友善地、直接地使用共享的記憶體單元,而不需要經過系統核心。

在多道程式的嵌入式系統中,同時存在着多個任務,這些任務之間的結構一般為層狀結構,存在着父子關系。當嵌入式核心剛剛啟動的時候,隻有一個任務存在,然後由該任務派生出所有其他任務。

(5)任務的建立與中止(教程P270)

任務的建立主要發生在以下三種情形:

A、系統初始化。

B、任務運作的過程中。

C、使用者提出請求。

從技術的角度來說,實際上新任務隻有一種建立的方法,也就是在一個已經存在的任務中,通過調用相應的系統函數來建立一個新的任務。

任務的建立隻要有兩種可能的實作模型:fork/exec和spawn。兩種模型的差别主要在于記憶體的配置設定方式。

A、fork/exec模型下,首先調用fork函數為新任務建立一份與父任務完全相同的記憶體空間,然後再調用exec函數裝入新任務的代碼,并用它來覆寫原有的屬于父任務的内容。嵌入式Linux作業系統是基于fork/exec模型的。

B、spawn模式下,在建立新任務的時候,直接為它配置設定一個全新的位址空間,然後将新任務的代碼裝入并運作。uCOS作業系統是基于spawn模型的。

任務的中止可能有多種原因,主要有下面三種情況:

A、正常退出。

B、錯誤推出。

C、被其他任務踢出。

在有些嵌入式系統中,尤其是一些控制系統中,它的某些任務被設計為“死循環”的模式,一直循環下去,不會中止。

(6)任務的狀态

任務有三中基本狀态:

A、運作狀态:任務占有CPU,并在CPU上運作。

B、就緒狀态:任務已經具備運作的條件,在等待CPU空閑。

C、阻塞狀态:任務因為正在等待某種事件的發生而暫時不能運作。

對于就緒狀态和阻塞狀态,它們的相同之處在于,任務都是處于暫停狀态,沒有運作。不同之處在于,暫停的原因是不一樣的,導緻就緒狀态的原因是外因,是作業系統的CPU正忙,而導緻阻塞狀态的原因是内因,是任務自身的問題。

任務狀态的四種轉換關系:

A、運作--->阻塞:任務由于等待某個時間被阻塞起來。

B、運作--->就緒:排程器由于某種原因(例如優先級)選擇了另一個任務去運作。

C、就緒--->運作:CPU空閑了,處于就緒狀态的任務被排程器選中去運作。

D、阻塞--->就緒:任務的等待事件完成,具備了繼續運作的條件。

(7)任務控制塊TCB

任務控制塊TCB,就是在作業系統中,用來描述和管理一個任務的資料結構。系統為每一個任務都維護了一個相應的TCB,用來儲存該任務的各種相關資訊。它的主要内容包括下面幾項:

A、任務的管理資訊:任務的辨別ID、狀态、優先級、排程資訊、各種隊列指針等。

B、CPU上下文資訊:CPU各種寄存器目前的值以及邏輯寄存器。

C、資源管理的資訊:段表位址、頁表位址、根目錄、檔案描述字等。

當需要建立一個任務的時候,就為它生成一個TCB,并初始化這個TCB的内容;當需要中止一個任務的時候,隻要回收它的TCB就可以了。

(8)任務的切換

基本思想:把目前任務的運作上下文儲存起來,并恢複新任務的上下文。

任務切換通常有下面的基本步驟:

A、将處理器的運作上下文儲存在目前任務的TCB中。

B、更新目前任務的狀态,從運作狀态變為就緒狀态或阻塞狀态。

C、按照一定的政策,從所有處于就緒狀态的任務中選擇一個去運作。

D、修改新任務的狀态,從就緒狀态變成運作狀态。

E、根據新任務的TCB的内容,恢複它的運作上下文環境。

在一個多任務的作業系統中,采用任務隊列的方式來組織它的所有任務。由作業系統來維護一組隊列,用來表示系統當中所有任務的目前狀态,不同的狀态用不同的隊列來标志。

(9)任務的排程

排程器可以看作CPU的資源管理者。

任務排程的首要問題是:何時進行排程,即排程發生的時機。

一般有下面幾種情形:

A、一個新任務被建立時,需要決定運作新任務還是繼續執行父任務。

B、一個任務運作結束時,需要從就緒隊列中選擇某個任務去運作。

C、一個任務運作阻塞時,需要選擇另一個任務去運作。

D、一個I/O操作完成,任務阻塞結束,立即執行新就緒任務還是繼續執行被中斷任務。

E、一個時鐘節拍結束時,需要對就緒任務重新排程。

任務排程的第二個問題是:如何排程,即排程方式。主要有兩種方式:

A、不可搶占排程方式:例如時間片輪轉。

B、可搶占排程方式:例如優先級排程。

實時作業系統大都采用可搶占排程方式。

任務排程的第三個問題是:排程算法。

A、先來先服務算法:按照任務到達的先後次序進行排程,是不可搶占的排程方式。

B、短作業優先算法:各個任務開始執行之前,事先預計好它的執行時間,從中選擇用時較短的任務優先執行。

C、時間片輪轉算法:所有的就緒任務按照先來先服務的原則排成一個隊列。在每次排程的時候,把處理器分派給隊列當中的第一個任務,讓它去執行一小段時間。在這個時間段裡任務被阻塞或由于其他原因暫停,或者任務的時間片用完了,它會被送到就緒隊列的末尾,然後排程器再執行目前隊列的第一個任務。這種算法的優點是各個就緒任務都平均地配置設定使用CPU的時間,每個就緒任務都能一直保持着活動性。時間片輪轉法有一個預設前提,即位于就緒隊列中的各個任務是同等重要的。

D、優先級算法:給每個任務都設定一個優先級。然後在任務排程的時候,在所有處于就緒狀态的任務中選擇優先級最高的那個任務去運作。采用優先級排程算法的一個問題是可能會發生優先級反轉(教程P285),出現任務“饑餓”現象。

(10)實時系統排程

對于RTOS排程器來說,任務之間的公平性并不是最重要的,它追求的是實時性。

A、單調速率排程算法(RMS):任務的優先級與它的周期表現為單調函數的關系,任務的周期越短,優先級越高,任務的周期越長,優先級越低。RMS假定任務是相同獨立的、周期性的、任務在能夠在任何位置被搶占,而實際中的系統,任務之間需要進行通信和同步,這是一種理想的排程方法,實際中并不一定存在。

B、最早期限優先法(EDF):根據任務的截止時間來确定其優先級,對于時間限期最近的任務,配置設定最高的優先級。當有一個新的任務處于就緒狀态時,各個任務的優先級就有可能要進行調整,選擇截止時間最近的任務去運作。

(11)任務互斥

A、任務之間的關系:互相獨立、任務互斥、任務同步、任務通信。

B、任務間的互斥:目前已經有一個任務正在通路臨界區共享資料,那麼其他任務暫時不能通路。

C、提出互斥通路的四個條件:

a、在任何時候最多隻能有一個任務位于它的臨界區中。

b、不能事先假定CPU的個數和系統的運作速度。

c、沒有任務位于它的臨界區中,它不妨礙其他任務去通路臨界區資源。

d、任何一個任務進入臨界區的請求必須在有限的時間内得到滿足,不能無限期。

D、任務互斥的解決方案:

a、關閉中斷法

b、繁忙等待法

c、信号量處理

(12)信号量

信号量記錄目前可用資源的數量。信号量由作業系統維護,任務不能直接去修改它的值,隻能通過初始化和兩個标準原語(PV原語)來對它進行通路。

注:關于原語:

原語通常由若幹條語句組成,用來實作某個特點的操作,并通過一段不可分割或不可中斷的程式來實作其功能。原語是作業系統核心的一個組成部分,必須在核心态下執行。原語的不可中斷性是通過在其執行過程中關閉中斷來實作的。關鍵要了解PV原語的實作:

P(semaphoresS)
{
      --S.count;//申請一個資源
      if(S.count<0)//沒有空閑資源
          {
               //将目前任務阻塞起來,加到阻塞隊列末尾,排程新的任務運作。
           }
}

V(semaphoresS)
{
    ++S.count;//釋放一個資源
    if(S.count<=0)//有任務被阻塞
        {
           //從阻塞隊列中取出一個任務,把該任務改為就緒狀态,插入就緒隊列。
        }
}      

利用作業系統提供的信号量機制,可以友善、有效地實作對臨界資源的互斥通路,優點有兩個:

A、可以設定信号量的計數值,進而允許多個任務同時進入臨界區。

B、當一個任務暫時無法進入臨界區時,它會被阻塞起來,将CPU讓給其他任務。

(13)任務同步

任務之間的同步可以使用信号量機制,通過引入PV操作來設定兩個任務在運作時的先後順序。例如,可以把信号量視為某個共享資源的目前個數,然後由一個任務負責生成這種資源,而另一個任務則負責消費這種資源,這樣可以構成兩個任務之間的先後順序。在具體實作上,一般把信号量的初始值設為N,N大于或等于0。然後在一個任務内使用V原語,把信号量加1,而在另外一個任務内部使用P原語,将信号量減1,進而實作這兩個任務之間的同步關系。

(14)死鎖

在一組任務中,每個任務都占用着若幹資源,同時又在等待其他任務占用的資源,進而造成所有任務都無法進展下去的現象,這稱為死鎖現象。

除了資源的競争之外,PV操作使用不當也會引起死鎖。

(15)信号

所謂信号,是系統給任務的一個訓示,表明某個異步事件已經發生了。該事件可能來自外部,也可能來自内部。信号機制也可以稱為軟中斷機制。信号機制與中斷處理機制非常相似,

相同點:

A、都具有中斷性。

B、都有相應的服務程式。

C、都可以屏蔽響應。

不同點:

A、中斷由硬體或特定指令産生,而信号由系統調用産生。

B、中斷觸發後,硬體會根據中斷向量找到相應的處理程式執行;而信号則通過發送信号的系統調用來觸發,系統不一定馬上對它進行處理。

C、中斷處理程式在系統核心的上下文中運作,是全局的;而信号處理程式在相關任務的上下文中運作,是任務的一個組成部分。

(16)任務間通信

任務之間的通信可以分為兩種類型:

A、低級通信:隻能傳遞狀态和整數值等控制資訊,例如信号量機制。

B、進階通信:能夠傳輸任意數量的資料,隻要有三類:共享記憶體、消息傳遞和管道。

任務之間的通信方式有兩種:

A、直接通信:通信雙方必須明确知道與之通信的對象。例如PV原語。

B、間接通信:通信雙方不需指出消息的來源和去向,通過共享郵箱發送和接收消息。

郵箱隻能存放單條消息,它提供一種低開銷的消息傳遞機制,隻有空和滿兩種狀态。消息隊列與郵箱類似,但是可以同時存放若幹條消息,提供了一種任務間緩沖通信的方法。

管道由UNIX首創,以檔案系統為基礎,連接配接兩個任務之間的一個打開的共享檔案,專用于任務直接的資料通信。

4、存儲管理

見《嵌入式系統設計師考試複習筆記之存儲管理篇》。

5、裝置管理

(1)裝置管理基礎

一個I/O單元通常由兩個部分組成:

A、機械部分:I/O裝置本身。

B、電子部分:裝置控制器或裝置擴充卡。

硬體寄存器的編址方式有三種:

A、I/O獨立編址:對于各種裝置控制器中的每一個寄存器,配置設定一個唯一的I/O端口編号,也叫I/O端口位址,然後用專門的I/O指令對這些端口進行操作。這些端口位址構成的位址空間是完全獨立的,與記憶體位址空間沒有任何關系。

B、記憶體映象編址:把各種裝置控制器當中的每一個寄存器都映射為一個記憶體單元,這記憶體單元專門用于I/O操作。端口位址空間與記憶體位址空間是統一編址的,端口位址空間是記憶體位址空間的一部分。

C、混合編址:對于裝置控制器當中的寄存器采用獨立編址的方法,每個寄存器有一個獨立的I/O端口位址;而對于裝置的資料緩沖區,則采用記憶體映象編址的方法,把他們統一到記憶體位址空間當中。

(2)I/O控制方式:

A、程式循環檢測:要一直占用CPU,浪費CPU的時間。

B、中斷驅動方式:前背景系統。

C、直接記憶體通路:DMA控制,減少了中斷的次數。

(3)I/O軟體

A、中斷處理程式:當一個使用者程式需要某種I/O服務時,它會去調用相應的系統函數,而這個函數又會去調用相應的裝置驅動程式,在驅動程式中會啟動相應的I/O操作,并且被阻塞起來,直到這個I/O操作完成後,産生一個中斷程式,并跳到相應的中斷處理程式,在這裡将會喚醒被阻塞的驅動程式。

B裝置驅動程式:直接同I/O裝置打交道,直接對它們進行控制的軟體子產品。上層的I/O軟體通過抽象的函數接口與裝置驅動程式打交道,這些接口是标準的、穩定不變的,而硬體裝置的具體細節被封裝在裝置驅動程式裡面。裝置驅動程式的管理通過驅動程式位址表來實作。驅動程式表中存放了各個裝置驅動程式的入口位址,可以通過此表來實作裝置驅動的動态安裝與解除安裝。

C、裝置獨立I/O軟體:這部分軟體在裝置驅動程式的上面,是獨立的I/O軟體,也是系統核心的一部分,主要任務是實作所有裝置都需要的一些通用I/O功能,并向使用者級的軟體提供一個統一的通路接口。

D、使用者空間的I/O軟體:大部分的I/O軟體都是包含在作業系統當中的,也有一小部分運作在系統核心之外。主要可以分為下面兩種:

a、與使用者程式進行連結的庫函數:例如C語言中與I/O相關的庫函數。

b、完全運作在使用者空間當中的程式:例如Spooling技術。

注:Spooling技術是“外圍裝置聯機操作”的所寫,spooling技術也叫假脫機技術或虛拟裝置技術,它可以把一個獨占的裝置轉變為具有共享特征的虛拟裝置。在多道系統中,對于一個獨占裝置,專門利用一道程式來增強該裝置的I/O功能。優點有二:能提供高速的虛拟I/O服務;能實作對獨占裝置的共享。

6、檔案系統

(1)嵌入式檔案系統概述

檔案系統就是作業系統中用以組織、存儲、命名、使用和保護檔案的一套管理機制。

常見的嵌入式檔案系統有:

A、FAT:VxWorks、QNX、WindowsCE等

B、NFS:網絡檔案系統,基于遠端調用和擴充資料表示。

C、FFS:用于Flash存儲器的檔案系統。

(2)檔案和目錄

A、當一個檔案被建立時,必須給它指定一個名字,使用者就是通過檔案名來通路這個檔案的。

B、檔案命是一個有限長度的字元串,由兩部分組成:檔案名和擴充名。

C、檔案的邏輯結構主要有三種:無結構、簡單的記錄結構和複雜結構。現代檔案系統通常采用的是無結構的形式。

D、除了檔案名之外,作業系統會給每個檔案附加一些其他資訊,稱為檔案的屬性。

E、檔案的存取方法有兩種:順序存取和随機存取。

F、目錄也稱為檔案夾,它是一張表格,記錄了在該目錄下每個檔案名和其他的一些管理資訊。

G、在多級目錄結構中,通路檔案或目錄主要有兩種方法:絕對路徑名和相對路徑名。

(3)檔案系統的實作

(4)目錄的實作

(5)空閑空間管理方法: