【硬核科普】漫談Huawei LiteOS五大內(nèi)核模塊
01
LiteOS內(nèi)核的任務(wù)管理
基本概念和功能任務(wù)是競爭系統(tǒng)資源的最小運行單元。任務(wù)可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨立于其它任務(wù)運行。
Huawei LiteOS是一個支持多任務(wù)的操作系統(tǒng),一個任務(wù)就表示一個線程,任務(wù)之間可以進行切換和通信。LiteOS的任務(wù)管理模塊提供任務(wù)創(chuàng)建、刪除、延時、掛起和恢復、更改任務(wù)優(yōu)先級、鎖定任務(wù)調(diào)度和解鎖任務(wù)調(diào)度、根據(jù)任務(wù)控制塊查詢?nèi)蝿?wù) ID、根據(jù) ID 查詢?nèi)蝿?wù)控制塊信息等功能。
因為LiteOS內(nèi)核是搶占式調(diào)度內(nèi)核,所以高優(yōu)先級的任務(wù)可以打斷低優(yōu)先級任務(wù),低優(yōu)先級任務(wù)必須在高優(yōu)先級任務(wù)阻塞或結(jié)束后才能得到調(diào)度,同優(yōu)先級任務(wù)會進行時間片輪轉(zhuǎn)調(diào)度。優(yōu)先級表示任務(wù)執(zhí)行的優(yōu)先順序,決定了在發(fā)生任務(wù)切換時即將要執(zhí)行的任務(wù)。LiteOS中的任務(wù)一共有32個優(yōu)先級 (0-31),最高優(yōu)先級為 0,最低優(yōu)先級為31。
任務(wù)控制TCB每一個任務(wù)都含有一個任務(wù)控制塊(TCB)。TCB 包含了任務(wù)上下文棧指針(stack pointer)、任務(wù)狀態(tài)(包括就緒、運行、阻塞、退出4種狀態(tài))、任務(wù)棧大?。ㄈ蝿?wù)棧里保存著局部變量、寄存器、函數(shù)參數(shù)、函數(shù)返回地址等)、任務(wù)優(yōu)先級、任務(wù)ID、任務(wù)名等信息。TCB相當于每個任務(wù)在內(nèi)核中的身份證,可以反映出每個任務(wù)運行情況。
運作機制在任務(wù)模塊初始化時,系統(tǒng)會先申請TCB需要的內(nèi)存空間。如果任務(wù)初始化成功,則系統(tǒng)對TCB內(nèi)容進行初始化。用戶創(chuàng)建任務(wù)時,系統(tǒng)會將任務(wù)棧進行初始化,預(yù)置上下文。此外,系統(tǒng)還會將“任務(wù)入口函數(shù)”地址放在相應(yīng)位置。這樣在任務(wù)第一次啟動進入運行態(tài)時,將會執(zhí)行“任務(wù)入口函數(shù)”。
02
LiteOS內(nèi)核的內(nèi)存管理
主要功能Huawei LiteOS的內(nèi)存管理模塊管理系統(tǒng)的內(nèi)存資源,主要包括內(nèi)存的初始化、分配及釋放,是操作系統(tǒng)的核心模塊之一。
在系統(tǒng)運行過程中,內(nèi)存管理模塊通過對內(nèi)存的申請/釋放操作,來管理用戶和OS對內(nèi)存的使用,使內(nèi)存的利用率和使用效率達到最優(yōu),同時最大限度地解決系統(tǒng)的內(nèi)存碎片問題。Huawei LiteOS的內(nèi)存管理分為動態(tài)內(nèi)存管理和靜態(tài)內(nèi)存管理。
動態(tài)內(nèi)存管理在動態(tài)內(nèi)存池中分配用戶指定大小的內(nèi)存塊。
o 優(yōu)點:按需分配。
o 缺點:內(nèi)存池中可能出現(xiàn)碎片。
靜態(tài)內(nèi)存管理在靜態(tài)內(nèi)存池中分配用戶初始化時預(yù)設(shè)(固定)大小的內(nèi)存塊,初始化后塊大小不可變更。
o 優(yōu)點:分配和釋放效率高,靜態(tài)內(nèi)存池中無碎片。
o 缺點:只能申請到初始化預(yù)設(shè)大小的內(nèi)存塊,不能按需申請。
03
LiteOS內(nèi)核的中斷管理
中斷的介紹中斷是指出現(xiàn)需要時,CPU暫停執(zhí)行當前程序,轉(zhuǎn)而執(zhí)行新程序的過程。即在程序運行過程中,系統(tǒng)出現(xiàn)了一個必須由CPU立即處理的事務(wù)。此時,CPU暫時中止當前程序的執(zhí)行轉(zhuǎn)而處理這個事務(wù),這個過程就叫做中斷。
為什么需要中斷眾多周知,CPU的處理速度比外設(shè)的運行速度快很多,外設(shè)可以在沒有CPU介入的情況下完成一定的工作,但某些情況下需要CPU為其做一定的工作。通過中斷機制,在外設(shè)不需要CPU介入時,CPU可以執(zhí)行其它任務(wù),而當外設(shè)需要CPU時通過產(chǎn)生中斷信號使CPU立即中斷當前任務(wù)來響應(yīng)中斷請求。用戶通過中斷申請,注冊中斷處理程序,可以指定CPU響應(yīng)中斷請求時所執(zhí)行的具體操作。這樣可以使CPU避免把大量時間耗費在等待、查詢外設(shè)狀態(tài)的操作上,因此將大大提高系統(tǒng)實時性以及執(zhí)行效率。
相關(guān)的硬件與中斷相關(guān)的硬件可以劃分為三類:設(shè)備、中斷控制器、CPU本身。
-
設(shè)備:發(fā)起中斷的源,當設(shè)備需要請求CPU時,產(chǎn)生一個中斷信號,該信號連接至中斷控制器。
-
中斷控制器:中斷控制器是 CPU 眾多外設(shè)中的一個,它一方面接收其它外設(shè)中斷引腳的輸入,另一方面,它會發(fā)出中斷信號給CPU??梢酝ㄟ^對中斷控制器編程實現(xiàn)對中斷源的優(yōu)先級、觸發(fā)方式、打開和關(guān)閉源等設(shè)置操作。常用的中斷控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller),在 ARM Cortex-M 系列中使用的中斷控制器是NVIC(Nested Vector Interrupt Controller)。
-
CPU:CPU會響應(yīng)中斷源的請求,中斷當前正在執(zhí)行的任務(wù),轉(zhuǎn)而執(zhí)行中斷處理程序。
主要功能Huawei LiteOS支持:
· 中斷初始化
· 中斷創(chuàng)建
· 開/關(guān)中斷
· 恢復中斷
· 中斷使能
· 中斷屏蔽
04
LiteOS內(nèi)核的信號量
基本概念和功能信號量(Semaphore)是一種實現(xiàn)任務(wù)間通信的機制,可以用于任務(wù)之間同步或臨界資源的互斥訪問。
信號量可以被任務(wù)獲取或者申請,不同的信號量通過信號量索引號來唯一確定,每個信號量都有一個計數(shù)值和任務(wù)隊列。通常信號量的計數(shù)值表示有效的資源數(shù),即剩下的可被占用的互斥資源數(shù)。當任務(wù)申請(Pend)信號量時,如果申請成功,則信號量的計數(shù)值遞減,如申請失敗,則掛起在該信號量的等待任務(wù)隊列上,一旦有任務(wù)釋放該信號量,則等待任務(wù)隊列中的任務(wù)被喚醒開始執(zhí)行。信號量運作示意圖↓
使用場景信號量是一種非常靈活的同步方式,可以運用在多種場合中,實現(xiàn)鎖、同步、資源計數(shù)等功能,也能方便的用于任務(wù)與任務(wù),中斷與任務(wù)的同步中。
· 任務(wù)間互斥
用作互斥時,信號量創(chuàng)建后記數(shù)是滿的,在需要使用臨界資源時,先申請信號量,使其變空,這樣其他任務(wù)需要使用臨界資源時就會因為無法申請到信號量而阻塞,從而保證了臨界資源的安全。
· 任務(wù)間同步
用作同步時,信號量在創(chuàng)建后被置為空,任務(wù)1申請信號量而阻塞,任務(wù)2在某種條件發(fā)生后,釋放信號量,于是任務(wù)1得以進入READY或RUNNING態(tài),從而達到了兩個任務(wù)間的同步。
· 資源計數(shù)
用作資源計數(shù)時,信號量的作用是一個特殊的計數(shù)器,可以遞增或者遞減,但是值永遠不能為負值,典型的應(yīng)用場景是生產(chǎn)者與消費者的場景。
· 中斷與任務(wù)的同步
用作中斷與任務(wù)的同步時,可以在中斷未觸發(fā)時將信號量的值置為0,從而堵塞中斷服務(wù)處理任務(wù),一旦中斷被觸發(fā),則喚醒堵塞的中斷服務(wù)處理任務(wù)進行中斷處理。
05
LiteOS內(nèi)核的互斥鎖
基本概念和功能互斥鎖(mutex)又稱互斥型信號量,是一種特殊的二值信號量,用于實現(xiàn)對共享資源的獨占式處理?;コ怄i主要使用在多任務(wù)環(huán)境下,此時往往存在多個任務(wù)競爭同一共享資源的應(yīng)用場景。另外,Huawei LiteOS通過優(yōu)先級繼承算法,解決了信號量存在的優(yōu)先級翻轉(zhuǎn)問題。
運作機制任意時刻互斥鎖只有兩種狀態(tài):開鎖或閉鎖。當有任務(wù)持有時,互斥鎖處于閉鎖狀態(tài),這個任務(wù)獲得該互斥鎖的所有權(quán)。當該任務(wù)釋放它時,該互斥鎖被開鎖,任務(wù)失去該互斥鎖的所有權(quán)。當一個任務(wù)持有互斥鎖時,其他任務(wù)將不能再對該互斥鎖進行開鎖或持有,所以其他任務(wù)此時訪問這個公共資源將會被阻塞,直到互斥鎖被持有該鎖的任務(wù)釋放后,其他任務(wù)才能重新訪問該公共資源。
互斥鎖運作示意圖↓