zephyr-內核初級手冊

這部分包括zephyr內核生態系統的以下四個方面:

System Fundamentals

An application image is a binary that controls the operation of a hardware system, or of a simulated system running under QEMU. Each application image contains both the application’s code and the Zephyr kernel code needed to support it. They are compiled as a single, fully-linked binary.

應用鏡像是一個控制對硬件系統或運行在QEMU之下的模擬器操作的二進制文件。每個應用鏡像包含應用代碼和所需的zephyr內核代碼,它們都被作爲獨立,全鏈接的二進制文件被編譯(翻譯得可能不準,理解fully-linked的意思後再來修改)

Once an application image has been loaded onto a target system, the image takes control of the system, initializes it, and runs forever as the system’s sole application. Both application code and kernel code execute as privileged code within a single shared address space.

一旦一個應用鏡像被加載到目標系統,鏡像就將接受系統的控制,初始化並永遠作爲系統的唯一應用運行。應用代碼和內核代碼在一個單獨的共享地址空間內鬥作爲特權代碼運行。


An application is a set of user-supplied files that the Zephyr build system processes to generate an application image. The application consists of application-specific code, a collection of kernel configuration settings, and at least one Makefile. The application’s kernel configuration settings enable the build system to create a kernel tailor-made to meet the needs of the application and to make the best use of the system’s resources.

一個應用是一系列用戶提供的用來在zephyr編譯系統處理以生成應用鏡像的源文件(我們通常的應用在這裏指的是應用鏡像)。應用包含一系列的應用特定代碼,一系列的內核配置設置和至少一個Makefile文件。應用的內核配置設置使得編譯系統可以創建一個內核裁剪-這符合讓應用成爲系統最合適的資源的需求(精簡)

The Zephyr Kernel supports a variety of target systems, known as boards; each board has its own set of hardware devices and capabilities. One or more board configurations are defined for a given board; each board configuration indicates how the devices that may be present on the board are to be used by the kernel. The board and board configuration concepts make it possible to develop a single application that can be used by a set of related target systems, or even target systems based on different CPU architectures.

zephyr內核支持一系列的目標系統,比如各種開發板;每個開發板都包含它自身的硬件和能力。指定的開發板會擁有一個或多個配置;每個開發板配置都反映開發板上的設備將如何被內核使用。開發板和開發板配置思想使得開發一個可以被各種相近目標平臺使用的應用成爲可能,甚至目標系統基於不同的CPU架構。

(Android及現在各種操作系統應該都是這樣的board+board configuration思想)


Kernel Fundamentals

這部分提供對zephyr內核的概念和能力的高層次的概覽

Organization

zephyr內核的核心元素是microkernel和底層的nanokernel。內核當然也包含一系列的輔助子系統,包含設備相關的庫和網絡軟件。

應用可以使用microkernel和nanokernel或者單獨使用nanokernel作開發。

nanokernel是一個擁有基本內核特性集合的高性能,多線程可執行環境。nanokernel是一個針對低內存或只有簡單多線程要求的系統的解決方案(kernel本身最少只需要2KB的空間!)。這樣系統的例子有:嵌入式傳感器總線,環境傳感器,簡單的LED可穿戴設備和商場存貨清單標籤。

(好像比較底層,面向於近乎硬件= =)

microkernel爲nanokernel提供更爲豐富的內核特性。microkernel適合擁有健壯內存的系統(50到900KB),並行通信設備(比如WIFI和低功耗藍牙),以及並行數據處理任務。這樣系統的例子有:可穿戴健身設備,智能手錶和物聯網無線網關。


(就是說microkernel是核心nanokernel的一個補充)

相關的章節參看:

Related sections:

Multi-threading

zephyr內核爲三種可執行上下文提供多線程處理

task context是一個可搶佔線程(context本質是一種線程?),通常用於處理長時間和複雜任務。任務調度基於優先級,所以高優先級任務的執行會搶佔低優先級任務。內核也支持可選時間循環切片功能,所以相同優先級的任務會輪流執行,不會發生一個任務獨佔CPU的情況。

fiber context 是一個輕量級的非搶佔線程,通常用於設備驅動和高性能要求的工作。Fiber 調度基於優先級,所以高優先級的fiber會比低優先級fiber先執行;然而,一旦一個fiber被調度,它將會一直執行,直到一個操作被觸發來阻塞自身的運行。fiber的運行優先級比task高,所以僅當沒有fiber被調度的時候才運行task

(闡述了fiber context 和task context的區別)

interrupt context是一種用於執行ISR終端服務程序的特殊內核context。interrupt context的優先級最高,所以僅當沒有ISR需要運行的時候才運行task和fiber。


Zephyr microkernel不限制應用中使用的task和fiber的數量;然而,只使用nanokernel的應用將被限制爲single task模式。

Related sections:

Interrupts

zephyr 內核通過中斷句柄處理支持硬件中斷和軟件中斷,也就是ISRs。中斷處理有比task和fiber更高的優先級,所以ISR會在任何需要的時候搶佔當前被調度的task和fiber。

內核同樣也支持嵌套的中斷處理,允許高優先級的ISR中斷低優先級的ISR。


nanokernel 爲少量中斷資源(IRQs)提供中斷服務程序(ISRs),比如硬件時鐘計時設備和系統控制檯設備。所有中斷服務資源對應的中斷服務程序都以設備驅動或應用代碼的方式提供。每一箇中斷服務程序都可以在編譯的時候註冊到內核中,但也可以在內核啓動和運行之後再動態註冊。Zephyr 支持C語言編寫的中斷服務程序,但也允許使用彙編語言。


當中斷服務程序不能及時處理完一箇中斷的情況下,內核的同步機制和數據傳輸機制可以將剩下的處理切換給fiber或task。microkernel提供了一個任務IRQ對象類型,使得可以及時將切換流交給task以使得完全不需要設備驅動或者應用代碼來支持中斷服務程序。


Related sections:

Clocks and Timers

內核時鐘基於名爲ticks的時間單元,ticks擁有一個可配置的時間週期。64位系統時鐘會統計內核開始執行後流逝的ticks次數。


Zephyr也支持高分辨率的硬件時鐘,可以用來測量要求sub-stick級別精度的時間。

nanockernel 允許fiber或線程基於系統時鐘運行基於時間的處理。可以通過使用支持timeout參數的nanokernel API來完成,或者通過在指定ticks數目之後使用一個timer 對象來設置到期時間。


microkernel也允許tasks使用timeouts和timers來運行基於時間的處理。microkerne timers擁有nanokernel timers沒有提供的額外功能,比如週期性的失效模式。

Related sections:

Data Passing

Zephyr內核提供6中類型的對象來允許不同的上下文交換數據。


microkernel 提供以下對象類型。這些類型被設計用於tasks,而不能用於fibers和ISRs。


一個microkernel的FIFO是一個允許tasks以異步first in, first out方式交換固定大小數據項的隊列機制。

一個mailbox是一個允許tasks以同步first in, first out方式交換不定大小數據項的隊列機制。Mailboxes 也支持同步交換,並且允許tasks使用同一個mailbox以匿名或不匿名的方式交換消息。

一個pipe 是一個允許task發送字節流到其他task的隊列機制。pipe支持同步和異步交換。


nanokernel提供了一下對象類型。這些類型主要被設計用於fibers,只有一部分限制功能可以被用於tasks和ISRs。


一個nanokernel FIFO是一個允許上下文以異步,first-in,first-out方式交換不定大小數據項的隊列機制。

一個nanokernel LIFO 是一個允許上下文 異步,last-in,first-out方式交換不定大小數據項的隊列機制。

一個nanokernel stack 是一個允許上下文以異步,first-in,first-out方式交換32位數據項的隊列機制。(爲毛指定32位的數據呢?)

上面的每一個類型都有會影響在具體場合適當使用的特定的功能和限制條件。更多細節,參看每個指定對象類型的文檔:

Related sections:


Dynamic Memory Allocation

Zephyr 內核要求所有系統資源在編譯時定義,因此只提供爲動態內存分配提供有限的支持。這個支持可以被用來代替像malloc()和free()這樣的C標準庫調用,雖然有些地方不同。

microkernel提供兩種類型的對象以允許tasks動態地分配內存塊。這些對象類型不恩能夠被用於fibers和ISRs。

一個memory map 是一個支持單個固定大小內存動態分配和釋放的內存區域。應用可以擁有多個memory maps,這些區塊(maps中的內存塊)的大小和容量可以被分別指定。

一個memory pool 是一個支持多個固定大小內存動態分配和釋放的內存區域。當應用請求不同大小的內存塊時,這允許更加有效地使用可用內存。一個應用可以擁有多個memory pool,這些區塊(pool中的內存區塊)的大小和容量可以被分別指定。

nanokernel不提供動態內存分配功能。

For additional information see:


Public and Private Microkernel Objects

Microkernel 對象,比如 semaphores,mailboxes,或者tasks,通常可以被定義爲公有對象或私有對象。


一個公有對象(public object)是一個可以被應用所有部分正常訪問的對象。任何包含了zephyr.h的代碼都可以通過引用對象名的方式和這個對象交互。

一個私有對象(private object)是一個只允許應用特定部分使用的對象,比如一個單獨的設備驅動或者子系統。這個對象的名字只在當其被編碼進對象定義的文件中時纔可見,通常情況下都被隱藏,除非定義這個對象的代碼通過額外步驟將這個名稱共享給其他文件。


除了它們定義的方式和使對象名具有不同的可見性,相同類型的公有對象和私有對象使用相同的API來進行操作。


在大多數情況下,將一個給定的microkernel對象定義爲public對象還是private對象僅僅是看哪一種方便。比如,當定義一個服務器類型的子系統用來處理不同客戶端的需求時,通常定義爲public對象。

注意:

Nanokernel對象類型只可以被定義爲private對象。這意味着一個nanokernel對象定義的時候必須用一個全局變量來允許它可以被其他文件中的代碼訪問。


Microkernel Server

microkernel 的很多操作,包括microkernel對象使用特定的microkernel 服務fiber,都會調用 _k_server()

(這裏需要確定這個fiber到底是個什麼概念,直接翻譯似乎並不能表述其意思)

當一個task調用和microkernel對象類型相關的API時,比如task_fifo_put(),這個相關的操作並不會直接執行,而是通常按照以下步驟進行:

1.task創建一個命令包,命令包中包含目標操作需要的輸入參數

2.task將命令包壓入microkernel 服務的命令棧。然後內核搶佔task並調度microkernel 服務。

3.microkernel服務將命令包從其命令棧中出棧並出發目標操作。所有操作的輸出參數,比如返回代碼都會保存在命令包中。

4.當命令執行完成,microkernel服務會去其當前的空命令棧中獲取命令包從而被阻塞。然後內核就調度這個請求任務。

5.task處理命令包的輸出參數來決定這個操作的結果


在某些情況下,實際的順序可能會和上面的指導略有區別。比如這個操作出發了一個高優先級的任務運行,請求任務就會直到高優先級的任務被首次調度後纔會被內核調度。此外也有少數的操作,包括microkernel對象的一些操作完全不需要使用命令包。


這種間接調用似乎看起來不怎麼高效,但這種方式有一些很重要的好處:

1.microkernel服務的所有操作在競態條件下天生地自由;操作被一個單獨的fiber串行地處理,而不會被其他task和fiber搶佔。

這意味着microkernel服務可以在任何操作中靈敏地處理系統中的microkernel對象,而不需要花費額外的步驟來防止其他上下文的干擾。

2.microkernel操作對中斷延遲時間的影響最小;中斷絕不會在重要時期被鎖定,從而避免了競態條件。

3.microkernel 服務可以很容易地通過創建額外的命令包並將其壓入命令棧來將複雜操作分解成兩個或多個簡單操作

4.系統的總內存需求下降了;一個使用microkernel對象的task爲了完成操作,僅僅需要爲上面步驟的第一步提供一個棧的空間就可以(而非爲上面所有的步驟)

上面主要是描述內核“用命令棧(command stack)+命令包(command packet)的方式來代替直接處理命令”的設計及其優點】

For additional information see:

Standard C Library

zephyr內核當前值提供內核自身所需的標準C庫的最小集合,主要是字符串操作和顯示。

需要使用更加豐富C庫的應用可以拓展當前已經存在的庫或者使用一個(當前已存在庫的)替換庫。


Device Driver Library

zephyr 內核支持一系列的設備驅動。指定的設備驅動程序可以由應用根據相關的硬件組件和設備驅動程序,通過配置開發板配置變量來進行使用。

當前所有已支持的開發板配置中的設備驅動程序如下:

Interrupt controller(中斷控制)。nanokernel的中斷管理子系統中使用到的設備驅動

Timer。內核的系統始終和硬件時鐘子系統中使用到的設備驅動

Serial Communication。內核的控制檯子系統中用到的設備驅動。

Random number generator。提供隨機種子數的設備驅動


重要提示:當前設備驅動的實現中不產生有序值的是隨機數。


Networking Library

這部分簡要減少了網絡子系統的框架(還沒有在官網文檔中補充上來,等待後續更新)



Application Fundamentals

一個zephyr 應用可以通過在一個目錄下創建以下文件來得到:

Application source code files 一個應用通常提供一個或多個應用特定的文件,由C或彙編語言編寫,這些文件通常在一個src子目錄下。

Kernel configurations files。一個應用通常提供一個.conf文件制定一個或多個內核配置項的值。缺省情況下,會使用應用中存在的內核配置項的值,如果不存在默認值,這個默認的配置項就會被使用。

一個microkernel應用通常會提供一個額外的後綴名爲.mdef的microkernel 定義文件。這個文件定義了所有的系統共有microkernel對象。這個文件在只使用nanokernel的應用中不被使用。

Make file 這個文件通常包含少數的幾行來告訴編譯系統從哪裏去尋找上面提到的源文件和目標開發板配置以及內核類型(microkernel和nanokernel都是這樣)


一旦應用被創建,它就可以通過簡單的一條明路進行編譯,編譯結果(包括應用鏡像)都在名爲outdir的子目錄下。

For additional information see:

Source Tree Structure

Zephyr 的源碼樹提供了一下頂級目錄,每一個都可能擁有一個或多個不同深度的此處暫未介紹到子目錄


arch

指定體系架構的nanokernel和平臺的代碼。每一個支持的體系架構都有其自己的子目錄,子目錄中可能包含含有以下內容的子目錄:

  • architecture-specific nanokernel source files
  • architecture-specific nanokernel include files for private APIs
  • platform-specific code
boards

開發板相關的代碼和配置文件

doc

Zephyr 文檔相關的材料和工具

drivers

設備驅動程序

include

lib目錄之外的頭文件和所有公有API

kernel Microkernel 代碼及獨立架構的nanokernel代碼 lib Library 代碼, 包含最小體量的標準C庫 misc 雜項代碼 net Networking 代碼, 包括藍牙協議棧和網絡協議棧 samples microkernel,nanokernel,藍牙協議棧和網絡協議棧的示例應用 tests 各種內核特性的測試代碼和基準 scripts 各種用於編譯和測試zphyr應用的程序及其他文件

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