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