Zephyr 教程:内核基础(★★★★★)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tidyjiang/article/details/51622411

  本节对 Zephyr 内核的概念和功能进行概述。

架构

  Zephyr 内核的中心元素是微内核和超微内核。Zephyr 内核也包含一些列辅助的子系统,比如设备驱动库和网络库。

  应用程序由两种开发模式:同时使用微内核和超微内核;只使用超微内核。

  超微内核具有内核的一系列基础特征,是一个高性能、多线程的执行环境。超微内核适用于内存很少(最少为 2KB)的系统或者简单的多线程系统(比如只有一些列中断处理和单后台 task)。这样的系统主要包括:嵌入式传感器 hub、传感器、简单 LED 可穿戴设备以及商店库存的标签。

  微内核比超微内核的功能更加丰富。超微内核适用于这样的系统:内存更多(50 ~ 900 KB)、多通信设备(比如WIFI、低功耗蓝牙)、多 task。这样的系统主要包括:可穿戴设备、智能手表、物联网无线网关。

  相关章节:

  • 通用内核服务
  • 超微内核服务
  • 微内核服务

多线程

  Zephyr 内核支持的多线程有三种上下文。

  • Task:Task 上下文是一个可抢占式线程,通常用于处理比较长或者比较复杂的工作。Task 调度是基于优先级的,因此高优先级的 task 可以抢占正在执行的低优先级 task。内核同时还提供可选的时间片功能,以使具有相同优先级的 task 能够轮流执行,避免某一个 task 独占 CPU 的情形。
  • Fiber:Fiber 上下文是一个轻量级的、不可抢占的线程,通常用于设备驱动程序以及执行关键性工作。Fiber 调度是基于优先级的,因此高优先级的 fiber 比低优先级的 fiber 先执行。不过,一个 fiber 一旦被调度,它将一直执行,直到它执行某个操作将自己阻塞掉。Fiber 比 task 优先执行,因此只有在没有 fiber 执行的时候,task 才开始执行。
  • 中断:中断上下文是用于执行中断服务程序 ISR 的特殊内核上下文。中断上下文比其它两种上下文具有更高的优先级,因此 只有在不需要执行 ISR 的时候才执行 task 和 fiber(请看本节后面关于中断处理的更多信息)。

  Zephyr 微内核不限制应用程序使用 task 或者 fiber 的数量;不过,只使用超微内核的应用程序将被限制只能用一个 task。
  
  相关章节:

  • 超微内核 Fiber 服务
  • 微内核 Task 服务

中断

  Zephyr 内核通过中断处理程序(也叫作 ISR)处理硬件中断和软件中断。中断处理比 task 处理和 fiber 处理具有更高的优先级,因此 ISR 在任何时候都可以抢占当前正在运行的 task 或者 fiber。内核支持中断嵌套,即高优先级的 ISR 能够中断正在执行的低优先级的 ISR。

  超微内核支持少量中断源(比如硬件时钟设备、系统控制台设备)的 ISR。其它中断源的 ISR 由设备驱动或者应用程序代码提供。每个 ISR 可以在编译时注册,也可以在内核运行时动态注册。Zephyr 支持的 ISR 完全由纯 C 语言完成的,不过也允许使用汇编语言完成 ISR。
  
  有时候,ISR 自己不能及时地完成相关处理,内核就使用同步机制和数据传递机制将剩下的处理工作转移给 fiber 或者 task。
  
  相关章节:

  • 超微内核中断服务
  • 微内核中断服务

时钟和定时器

  内核时钟基于一个被叫做滴答的可配置时钟单元。一个 64 比特的系统时钟记录了内核开始启动到现在为止的滴答数。

  内核也提供了一个分辨率更高的硬件时钟,可用于测量在一个滴答内的时间间隔。

  超微内核允许 fiber 或者线程使用系统时钟执行基于时间的处理工作。这主要借助于支持超时参数的 API 或者定时器。这种定时器能够在指定的滴答数后设置时间已到期。

  微内核也许 task 使用超时和定时器执行局域时间的处理工作。微内核的定时器比超微内核的定时器的具有更多的功能,比如周期性到期模式。
  
  相关章节:

  • 内核时钟
  • 超微内核定时器服务
  • 微内核定时器服务

同步

  Zephyr 内核提供了四种目标,允许不同上下文间进行同步。

  微内核提供的同步目标如下。这些目标主要用于 task,如果被用于 fiber 和 ISR,它们的功能将受到限制。

  • 信号量:信号量是一个计数信号,表示某种资源还有多少个单元可用。
  • 事件:事件是一个二元信号量,表示某种开源可用或者不用
  • 互斥量:互斥量是带有优先级逆转保护的可重入互斥体。互斥量与二元信号量类似,但是它包含额外的逻辑,以确保只有保资源所有者能够释放资源,以加快拥有高优先级需要的资源的低优先级线程的执行过程。

  超微内核提供的同步目标如下。该目标主要用于 fiber,如果被用于 task 和 ISR,它们的功能将受到限制。

  • 超微内核信号量:超微内核信号量是一个计数信号,表示某种资源还有多少个单元可用。

  在一个给定的情形中,每一种目标都有特定的功能和限制。更多信息请参考对应的目标的文档。
  
  相关章节:

  • 微内核同步服务
  • 超微内核同步服务

数据传递

  Zephyr 内核提供了六种目标,以使不同上下文进行数据交换。
  
  微内核提供的目标如下。这些目标被设计用于 task,不能被用于 fiber 和 ISR。

  • 微内核 FIFO:微内核 FIFO 是一个排队目标,各个 task 通过异步先进先出的方式交换大小固定的数据项。
  • 邮筒:邮筒是一个排队机制,各个 task 通过同步先进先出的方式交换可变大小的数据项。邮筒也支持异步交换,各个 task 可以使用同一个邮筒进行匿名或非匿名交换。
  • 管道:管道是一个排队机制,一个 task 可以像另一个 task 发送字节流。管道支持同步交换和异步交换。

  超内核提供的目标如下。这些目标被设计用于 fiber,不能被用于 task 和 ISR。

  • 超微内核 FIFO:超微内核 FIFO 是一个排队机制。上下文间可以通过异步先入先出的方式交换可变大小的数据项。
  • 超微内核 LIFO:超微内核 LIFO 是一个排队机制。上下文间可通过异步后入先出的方式交换大小可变的数据项。
  • 超微内核栈:超微内核栈是一个排队机制。上下文间可通过异步先入先出的方式交换 32 比特的数据项。

  在一个给定的情形中,每一种目标都有特定的功能和限制。更多信息请参考对应的目标的文档。
  
  相关章节:

  • 微内核数据传递服务
  • 超微内核数据传递服务

动态内存分配

  由于要求所有的系统资源在编译时就定义好,因此 Zephyr 内核只提供了简单的动态内存分配管理。该动态内存分配机制可替换标准的 C 库调用,比如 mallocfree(尽管有一些差异)。
  微内核提供了两种目标,允许 task 动态地分配内存快。这些目标不能用于 fiber 和 ISR。

  • 内存映射:内存映射是一段可以动态分配和释放的大小固定的内存块。
  • 内存池:
      
      相关章节:

  • 微内核内存映射

  • 微内核池

公有、私有微内核对象

微内核服务

  相关章节:

  • 微内核服务 Fiber

标准 C 库

应用程序支持 C++

设备驱动库

网络库

展开阅读全文

没有更多推荐了,返回首页