65.9K
CodeProject 正在变化。 阅读更多。
Home

Zephyr 实时操作系统 (RTOS) 与 Intel® Quark™ 微控制器 D2000 入门

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2017年5月18日

CPOL

15分钟阅读

viewsIcon

9889

本文将向您介绍 Zephyr RTOS,并说明如何为其配置 Intel® Quark™ D2000 微控制器。

获取新的 Intel® 物联网开发套件,这是一个完整的软硬件解决方案,使开发人员能够使用 Intel® Galileo 和 Intel® Edison 板创建令人兴奋的新解决方案。请访问 Intel® 物联网开发者专区

概述

本文将向您介绍 Zephyr* RTOS,并说明如何为其配置 Intel® Quark™ D2000 微控制器。

Zephyr* RTOS 与 Intel® Quark™ D2000 微控制器

欢迎来到 Intel® Quark™ D2000 微控制器上的 Zephyr* RTOS!英特尔现在正在构建嵌入式微控制器。他们将奔腾®处理器缩小到微控制器尺寸,使其成为小型电池供电设备的核心。Intel® Quark™ D2000 微控制器基于英特尔功耗最低的奔腾®处理器,专为控制无线传感器和可穿戴设备等电池供电的电子产品而设计。为了支持 Intel® Quark™ D2000 微控制器的开发,并使其易于与其他 Intel® Quark™ 微控制器及其他设备构建设备,英特尔与 Linux Foundation* 合作构建了一个名为 Zephyr* 的实时操作系统 (RTOS)。Zephyr 是一个开源 RTOS,旨在运行在内存有限的微控制器上。Zephyr RTOS 是一个简化软件开发的平台,让您能够更专注于算法,而减少对硬件的关注。

Zephyr RTOS 包含驱动程序库,用于

  • 与传感器通信
  • 计时
  • 向互联网发送消息
  • 通过蓝牙®技术或 Wi-Fi 等无线电通信
  • 管理功耗以延长电池寿命

Zephyr RTOS 与多种处理器兼容,不仅仅限于 Intel® Quark™ 微控制器。本文的描述同样适用于将 Zephyr RTOS 与其他制造商提供的多种可用微控制器配合使用。

在开始之前,请从 Zephyr Project* 网站下载 Zephyr RTOS,或作为 Intel® System Studio for Microcontrollers 的一部分下载。

什么是 RTOS?

RTOS 是一种专注于实时应用的操作系统。Zephyr 与您在台式电脑和笔记本电脑上找到的操作系统类似。不同之处在于,RTOS 以可预测、可调度的模式执行任务,并专注于按时完成最重要的任务。在嵌入式设备中,计时至关重要。在台式电脑上,您的计算机决定先检查新电子邮件还是先播放视频,这关系不大。操作系统有一个正在运行的任务列表,并决定哪些任务最重要。用户软件很可能不是最高优先级的任务。一个极端的例子是汽车中的嵌入式系统。当微控制器应该触发安全气囊时,如果它决定检查电子邮件,那将是致命的。RTOS 是一个您可以完全控制的操作系统。

为什么要使用 RTOS?

随着物联网的不断扩展,以前不联网的设备变得越来越“智能”(例如,能够向云发送数据)并且越来越复杂。随着复杂性的增加,软件管理变得越来越困难。简单、单一目的的设备可能不需要运行 RTOS。但是,具有多个传感器和无线电、需要智能(联网且响应迅速)的复杂设备,使用 RTOS 更容易构建和维护。

RTOS 通过将微控制器需要执行的所有活动封装到各个任务中来管理软件复杂性。然后,RTOS 提供工具来确定任务的优先级,决定哪些任务始终需要按时执行,哪些任务更灵活。一些应用程序,例如通过无线电与互联网通信,具有严格的计时要求和复杂的通信协议。您可以依靠 Zephyr RTOS 来确保通信按时进行,并且您的微控制器能够适当地响应,而无需您编写任何代码来实现这一点。

对于从桌面编程转到微控制器的开发人员来说,使用 RTOS 编写软件是一个熟悉的过程。对于具有微控制器裸机固件背景的嵌入式开发人员来说,RTOS 是一个强大的新工具。RTOS 的结构改进了封装,将软件的不同功能部分隔离开来,并提供了在不同功能代码块之间交换信息的工具。这可以防止微控制器固件开发中最危险的问题之一:内存管理。为了让开发人员利用 Zephyr RTOS,了解其工作原理非常重要。在下一节中,我们将介绍 Zephyr RTOS 的功能和特性。

Zephyr 内核基础

什么是内核?

Zephyr RTOS 的核心功能是 Zephyr 内核。内核是管理硬件和软件功能各个方面的软件。Zephyr 内核设计小巧,需要很少的程序和数据内存。Zephyr 内核主要有两个组成部分:微内核 (microkernel) 和纳米内核 (nanokernel)。它们各自具有不同的内存要求和功能。

纳米内核

纳米内核是两者中较小的一个。它设计用于功能较少的小型微控制器(例如,仅测量温度的传感器)。它仅需要两千字节的程序内存,这意味着它可以用于除最小的微控制器之外的所有微控制器。

微内核

微内核是功能齐全的内核,适用于更复杂的设备:带有显示屏、多个传感器和多个无线电的手表。微内核设计用于内存介于 50 到 900 千字节之间的大型微控制器。纳米内核的所有功能都可用于微内核,反之则不然。Intel® Quark™ D2000 微控制器的 32 千字节内存非常适合纳米内核。简单的微内核项目可能也能适应,但如果您不需要任何特定的微内核功能,则选择更适合微控制器内存大小的纳米内核。无论哪种方式,内核的核心功能都是相同的,只是您将无法使用纳米内核不支持的高级内存管理功能。

Zephyr RTOS 中的三个上下文

Zephyr 内核提供了三个主要的工具来组织和控制软件执行:任务 (tasks)、纤程 (fibers) 和中断 (interrupts)。在 Zephyr 文档中,这些工具被称为**上下文 (contexts)**,因为它们提供了软件执行的*上下文*,并且每个上下文都具有不同的能力。

Tasks(任务)

在 Zephyr RTOS 中,主要的软件功能封装在**任务 (task)** 中。任务是一段软件,它执行耗时或复杂的处理(例如,通过 Wi-Fi* 与互联网上的服务器交互,或分析传感器数据以查找模式)。

任务被分配优先级,将更重要的活动分配给更高的优先级。如果更高优先级的任务需要采取行动,则可以中断较低优先级的任务。当更高优先级的任务中断较低优先级的任务时,会保存较低任务的数据和状态,然后调用更高优先级任务的数据和状态。当更高优先级的任务完成其工作后,较低优先级的任务将被恢复,并从中断点开始。任务会接管处理器,执行其功能,然后进入休眠状态,等待再次被调用。Zephyr 内核包含一个调度程序,用于确定任何时候需要运行哪个任务。您可以精确控制任务的执行时间,基于时间流逝、响应硬件信号或基于可供分析的新数据的可用性。如果任务需要快速响应触发器,应为其分配更高的优先级。任务以无限循环的形式执行,大部分时间处于休眠状态,等待被调用执行其功能。

纤程

纤程比任务小,用于执行简单的功能或仅仅是处理的一部分。纤程不能被其他任务或纤程中断。它们应用于需要立即采取行动的性能关键型工作。纤程由任务定义和启动。纤程的优先级高于任务。只有在没有纤程需要执行时,任务才能运行,因此您需要确保纤程不会垄断系统。纤程的优先级与任务类似,但没有纤程可以中断正在运行的纤程。然而,纤程总是会中断任务。纤程应用于对时间敏感的操作,例如与传感器通信,因为响应时间可能会导致问题。不应将纤程用于耗时较长的处理。

中断

中断是最高优先级的上下文。中断的执行优先于纤程和任务。它们能够对事件做出最快的响应,无论是来自安全机制的硬件信号还是关键通信的接收。中断的优先级与任务和纤程类似,因此更高优先级的ョ能中断可以接管处理器,中断更低优先级的ョ能。当更高优先级的ョ能完成时,低优先级的ョ能会被重新进入。中断通过称为中断服务例程 (ISR) 的软件函数来处理。每个中断都有一个在中断发生时运行的 ISR。通常,ISR 应该尽可能短,以免干扰系统中其他部分的调度。常见做法是,ISR 向任务或纤程发送消息,传递数据,或告知其运行。这可以使中断服务例程保持简短,并将更长的处理移交给可以被抢占的部分。

内核和任务

纳米内核

如前所述,纳米内核是两个内核中较小的一个。纳米内核只有一个任务,称为后台任务,只有在没有纤程或中断需要执行时才能执行。后台任务是 main() 函数。纳米内核可以有零个纤程,也可以有应用程序所需的任意数量的纤程。纳米内核对中断的数量也没有限制,最多受到微控制器硬件和程序内存大小的限制。如前所述,由于程序内存的大小,纳米内核更适合 Intel® Quark™ D2000 微控制器。

微内核

微内核比纳米内核功能更强大。它也需要更多的内存资源。微内核支持多个任务,并允许您将任务分组在一起以执行更大的功能。微内核的纤程和中断与纳米内核相同。微内核具有更完善的功能,用于处理内存、在任务和纤程之间发送数据以及管理微控制器的功耗。

高级 Zephyr 内核功能

您可以使用上述功能来构建完整的应用程序,但要充分利用 Zephyr,您应该熟悉其一些高级功能。Zephyr 内核包含用于同步操作、在任务之间传递数据以及基于外部事件触发任务执行的功能。在此入门介绍中详细介绍所有功能超出了范围。有关 Zephyr RTOS 更深层功能的更多信息,请参阅 Zephyr Project* 文档

开始使用 Zephyr 内核

入门

要开始使用 Zephyr,您需要 下载 Zephyr 内核,并按照 说明在您的计算机上设置 Zephyr 开发环境。安装 Zephyr 后,最好从一个示例项目开始,例如“hello world”项目,您可以在安装 Zephyr Project 代码的 samples 目录中找到它。按照“入门指南”中显示的构建应用程序说明进行操作。然后,您将了解如何编译自己的应用程序并验证您是否已正确设置所有内容。查看 hello world 示例应用程序目录。我们将对其进行分析,以了解所有文件的作用、它们的用途以及如何修改它们来构建自己的应用程序。

纳米内核还是微内核?

您首先会注意到有一个纳米内核目录和一个微内核目录。您可以构建其中任何一个,它们从外部看起来是相同的。如前所述,纳米内核更有可能是 Intel® Quark™ D2000 微控制器的选择。尽管如此,了解它们之间的差异对于知道哪个内核适合您的应用程序很重要。让我们从微内核开始。

微内核组织

微内核项目至少包含五个文件:

  1. 一个配置文件,指示内核启用您想在应用程序中使用的功能。根据配置文件中的说明,内核将启用硬件功能并将适当的驱动程序包含在您的项目中。
  2. 一个微内核对象定义文件,用于初始化 RTOS 功能,例如任务和中断。
  3. 一个应用程序 Makefile,用于告知 Zephyr 内核您正在使用的处理器、正在使用的内核(nano 或 micro)、项目配置文件名称以及微内核对象定义文件名称。
  4. 您的源代码,包含在项目文件夹中的一个子文件夹中。
  5. 一个 Makefile,用于指示编译器如何构建您的源代码。

让我们来看一下这些文件,以及如何为您的应用程序修改它们。

内核配置文件

Zephyr RTOS 是高度可配置的,拥有大量的选项,可以定制内核以满足您的应用程序需求。在配置文件(通常命名为 prj.conf)中,您决定将在应用程序中使用哪些 Zephyr 功能。通过仅启用您需要的那些功能,您可以控制与您的应用程序代码一起包含的 Zephyr 库的大小。您打算在应用程序中使用的每个功能都需要使用定义语句明确启用,就像您在“Hello World”项目中的 *prj.conf* 文件中看到的那样。

CONFIG_STDOUT_CONSOLE=y

此语句告诉 Zephyr 包含标准输出控制台的驱动程序,您可以使用它将语句显示在您的计算机上。其他配置选项也采用相同的形式。许多驱动程序都有一系列选项,用于精确设置硬件以按您需要的方式运行。可用的选项和配置列表非常广泛。要查看所有可用的配置和选项,请参阅 Zephyr 配置选项参考指南

微内核对象定义文件

微内核对象定义文件包含任务和其他项目所需的内核对象的定义。您应该在此文件中定义任何希望在整个应用程序、跨任何数量的源文件中可用的对象。在任务定义中,您需要为任务指定一个名称、一个优先级、要使用的内存大小,并将该任务分配给一个组。在“Hello World”项目中,prj.mdef 定义文件包含以下任务定义:

% TASK NAME  PRIO ENTRY STACK GROUPS
% ==================================
    TASK TASKA    7 main  2048 [EXE]

以“%”开头的行只是用于澄清代码的注释。Zephyr 编译器不会读取它们。任务名称是 Zephyr 中任务的名称,而不是函数的名称。优先级就是字面意思。在 Zephyr 中,最低优先级是 7,最高优先级是 1。Main 是任务将调用作为其入口点开始运行的函数的名称。2048 是分配给任务的内存大小(以字节为单位)。这似乎很多,但这些内存存储了 Zephyr 数据,用于跟踪任务状态并允许任务挂起和重启。[EXE] 是可执行组的名称。在您自己的项目中,您可以使用相同的结构来创建任务,以及定义微内核的所有更高级功能。

应用程序 Makefile

应用程序 Makefile 告知 Zephyr 内核在构建应用程序时使用哪些文件。它指定了内核配置文件名称、微内核配置文件名称、您正在使用的处理器架构以及您的源代码应用程序文件名称。通常,您无需修改标准的 Zephyr 应用程序 Makefile。

源代码 Makefile

源代码 Makefile 对于指示编译器如何构建您的源代码是必需的。底层上,Zephyr 开发使用开源编译器将您的软件转换为机器指令。源代码 Makefile 告诉编译器在过程中包含哪些文件,并传达编译器配置指令。

您的源代码

源代码包括您的应用程序,结构化为任意数量的文件,根据您的需要或偏好。要使用任何 Zephyr 功能,文件必须包含 zephyr.h 以及您打算使用的任何驱动程序的头文件。源代码文件通常用 C 编写,尽管 Zephyr 编译器允许在任务、纤程、中断和其他 Zephyr RTOS 代码之外使用 C++。如果您查看 hello world 项目中的 main.c,您会看到一个使用 Zephyr 函数的标准 C 文件。

纳米内核差异

纳米内核配置与微内核配置大体相同,但纳米内核项目没有微内核对象定义文件。由于纳米内核只有一个任务,它由 Zephyr 自动生成,并将您的 main 函数用作入口点。纤程和中断例程在您的源代码内部定义。如果您将微内核项目与纳米内核项目进行比较,差异不大。prj.mdef 文件不是必需的,因此已被移除,Makefile 中对其的引用也已更改。否则,从这个角度来看,纳米内核和微内核在很大程度上是相同的。

Zephyr API

Zephyr API 是您将用于构建应用程序代码的工具集。它包含了用于快速原型设计的硬件功能。有库可以定义和使用 Zephyr 功能,如任务、纤程、中断例程和定时器,以及用于通信总线或与特定硬件通信的驱动程序。使用 Zephyr API,您可以连接一个开发板和一个传感器扩展板,并在短时间内投入使用,收集数据。有关 Zephyr API 的更多信息,请参阅 API 文档

后续步骤

随着您构建应用程序并熟悉 Zephyr,您将开始以不同且新的方式思考软件编写。根据任务及其优先级来构建软件有助于使您的软件更具响应性、更紧凑、组织性更好。

资源

© . All rights reserved.