Nucleus-SE迁移:未实现的设施和兼容性

Nucleus-SE迁移:未实现的设施和兼容性

Nucleus SE migration: Unimplemented facilities and compatibility

Nucleus SE的一个关键设计要求是与Mentor的旗舰实时操作系统产品Nucleus RTOS高度兼容。Nucleus SE有Nucleus RTOS功能的一个子集,我在本系列的所有相关场合都强调了这一点,但是在本文中,我将尝试将所有关键的差异集中在一个地方。其目的是为任何计划在两个内核之间迁移或为特定项目选择内核的人提供快速参考。             

Nucleus RTO相比,Nucleus SE除了功能有限或简化外,还设计为尽可能提高内存效率,用户可以利用大量机会进行调整。这个策略的一个关键部分是可伸缩的功能。内核功能的许多特性可以根据需要启用或禁用。显然,对于给定的实现,禁用功能会增加与Nucleus rto的不兼容性。             

Nucleus RTOS中,一个系统可以用不确定数量的内核对象构建,唯一的主要限制是可用资源(即内存)的数量。Nucleus SE对每种对象类型的限制不超过16个;一个系统可以有1到16个任务,其他类型的对象(邮箱、队列等)可以有0到16个。虽然这一限制可能会增加,但这将需要大量的工作,因为在半字节(4位)中存储对象索引的能力被广泛利用。另外,如果允许16个以上的任务,优先级调度程序很可能变得非常低效。受到这些限制的应用程序并不真正适合Nucleus SE,Nucleus RTOS可能是更好的选择。

调度员             

像任何现代的实时内核一样,Nucleus RTOS有一个非常灵活的调度器,提供许多优先级(在任何给定的级别上有不确定数量的任务);以及循环调度和时间片调度的可能性。nucleusse要简单得多,它提供了四种不同的调度程序,必须在构建时选择它们:运行到完成、循环调度、时间片和优先级。没有组合调度方法的选项(即没有复合调度器)–例如,混合优先级和时间片。此外,优先级调度器只允许在每个优先级上执行一个任务-优先级级别与任务数量相同。任务的优先级在构建时是固定的,如果使用该选项,则时间片也是如此。             

API调用             

应用程序接口(API)是操作系统的可见“面”。毫不奇怪,在这里,RTOS核和SE核之间的差异最为明显。             

Nucleus SE与Nucleus RTOS没有相同的API。然而,它的API经过精心设计,可以很容易地映射到Nucleus RTOS API的一个子集上。Nucleus rto的许可证持有者可以获得一个“包装器”(一个包含#define宏的头文件),它使映射几乎完全透明。             

由于Nucleus SE API是Nucleus RTOS的一个子集,因此可能缺少一些API调用。这是事实,也是Nucleus SE设计标准的必然结果。有些API调用是不相关的,因为它们应用于不存在的功能;其他一些调用则由于一些内核对象的实现中的简化而丢失。本文的以下部分将详细介绍这些内容。             

常用API函数             

Nucleus rto中,有一些API函数在许多不同类型的内核对象中是通用的,甚至是在所有类型的内核对象中都是通用的。其中一些也在Nucleus SE中实现-“reset”就是一个很好的例子。其他一些则不适用于内核对象的Nucleus SE实现。

创建和删除             

Nucleus RTOS中,所有的内核对象都是动态的,它们是根据需要创建和删除的。因此,为此提供了API调用。在Nucleus SE中,所有对象都是静态的,它们是在构建时创建的,因此不需要这样的API调用。             

返回对象指针              

Nucleus RTOS为内核对象使用的主标识符(句柄)是指向对象的控制块的指针,在创建对象时分配给它。因此,有一组API调用返回指向每种类型对象的指针列表。由于Nucleus SE使用一个简单的索引来标识内核对象,这样的调用是多余的。程序可以询问内核以确定配置了多少个给定对象类型的实例(使用NUSE_Mailbox_Count());如果该值为n,则对象类型的索引将从0到n-1。             

广播数据             

对于许多Nucleus RTOS内核对象类型(特别是邮箱、队列和管道),提供了一个“广播”API调用。这有助于向读取对象时被阻止的每个任务发送数据项。为了简单起见,Nucleus SE省略了此功能,因为访问这些对象中的数据总是在相关任务的上下文中获得的,然后释放对象;为了实现广播,还需要一个附加的标记机制。             

对象特定的API函数             

许多内核对象都具有非常特定于特定对象类型的API调用,并且在Nucleus rto和Nucleus SE之间有所不同。

任务             

由于Nucleus RTOS调度器比Nucleus SE复杂得多,因此不需要API函数提供的许多工具:             

任务先发制人姿态的改变-不受Nucleus SE支持             

更改任务的优先级–优先级是在配置时使用Nucleus SE设置的,不能更改             

更改任务的时间片–时间片值对于所有任务都是全局的,并在Nucleus SE中在配置时固定             

终止任务–Nucleus SE不支持“已终止”任务状态             

动态存储器              

由于所有内容都是在Nucleus SE中静态创建的,所以不支持(或需要)动态内存。因此,不需要许多特定的API函数。             

信号             

Nucleus RTOS支持信号处理程序,即修改任务信号时运行的例程(类似于中断服务例程)。Nucleus SE省略了此功能,因此不需要对控制信号和注册信号处理程序的API调用。             

中断             

Nucleus SE对中断采取“不干涉”的态度,只需在中断服务例程中方便地执行一些API调用。因此,不需要指定内核进程中断方式的Nucleus RTOS API调用集。             

诊断学             

Nucleus SE的诊断设备非常简单,符合其“精益”设计,仅限于(可选)参数检查和产品版本代码报告。因此,没有实现与历史记录和断言相关联的Nucleus RTOS API调用。             

驱动             

Nucleus RTOS有一个定义良好的、正式的驱动程序结构,有许多与驱动程序管理相关的API函数。Nucleus SE没有这样的结构,因此不需要相关的API调用。

API调用功能             

Nucleus SE功能的几个方面(以简化的方式实现)与Nucleus RTOS存在差异。这些因素中有许多会影响API调用的使用方式和可用的工具。             

超时             

对于Nucleus RTOS,在很多情况下,API调用可以选择挂起一个任务,等待资源的可用性——任务被阻塞。此暂停可能是不确定的,即直到资源可用为止,或者可以指定一个超时值。Nucleus SE提供阻塞API调用作为一个选项,但只能指定不确定的挂起,即调用只能包括NUSE_SUSPEND或NUSE_NO_SUSPEND,而不是超时值。这种能力可以以一种相当简单的方式添加到Nucleus SE中。             

暂停命令             

当使用Nucleus RTOS创建许多类型的对象时,可以指定挂起顺序。这是当资源可用时,许多被阻止的任务将恢复的顺序。有两个选项可用:先进先出(first-in-first-out),即按阻止任务的相同顺序恢复任务;或者按优先级顺序(优先级最高的任务总是先恢复)。Nucleus SE不提供这种选择。只执行优先顺序。实际上,顺序是按任务索引的,因为这不仅适用于优先级调度程序,还适用于循环调度和时间片。

对象特定功能             

在某些情况下,功能会发生变化,这是特定于特定类型对象的。             

信号处理程序             

正如本文前面提到的,Nucleus SE中的信号实现不支持信号处理例程。             

应用程序计时器参数             

计时器具有初始持续时间和重新启动持续时间,并且可以在到期时选择性地执行用户指定的函数。Nucleus RTOS和Nucleus SE都支持此功能。但是,与Nucleus RTOS不同,Nucleus SE不允许在进行reset API调用时更改这些参数中的任何一个。此外,在Nucleus SE中,对过期例程的完整支持是可选的。             

事件标志             

对于Nucleus RTOS,可以选择“使用”事件标志。这意味着符合任务匹配条件的标志将被清除。Nucleus SE中没有提供此功能,因为通过适应满足多个任务的匹配标准的可能性,复杂性大大增加。              

数据大小             

Nucleus RTOS相比,保持简单性和最小化内存使用的两个Nucleus SE设计标准导致了数据项大小的许多差异。需要注意的是,Nucleus RTOS通常使用无符号类型的数据,可能是32位;而Nucleus SE使用合理化的数据类型,如U32、U16、U8等。             

邮箱             

Nucleus RTOS中,一个邮箱携带一条由四个未签名数据项组成的消息。在Nucleus SE中,邮箱携带ADDR类型的符号数据项。我认为邮箱的一个常见用途是在任务之间传递地址(指向某些数据)。

排队             

Nucleus RTOS中,队列处理一个或多个未签名数据元素的消息;队列也可以配置为处理可变大小的消息。在Nucleus SE中,队列处理由ADDR类型的单个数据项组成的消息。我的想法是队列的使用方式与邮箱类似。此外,在Nucleus RTOS中,队列的总大小(即有空间的无符号元素的总数)被指定为无符号值。在Nucleus SE中,该值的类型为U8。因此,队列的数据容量较小。             

管道              

Nucleus RTOS中,管道处理一个或多个字节的消息;管道也可以配置为处理可变大小的消息。在Nucleus SE中,管道处理由一个或多个U8类型的数据项组成的消息。在配置时为每个管道设置消息大小。此外,在Nucleus RTOS中,管道的总大小(即有空间的字节总数)被指定为无符号值。在Nucleus SE中,此值的类型为U8,表示消息数(在NUSE_Pipe_Information()API调用中)。因此,管道的数据容量较小。             

事件标志组              

Nucleus RTOS中,一个事件标志组包含32个标志;在Nucleus SE中,它被减少到8个。这个尺寸被选为Nucleus SE高效处理8位数据的目标处理器。更改Nucleus SE以处理不同大小的事件标志组并不困难。             

信号             

Nucleus RTOS中,每个任务都有一组32个信号标志。在Nucleus中,SE信号是可选的,每个任务只有一组8个标志。这个尺寸被选为Nucleus SE高效处理8位数据的目标处理器。改变Nucleus SE来处理不同大小的信号标志集并不困难。

内存分区             

Nucleus RTOS中,分区的数目和大小都是无符号参数。在Nucleus SE中,分区数是U8类型的参数,分区大小是U16。这意味着对分区和池大小有一些限制。             

计时器             

Nucleus RTOS计时器(两个应用程序计时器和一个任务休眠)中,处理unsigned类型的值。在SE核中为U16型。选择这种类型的处理器可能是Nucleus SE高效处理16位数据的目标处理器(8位不足以发挥作用)。改变Nucleus SE来处理不同大小的计时器并不困难。

posted @ 2020-07-10 19:43  吴建明wujianming  阅读(186)  评论(0编辑  收藏  举报