首頁 > 易卦

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

作者:由 嵌入式林老師 發表于 易卦日期:2022-09-30

陣列怎麼進行清零操作

基本結構

1、概述

嵌入式系統一般由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統(可選),以及使用者的應用軟體系統等四個部分組成

2、嵌入式微處理器

(1)1000多種硬體處理器,分為MCU(Microcontroller Unit)、DSP (digital signal processor)、MPU (Microprocessor Unit)、SOC (System on Chip)

(2)嵌入式微處理器分為:嵌入式微控制器MCU,嵌入式DSP處理器DSP,嵌入式微處理器MPU,嵌入式片上系統System On Chip

3、外圍硬體裝置

(1)片外匯流排:連線系統各個部件,進行互連和傳輸資訊的訊號線。

(2)電子盤:採用flash晶片儲存資料,體積小、功耗低、抗震

(3)I/O裝置:A/D、D/A、中斷控制器、UART、LCD

(4)通訊裝置:有線通訊IEEE1394、USB和無線通訊:IrDA、Bluetooth

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

文章相對比較長,字數比較多,大家可以先開啟頭像關注我,之後慢慢看,///插播一條:我自己在今年年初錄製了一套還比較系統的入門微控制器教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像左下角黑色字型加我也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///

軟體組成

(1)板級支援包

它介於嵌入式硬體和上層軟體之間的一個底層開發包,主要目的是遮蔽下層硬體。擁有兩部分功能:一是系統引導,包括嵌入式微處理器和基本晶片的初始化;二是提供裝置的驅動介面,負責嵌入式系統與外設的資訊互動。

(2)嵌入式實時作業系統

這是對多工嵌入式系統進行有效管理的核心部分,可以分為基本核心和擴充套件核心兩部分。前者提供作業系統的核心功能,負責整個系統的任務排程、儲存分配、時鐘管理、中斷管理,也可提供檔案、GUI、網路等通用服務;後者則是根據應用領域的需要,為使用者提供面向領域或面向具體行業的作業系統擴充套件功能,如圖形影象處理、汽車電子、資訊家電等領域的專用擴充套件服務。

(3)應用程式設計介面

也稱為嵌入式應用程式設計中介軟體,由為編制嵌入式應用程式提供的各種程式設計介面庫或元件組成,可以針對不同應用領域、不同安全要求分別構建,從而減輕應用開發者的負擔。

(4)嵌入式應用系統

是為了解決某些特定的應用性問題而設計出來的軟體,最終執行在目標機上的應用軟體,如嵌入式文字編輯、遊戲、讀/寫卡系統、家電控制軟體、多媒體播放軟體。

網上看到一篇文件,作者的目的是設計一個簡單的嵌入式作業系統,只實現一個基本任務排程器的功能。正如作者所說,雖然不能稱為作業系統,但已體現了小型嵌入式作業系統的精髓。對於我們來說是很好的學習資料,可以從中一窺作業系統的面目,今天分享給大家。

多工機制

其實在單一CPU的情況下,是不存在真正的多工機制的,存在的只有不同的任務輪流使用CPU,所以本質上還是單任務的。但由於CPU執行速度非常快,加上任務切換十分頻繁並且切換的很快,所以我們感覺好像有很多工同時在執行一樣。這就是所謂的多工機制。

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

實時系統的特徵是延時可預測,能夠在一個規定的時間內(通常是 ms級別的)對某些訊號做出反應。

任務的狀態

任務有下面的特性:任務並不是隨時都可以執行的,而一個已經執行的任務並不能保證一直佔有 CPU直到執行完。一般有就緒態,執行態,掛起態等。

執行態:一個執行態的任務是一個正在使用 CPU的任務。任何時刻有且只有一個執行著的任務。

就緒態:一個就緒態任務是可執行的,等待佔有 CPU的任務釋放 CPU。

掛起態:某些條件不滿足而掛起不能執行的狀態。

如何轉化為就緒態

INT32U OSRdyTbl; /*就緒任務表 */

上面定義一個 32位變數,每一位代表一個任務,0表示掛起狀態,1表示就緒狀態。它記錄了各任務的就緒與否狀態,稱它為就緒表。OSRdyTbl定義為 32位變數,對應32個任務。當然,定義為 64位的話,便最多能支援 64個任務。這樣,可以定義兩個宏,實現把任務的狀態變為就緒或掛起態。

/*在就緒表中登記就緒任務 */

#define OSSetPrioRdy(prio) { OSRdyTbl |= 0x01《《prio;} //把相應位置1

/*從就緒表中刪除任務 */

#define OSDelPrioRdy(prio) { OSRdyTbl &= ~(0x01《《prio); }//把相應位清零

任務之間互相獨立,不存在互相呼叫的關係。所有任務在邏輯上都是平等的。由於任務之間互相看不見,所以他們之間的資訊傳輸就無法當面完成。這就需要各種通訊機制如訊號量,訊息郵箱,佇列等來實現。

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

什麼是搶佔式排程?

排程的概念,通俗的說就是系統在多個任務中選擇合適的任務執行。系統如何知道何時該執行哪個任務?可以為每個任務安排一個唯一的優先級別,當同時有多個任務就緒時,優先執行優先順序較高的任務。同時,任務的優先順序也作為任務的唯一標識號。程式碼中都是對標識號來完成對任務的操作的。

所謂“搶佔式排程”是指:一旦就緒狀態中出現優先權更高的任務,便立即剝奪當前任務的執行權,把CPU分配給更高優先順序的任務。這樣CPU總是執行處於就緒條件下優先順序最高的任務。

多工系統的時間管理

與人一樣,多工系統也需要一個“心跳”來維持其正常執行,這個心跳叫做時鐘節拍,通常由定時器產生一個固定週期的中斷來充當。

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

OSTimeDly函式就是以時鐘節拍為基準來延時的(在時鐘的中斷服務函式中,依次對各個延時任務的延時節拍數減1。若發現某個任務的延時節拍數變為0,則把它從掛起態置為就緒態。)。這個函式完成功能很簡單,就是先掛起當起當前任務,設定其延時節拍數,然後進行任務切換,在指定的時鐘節拍數到來之後,將當前任務恢復為就緒狀態。任務必須透過OSTImeDly或 OSTaskSuspend讓出CPU的使用權(延時或等待事件),使更低優先順序任務有機會執行。

如何實現多工?

只有一個CPU,如何在同一時間實現多個獨立程式的執行?要實現多工,條件是每個任務互相獨立。人如何才能獨立,有自己的私有財產。任務也一樣,如果一個任務有自己的CPU,堆疊,程式程式碼,資料儲存區,那這個任務就是一個獨立的任務。(CPU是透過多工機制獲得的,其他的需要你分配)

TIPS:

如果一個任務正在執行某個公共函式時(如Printf),被另一個高優先順序的任務搶佔,那麼當這個高優先順序的任務也呼叫同一個公共函式時,極有可能破壞原任務的資料。因為兩個任務可能共用一套資料。為了防止這種情況發生,常採用兩種措施:可重入設計和互斥呼叫。

可重入函式中所有的變數均為區域性變數,區域性變數在呼叫時臨時分配空間,所以不同的任務在不同的時刻呼叫該函式時,它們的同一個區域性變數所分配的儲存空間並不相同(任務私有棧中),互不干擾。另外,如果可重入函式呼叫了其他函式,則這些被呼叫的函式也必須是可重入函式。

實現互斥(獨佔)訪問的方法有關中斷,關排程,互斥訊號量,計數訊號量等。

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

一個任務如何擁有自己的程式程式碼

對於如何實現多工,首先是程式程式碼,每個任務的程式程式碼與函式一樣,與51的裸奔程式一樣,每個任務都是一個大迴圈。然後是資料儲存區,由於全域性變數是系統共用的,各個任務共享,不是任務私有,所以這裡的資料儲存區是指任務的私有變數,如何變成私有?區域性變數也。編譯器是把區域性變數儲存在棧裡的,所以好辦,只要任務有個私有的棧就行。

TIPS:

臨界資源是一次僅允許一個任務使用的共享資源。每個任務中訪問臨界資源的那段程式稱為臨界區。

在多工系統中,為保障資料的可靠性和完整性,共享資源要互斥(獨佔)訪問,所以全域性變數(只讀的除外)不能同時有多個任務訪問,即一個任務訪問的時候不能被其他任務打斷。共享資源是一種臨界資源。

一個任務如何擁有自己的堆疊、資料儲存區

私有棧的作用是存放區域性變數,函式的引數,它是一個線性的空間,所以可以申請一個靜態陣列,把棧頂指標SP指向棧的陣列的首元素(遞增棧)或最後一個元素(遞減棧)。即可打造一個人工的棧出來。每個任務還要有記錄自己棧頂指標的變數,儲存在任務控制塊(TCB)中。

什麼是任務控制塊?

系統中的每個任務具有一個任務控制塊,任務控制塊記錄任務執行的環境,這裡的任務控制塊比較簡單,只包含了任務的堆疊指標和任務延時節拍數。任務控制塊是任務的身份證。它把任務的程式與資料聯絡起來,找到它就可以得到任務的所有資源。

嵌入式系統由嵌入式微處理器、外圍硬體裝置、嵌入式作業系統組成

對微控制器感興趣的朋友可以找我,我錄製了一些關於微控制器的入門教程,有需要的童鞋找我拿就行,免費的,私信我“林老師”就可以拿~點選開啟我的頭像就能領取