Zephys OS 內核篇:內核大總管 _nanokernel

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 所示。

圖 1. 線程狀態切換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章