关于RTOS的全部真相。 第8条 Nucleus SE:内部设计和部署



本文继续对Nucleus SE进行回顾。

服务项目


Nucleus SE提供了任何RTOS都可以期望的一组工具。
首先,Nucleus SE包含一个相当简单的调度程序,但是由于有四个可用选项,它提供了灵活性。 调度程序支持“完成运行”,“轮循”,“轮播”,“时间片”和“优先级”算法。

Nucleus SE API包括约50个实用程序调用,这些调用使开发人员可以访问任务管理,内存部分,信号,事件标志组,信号量,邮箱,队列,管道,系统时间,应用程序计时器和诊断程序。

除了简单的任务计划外,Nucleus SE(可选)还支持任务暂停。 此函数可以是“干净的”(例如,由于显式设置的暂停服务API调用的结果),可以是“睡眠”函数(当任务被暂停一定时间时),也可以是另一个API调用(任务被阻止)的结果(所谓的“有条件的”挂起),等待访问内核资源。 与Nucleus RTOS不同,Nucleus SE在阻止API调用时不支持超时。

呈现的各种机制允许您从任务间同步和通信的方法层次结构中进行选择:从信号量到信号,事件标志,邮箱和队列/管道。

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

参数验证


选择NUSE_API_PARAMETER_CHECKING配置时,所有API函数均包含用于验证参数的代码:检查空指针,对象索引等。由于这是需要额外内存的附加代码,因此在调试过程中启用此功能是明智的选择,但请在发布程序集中将其关闭。

构型


Nucleus SE具有灵活的结构,这给了我们两个积极的观点。 一方面,由于可用功能的简单配置和内存使用的简单管理,内核可以具有满足特定应用程序任务的细粒度配置。 另一方面,Nucleus SE代码可在两个工具之间以及处理器之间轻松移植。

命名约定


由于开发Nucleus SE的清晰性和易懂性很重要,因此仔细考虑了命名约定。 代码中的每个字符都以NUSE_为前缀 该前缀后面的所有内容都遵循一组简单的规则。

API调用


Nucleus SE中的每个API调用函数都以NUSE_开头,几乎总是跟在对象类型之后,然后是混合大小写的操作(由下划线分隔)。 一个示例是NUSE_Queue_Send()函数,该函数将消息排队

其他功能和变量


Nucleus SE代码中的其余函数和(全局)变量也使用NUSE_前缀,但名称的其余部分并不总是具有“结构”。 对于普通的内核用户来说,这并不重要,因为他将具有足够的API函数。

配置符号


由于Nucleus SE配置有#define字符,因此它们也遵守命名约定。 它们仅以大写形式编写。 API调用的激活器的名称与函数的名称相同,并且也以大写形式编写,例如NUSE_QUEUE_SEND。

其他#define字符


应用程序代码可以使用的任何其他#define字符(例如API调用参数和返回状态值)都遵循相同的规则,它们以NUSE_开头并以大写形式编写。 例如, NUSE_SUCCESS。

资料结构


所有RTOS都有一组描述内核对象的数据结构。 在大多数实现中,它们是C语言中的数据结构,可形成链表,并经常进行双向甚至是循环通信。 这是合乎逻辑的,因为可以方便地封装重要数据,并且可以在创建和删除对象时添加或删除列表项。

在Nucleus SE中,所有对象都是静态的,因此将这些对象的所有数据结构组织到一个简单列表中是显而易见的解决方案。 这减少了前向和反向指针的数量和复杂性。 但是,我决定加强系统的优化,并完全拒绝使用结构。 在Nucleus SE中,来自内核对象的所有数据都由几种不同类型的简单数组(也称为表)表示,每种对象类型一个或多个。 有很多支持该决定的论点:

  • Nucleus SE在设计时考虑到与8位结构的兼容性。 大多数小型CPU没有用于在C编译器中实现数据结构的最佳工具。 简单数组效率更高。
  • 由于每种类型的对象的最大允许数量为16,并且访问每个数组的元素需要4位,因此通常使用一个字节。 这比通常占用16或32位的地址更有效。
  • 永久对象数据必须存储在ROM中,而不能复制到RAM中。 由于不能在ROM和RAM之间划分结构(在传统的便携式C语言中),因此每种类型的对象都可以具有两种结构,这过于复杂。 在Nucleus SE中,可以根据需要在ROM和RAM中找到对象描述表。
  • 由于Nucleus SE的高度可配置性(“超高可伸缩性”),某些对象描述数据可能是可选的,具体取决于所选的工具。 这导致条件编译的广泛使用。 具有内置条件编译指令的结构定义很难理解。 反过来,使用此方法控制单个数组的实例化也非常容易理解。


所有对象数据表均受上述分层命名约定的约束。 因此,很容易理解哪些表在逻辑上相关。

与Nucleus RTOS的主要区别


尽管将Nucleus SE设计为与Nucleus RTOS具有高度的兼容性,但仍无法避免一些小的和较大的差异。 将在相关文章中对其进行详细描述,并在下面进行简要说明。

对象数据


在Nucleus RTOS中,可根据要求创建和删除对象。 在Nucleus SE中,所有对象都是静态创建的,并在组装过程中确定。

物件数量


Nucleus RTOS支持无限数量的每种类型的对象。 Nucleus SE最多支持每种类型的十六个对象。

对象名称


Nucleus RTOS允许您将文本类型分配给可用于调试的某些类型的对象。 Nucleus SE没有此功能。

任务锁定机制


Nucleus SE中使用API​​调用阻止任务的机制非常简单。 释放资源后,所有挂起的任务将恢复并相互竞争(使用任务计划程序)争用资源。 丢失的任务再次被挂起(阻止)。 在Nucleus RTOS中,该机制更为复杂,只有重要的任务才能继续进行,因此更为有效。

API调用超时


当调用阻塞API时,Nucleus RTOS允许开发人员指定一个超时时间,在该时间过后即使没有释放资源也将继续调用。 Nucleus SE没有此功能。

任务调度


Nucleus RTOS Scheduler灵活,高效且定义明确。 Nucleus SE提供了一组调度程序,每个调度程序都很简单有效,足以减少支持的任务数量:从1到16。

任务优先级


使用Nucleus RTOS的系统可以具有任意数量的任务,这些任务可以分配256个优先级之一,而多个任务可以具有一个优先级。 任务优先级也可以在运行时更改。 在Nucleus SE中,如果选择了优先级调度程序,则每个任务必须具有不能动态更改的唯一优先级。 每个任务只能有一个优先级。

中断处理


Nucleus RTOS支持两层中断处理程序的复杂体系结构,可实现高效的中断处理程序和内核服务互操作性。 Nucleus SE使用类似的方法,既支持简单的非内核中断处理程序(非托管中断),又可以使用API​​调用的完全上下文感知的中断处理程序(托管中断)。

设备驱动程序


Nucleus RTOS具有精心设计的设备驱动程序体系结构。 Nucleus SE没有这样的架构,使开发人员可以在任务和中断处理程序代码之间分配设备控制权。

SE核分布


随着该系列文章的发展,Nucleus SE源代码将被发布。 可用文件将根据要求通过电子邮件提供。 在本系列文章的最后,将创建一个存储库,以下载所有已发布的文件。

关于作者
Colin Walls在电子行业工作了三十多年,大部分时间都花在固件上。 他现在是Mentor Embedded(Mentor Graphics的一个部门)的固件工程师。 Colin Walls经常在会议和研讨会上发表演讲,他撰写了许多技术文章并撰写了两本有关固件的书。 居住在英国。 科林的专业博客 电子邮件

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


All Articles