漫談Huawei LiteOS五大核心模組
【摘要】Huawei LiteOS是華為面向IoT領域,構建的“統一物聯網作業系統和中介軟體軟體平臺”,以輕量級(核心小於10k)、低功耗(1節5號電池最多可以工作5年),快速啟動,互聯互通,安全等關鍵能力,為開發者提供“一站式”完整軟體平臺,有效降低開發門檻、縮短開發週期。下面對LiteOS基礎核心的任務管理、記憶體管理、中斷管理、訊號量、互斥鎖五大模組進行簡單介紹。
LiteOS核心的任務管理
基本概念和功能
任務是競爭系統資源的最小執行單元。任務可以使用或等待CPU、使用記憶體空間等系統資源,並獨立於其它任務執行。
Huawei LiteOS是一個支援多工的作業系統,一個任務就表示一個執行緒,任務之間可以進行切換和通訊。LiteOS的任務管理模組提供任務建立、刪除、延時、掛起和恢復、更改任務優先順序、鎖定任務排程和解鎖任務排程、根據任務控制塊查詢任務 ID、根據 ID 查詢任務控制塊資訊等功能。
因為LiteOS核心是搶佔式排程核心,所以高優先順序的任務可以打斷低優先順序任務,低優先順序任務必須在高優先順序任務阻塞或結束後才能得到排程,同優先順序任務會進行時間片輪轉排程。優先順序表示任務執行的優先順序,決定了在發生任務切換時即將要執行的任務。LiteOS中的任務一共有32個優先順序 (0-31),最高優先順序為 0,最低優先順序為31。
任務控制塊TCB
每一個任務都含有一個任務控制塊(TCB)。TCB 包含了任務上下文棧指標(stack pointer)、任務狀態(包括就緒、執行、阻塞、退出4種狀態)、任務棧大小(任務棧裡儲存著區域性變數、暫存器、函式引數、函式返回地址等)、任務優先順序、任務ID、任務名等資訊。TCB相當於每個任務在核心中的身份證,可以反映出每個任務執行情況。
運作機制
在任務模組初始化時,系統會先申請TCB需要的記憶體空間。如果任務初始化成功,則系統對TCB內容進行初始化。使用者建立任務時,系統會將任務棧進行初始化,預置上下文。此外,系統還會將“任務入口函式”地址放在相應位置。這樣在任務第一次啟動進入執行態時,將會執行“任務入口函式”。
LiteOS核心的記憶體管理
主要功能
Huawei LiteOS的記憶體管理模組管理系統的記憶體資源,主要包括記憶體的初始化、分配及釋放,是作業系統的核心模組之一。
在系統執行過程中,記憶體管理模組透過對記憶體的申請/釋放操作,來管理使用者和OS對記憶體的使用,使記憶體的利用率和使用效率達到最優,同時最大限度地解決系統的記憶體碎片問題。
Huawei LiteOS的記憶體管理分為動態記憶體管理和靜態記憶體管理。
動態記憶體管理
在動態記憶體池中分配使用者指定大小的記憶體塊。
- 優點:按需分配。
- 缺點:記憶體池中可能出現碎片。
靜態記憶體管理
在靜態記憶體池中分配使用者初始化時預設(固定)大小的記憶體塊,初始化後塊大小不可變更。
- 優點:分配和釋放效率高,靜態記憶體池中無碎片。
- 缺點:只能申請到初始化預設大小的記憶體塊,不能按需申請。
LiteOS核心的中斷管理
中斷的介紹
中斷是指出現需要時,CPU暫停執行當前程式,轉而執行新程式的過程。即在程式執行過程中,系統出現了一個必須由CPU立即處理的事務。此時,CPU暫時中止當前程式的執行轉而處理這個事務,這個過程就叫做中斷。
為什麼需要中斷
眾多周知,CPU的處理速度比外設的執行速度快很多,外設可以在沒有CPU介入的情況下完成一定的工作,但某些情況下需要CPU為其做一定的工作。透過中斷機制,在外設不需要CPU介入時,CPU可以執行其它任務,而當外設需要CPU時透過產生中斷訊號使CPU立即中斷當前任務來響應中斷請求。使用者透過中斷申請,註冊中斷處理程式,可以指定CPU響應中斷請求時所執行的具體操作。這樣可以使CPU避免把大量時間耗費在等待、查詢外設狀態的操作上,因此將大大提高系統實時性以及執行效率。
相關的硬體
與中斷相關的硬體可以劃分為三類:裝置、中斷控制器、CPU本身。
- 裝置:發起中斷的源,當裝置需要請求CPU時,產生一箇中斷訊號,該訊號連線至中斷控制器。
- 中斷控制器:中斷控制器是 CPU 眾多外設中的一個,它一方面接收其它外設中斷引腳的輸入,另一方面,它會發出中斷訊號給CPU。可以透過對中斷控制器程式設計實現對中斷源的優先順序、觸發方式、開啟和關閉源等設定操作。常用的中斷控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller),在 ARM Cortex-M 系列中使用的中斷控制器是NVIC(Nested Vector Interrupt Controller)。
- CPU:CPU會響應中斷源的請求,中斷當前正在執行的任務,轉而執行中斷處理程式。
主要功能
Huawei LiteOS支援:
- 中斷初始化
- 中斷建立
- 開/關中斷
- 恢復中斷
- 中斷使能
- 中斷遮蔽
LiteOS核心的訊號量
基本概念和功能
訊號量(Semaphore)是一種實現任務間通訊的機制,可以用於任務之間同步或臨界資源的互斥訪問。
訊號量可以被任務獲取或者申請,不同的訊號量透過訊號量索引號來唯一確定,每個訊號量都有一個計數值和任務佇列。通常訊號量的計數值表示有效的資源數,即剩下的可被佔用的互斥資源數。當任務申請(Pend)訊號量時,如果申請成功,則訊號量的計數值遞減,如申請失敗,則掛起在該訊號量的等待任務佇列上,一旦有任務釋放該訊號量,則等待任務佇列中的任務被喚醒開始執行。
訊號量運作示意圖
使用場景
訊號量是一種非常靈活的同步方式,可以運用在多種場合中,實現鎖、同步、資源計數等功能,也能方便的用於任務與任務,中斷與任務的同步中。
- 任務間互斥
用作互斥時,訊號量建立後記數是滿的,在需要使用臨界資源時,先申請訊號量,使其變空,這樣其他任務需要使用臨界資源時就會因為無法申請到訊號量而阻塞,從而保證了臨界資源的安全。
- 任務間同步
用作同步時,訊號量在建立後被置為空,任務1申請訊號量而阻塞,任務2在某種條件發生後,釋放訊號量,於是任務1得以進入READY或RUNNING態,從而達到了兩個任務間的同步。
- 資源計數
用作資源計數時,訊號量的作用是一個特殊的計數器,可以遞增或者遞減,但是值永遠不能為負值,典型的應用場景是生產者與消費者的場景。
- 中斷與任務的同步
用作中斷與任務的同步時,可以在中斷未觸發時將訊號量的值置為0,從而堵塞中斷服務處理任務,一旦中斷被觸發,則喚醒堵塞的中斷服務處理任務進行中斷處理。
LiteOS核心的互斥鎖
基本概念和功能
互斥鎖(mutex)又稱互斥型訊號量,是一種特殊的二值訊號量,用於實現對共享資源的獨佔式處理。互斥鎖主要使用在多工環境下,此時往往存在多個任務競爭同一共享資源的應用場景。另外,Huawei LiteOS透過優先順序繼承演算法,解決了訊號量存在的優先順序翻轉問題。
運作機制
任意時刻互斥鎖只有兩種狀態:開鎖或閉鎖。當有任務持有時,互斥鎖處於閉鎖狀態,這個任務獲得該互斥鎖的所有權。當該任務釋放它時,該互斥鎖被開鎖,任務失去該互斥鎖的所有權。當一個任務持有互斥鎖時,其他任務將不能再對該互斥鎖進行開鎖或持有,所以其他任務此時訪問這個公共資源將會被阻塞,直到互斥鎖被持有該鎖的任務釋放後,其他任務才能重新訪問該公共資源。
互斥鎖運作示意圖
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3209/viewspace-2796584/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 漫談LiteOS-端雲互通元件-MQTT開發指南(下)元件MQQT
- 漫談LiteOS-端雲互通元件-MQTT開發指南(上)元件MQQT
- Linux核心模組Linux
- node核心模組-vm
- toa 核心模組分析
- 設計模式漫談之組合模式設計模式
- 淺談模組化
- 一起來學習LiteOS中斷模組的原始碼原始碼
- STM32F103C8T6移植HUAWEI LiteOS過程記錄
- Linux核心模組編譯Linux編譯
- 【核心模組】node.jsNode.js
- 核心模組建立檔案
- Linux核心模組學習Linux
- 核心補丁熱更新ceph核心模組
- [譯] 漫畫:深入淺出 ES 模組
- 淺談前端模組化前端
- 驅動篇——核心空間與核心模組
- 高效學習Linux核心——核心模組編譯Linux編譯
- 深入學習 Linux 核心模組Linux
- 核心模組的載入流程
- webpack核心模組tapable用法解析Web
- UIAppearance漫談UIAPP
- Flink漫談
- 淺談模組化開發
- Nodejs核心模組之net和httpNodeJSHTTP
- node 核心模組學習之 Buffer
- 概述nodejs模組系統核心原理NodeJS
- webpack核心模組tapable原始碼解析Web原始碼
- 【linux】驅動-2-核心模組Linux
- LiteOS核心原始碼分析:任務LOS_Schedule原始碼
- 剖析 | 詳談 SOFABoot 模組化原理boot
- 漫談逆向工程
- 漫談全景分割
- Nginx 架構——【核心流程+模組介紹】Nginx架構
- 深入淺出 Node ( 四 ) HTTP核心模組HTTP
- Zepto核心模組之工具方法拾遺
- 刪除不必要的核心模組
- LiteOS-A核心中的procfs檔案系統分析