关于RTOS的全部真相。 第7条 Nucleus SE:简介



在“ RTOS的全部真相”系列的其余部分中,我们将详细研究如何实现和部署RTOS。 为此,我们将考虑特定的RTOS:Nucleus SE。 即使您不打算使用此特定内核或与其相关的其他内核,了解其工作原理也将为使用任何RTOS奠定良好的基础。

要了解为什么Nucleus SE是以这种方式设计的,重要的是要突出我在项目开始时遵循的核心任务和目标。

该系列中的先前文章:
第6条。 其他RTOS服务
第5条 任务交互和同步
第4条 任务,上下文切换和中断
第3条 任务与计划
第2条。 RTOS:结构和实时模式
第1条 RTOS:简介。


简单性

内核代码应该是简单,直接,经过注释和记录的。 Nucleus SE主要用于教育用途。

尺码

这应该是一个小的,可扩展的内核(因为可能缺少内存,尤其是操作内存(RAM))。

功能性

内核必须具有支持标准RTOS服务的高级功能。

8/16位支持

它应该支持8位和16位体系结构:尽可能使用字节大小的数据; 数据结构不应要求特殊的寻址方法; 持久数据不应不必要地复制到RAM。

未来

从Nucleus SE到Nucleus RTOS必须有一条发展之路。 用户应该能够轻松地在内核之间传输代码。 更重要的是,他们的知识也必须被转移。 Nucleus SE API有效地实现了Nucleus RTOS API的子集。

费用

商业模式应该对所有潜在用户都具有吸引力:8/16位设备的开发人员,首次使用RTOS的人员以及仅研究技术本身的人员。 因此,Nucleus SE是免费提供的,绝对可以免费用于商业和教育目的; 该代码可以使用和修改。

目标受众Nucleus SE

这种方法的结果是一个可以对三种类型的开发人员有用的内核:

  • 需要简单内核或任务调度程序的8/16位设备程序员。 如果开发人员对掌握使用RTOS的某些技能或开发使用Nucleus RTOS可能是不错的选择的使用其他32位设备的系统感兴趣,那么这尤其有吸引力。
  • 使用32位设备的嵌入式应用程序开发人员,其软件复杂性不值得传统商业RTOS支付。 使用Nucleus SE会很有用,如果应用程序的复杂性增加,将允许进行开发(直至Nucleus RTOS)。
  • 学习过程中的学生可以使用Nucleus SE作为学习RTOS的基础。 获得的技能将在以后开始工作时派上用场。

设计决策与权衡

为了实现上述目标,必须做出一些经过深思熟虑的设计决策。 当我们考虑特定功能时,将在后面描述细节,但这是关键点的简要概述。

静态配置

Nucleus SE是静态RTOS,这意味着所有配置决策都是在构建时做出的,而不是在运行时动态做出的。 这具有许多优点,包括简化数据结构和减少代码的大小,因此无需调用create和delete API函数。 对于大多数应用程序,不需要动态对象创建。

物件数量

在基于Nucleus SE的应用程序中,每种类型的对象数量受到限制。 它可以是1到16个任务,也可以是0到16种不同的内核对象。 这简化了对象的寻址(请参见下文)。 对于内核打算用于的小型应用程序,此限制并不困难。

寻址对象

使用“索引”对对象进行寻址,范围从零到十五。 与通常使用的指针相比,这在较小的处理器上可能更有效,并且允许更少的内存:索引仅需要4位内存; 地址是16-32位。

策划人

调度程序属于已简化的内核体系结构领域。 内核没有提供四种具有不同调度策略的灵活机制,而是提供了四种单独的调度器类型。 在配置过程中,将为应用程序选择特定的调度程序。

功能有限

Nucleus SE中未实现Nucleus RTOS中可用的某些功能。 在某些情况下,这样做是为了简化。 在其他情况下,一个区域中功能的轻微丢失会使其他功能更易于实现。 这些不兼容之处在本系列的相关文章中得到了强调。

内存使用量

由于Nucleus SE必须支持有限的内存应用程序,因此特别注意了内存使用情况。 它应该使用“经典” ROM和RAM:ROM用于代码和持久性数据; RAM-用于存储变量,堆栈等。尽管特定目标可能具有不同的方案,但Nucleus SE代码非常灵活。 ROM和RAM的定义(#defines)用于为变量和数据的所有结构添加前缀,以指示其位置。 这可以使用工具来实现。

关键要求是避免不必要地将数据从ROM复制到RAM,因为RAM可能不足。 下一篇文章的“数据结构”部分描述了实现此目标的机制。

API实施

Nucleus SE的API以传统方式实现:C语言函数实现每个API调用。 这些调用在逻辑上进行了分组。 尽管Nucleus SE中的API调用与Nucleus RTOS中的API调用并不完全相同,但是总体功能是模拟的,并且API之间的映射很容易。 Nucleus RTOS API的详细信息将包括在内。

关键部分

许多API函数调用的代码都包含操纵内核数据的指令序列。 通常,在执行这些指令期间数据可能处于无效状态,因此必须注意避免中断。 或者,如果它可以访问此(当前无效)数据,则可能禁止从另一个任务或中断处理程序运行代码。 这样的指令序列称为关键部分。

定义了一对宏,分别称为NUSE_CS_Enter()和NUSE_CS_Exit()。 所有的Nu​​cleus SE API函数代码都使用它们来覆盖关键部分,因此:

NUSE_CS_Enter();
<不间断代码>
NUSE_CS_Exit();

通常,这些宏将分别扩展为中断指令禁用指令和中断使能指令。 如果Nucleus SE是在其他处理器体系结构上实现的,则需要进行检查。 下一篇文章将介绍有关移植Nucleus SE的更多信息。

可扩展性

与所有现代RTOS一样,Nucleus SE也具有可扩展性。 为了确保仅包括使用的RTOS组件,所有API函数均以库的形式显示。 因此,在链接期间,被引用的功能将被提取并包含在应用程序的最终图像中。 Nucleus RTOS对内核和所有其他OS组件都使用此方法。 Nucleus SE使用另一种技术。

Nucleus SE发行版中的所有源文件都没有包含依赖于所选工具箱中的库的内容,而是包含条件编译指令。 要为程序配置Nucleus SE,开发人员需要安装几个#define字符(在下一篇文章中将对此进行更多介绍)。 这确定了哪些API函数将被编译并因此包含在程序中。

Nucleus SE通过提供一个我称为“极端可伸缩性”的对象来增强了这种方法。 可以打开或关闭内核功能的几个方面,或使用类似的#define字符以其他方式进行配置。 因此,开发人员可以对内存的使用进行控制。

哪个API?

Nucleus SE有自己的API,将在以后的文章中详细介绍。 对于许多用户而言,只需将这些对API函数的调用包括在代码中就足够了。

一些用户可能更喜欢使用其他API:标准API或他们熟悉的API。 Nucleus SE API非常灵活,可让您创建将接口转换为另一个API的包装器。

Nucleus SE开发的主要目标之一是与Nucleus RTOS高度的用户级兼容性。 尽管API不同,但它们的设计目的是易于匹配。 将提供一个包装器,以方便在Nucleus SE上使用Nucleus RTOS API。

在下一篇文章中,我们将继续回顾Nucleus SE,并将重点放在RTOS的内部结构和部署上。

Source: https://habr.com/ru/post/zh-CN418601/


All Articles