Zephyr OS 所有的學習筆記已託管到 Github,CSDN 博客裏的內容只是 Github 裏內容的拷貝,因此鏈接會有錯誤,請諒解。
最新的學習筆記請移步 GitHub:https://github.com/tidyjiang8/zephyr-inside
本文介紹 Zephyr OS 中定義的全局變量 _nanokernel。
在 Zephyr OS 中,定義了一個全局變量 _nanokernel,用於描述 nanokernel 的控制結構。_nanokernel 屬於 Zephyr OS 中 BOSS 級別的人物,因此我們必須對這個領軍人物做單獨介紹。But,nanokernel 雖然屬於 BOSS 級別,它的數據結構卻不復雜。
_nanokernel 的定義
nanokernel 定義於 arch/arm/core/thread.c:
tNANO _nanokernel = {0};
其數據類型 tNANO 的原型是:
typedef struct s_NANO tNANO
因此,我們最終要研究的數據結構是 struct s_NANO。
注意:由於 s_NANO 於具體芯片架構相關,所以在移植 Zephyr OS 時,需要考慮移植該結構。
struct s_NANO {
struct tcs *fiber;
struct tcs *task;
struct tcs *current;
int flags;
#if defined(CONFIG_THREAD_MONITOR)
struct tcs *threads;
#endif
#ifdef CONFIG_FP_SHARING
struct tcs *current_fp;
#endif
#ifdef CONFIG_SYS_POWER_MANAGEMENT
int32_t idle;
#endif
#if defined(CONFIG_NANO_TIMEOUTS) || defined(CONFIG_NANO_TIMERS)
sys_dlist_t timeout_q;
int32_t task_timeout;
#endif
};
逐一解釋各成員:
- fibler:所有 fiber 構成的單鏈表
- task:所有 task 構成的但鏈表
- current:指向當前正在被調用的線程(fiber 或 task)
- flags:當前正在被調度的線程的flags,等於 current->flags
- threads:內核中所有線程(fiber + task)構成的單鏈表
- current_fp:擁有 FP 寄存器的線程(fiber或task)構成的單鏈表。沒懂。
- idle:內核空轉的滴答數。不知道有啥作用。
- timeout_q:內核中的超時隊列。具體信息請參考《Zephyr OS nano內核篇:超時服務 timeout》。
- task_timeout:於是與超時服務相關的,但是具體的含義還沒弄明白。
可以看出,_nanokernel 這個大總管的成員幾乎都是鏈表,通過這些鏈表可以找到所有的線程,進而再根據新城可以找到所有線程相關的信息,這就是內核大總管的超強能力!
線程的狀態
Zephyr OS 中線程的狀態可以分爲三類:
- 執行態:指當前正在佔用 CPU 執行任務的線程。由於物聯網設備的低成本、低速率的特性,Zephyr OS 只支持單 CPU,因此內核中只有一個線程處於執行態。
- 就緒態:指已經準備就緒、等待被調度執行的線程,這些線程以優先級的順序排列。當系統當前正在執行的線程執行完畢或進入等待隊列時,調度算法會調度就緒態鏈表中優先級最高的線程。
- 等待態:當內核中的一個線程正在執行時,可能由於某種原因無法再執行下去(比如等待某種資源——信號量),這時我們可以將該線程放入一個等待隊列中,然後將 CPU 的執行權轉交給其它線程,以達到最大效率使用 CPU 的目的。
線程的狀態切換如圖 1 所示。