关于RTOS的全部真相。 第32条 Nucleus SE迁移:未实现的功能和兼容性

开发Nucleus SE的主要要求是与Mentor RTOS主要产品Nucleus RTOS高度兼容。 Nucleus SE支持Nucleus RTOS的某些功能,在先前的文章中已经讨论了很多次,但是在本文中,我将尝试在一个地方收集所有关键差异。 本文旨在为所有打算从一个内核切换到另一个内核,或正在为特定项目选择内核的人员提供快速参考。



除了有限或简化的功能外,与Nucleus RTOS相比,Nucleus SE的设计还着重于通过广泛的自定义选项最大化内存利用率。 这种方法的重要部分是可伸缩性。 可以根据需要激活或禁用内核功能的许多功能。 显然,在特定实现中禁用功能会增加其与Nucleus RTOS的不兼容性。

在Nucleus RTOS中,可以使用未定义数量的内核对象创建系统,此处唯一的限制是可用资源(即内存)的数量。 Nucleus SE每种类型最多只能有16个对象。 该系统可以具有1到16个任务以及每种类型的0到16个对象(邮箱,队列等)。 尽管可以增加此限制,但由于Nucleus SE广泛利用了将对象的索引存储在半字节(四位)中的能力,因此需要大量的精力。 此外,在执行超过16个任务时,优先级调度程序可能会变得非常低效。 功能严重受到这些限制的应用程序不适合Nucleus SE,在这种情况下,Nucleus RTOS是更合适的选择。


策划人


像所有现代实时内核一样,Nucleus RTOS具有非常灵活的调度程序,可提供多个优先级级别(每个优先级级别的任务数量不确定),以及选择Round Robin和Time Slice调度程序的能力。 Nucleus SE更为简单,它提供了四个在构建时必须选择的调度程序:“运行至完成”,“循环调度”,“时间片”和“优先级”。 不可能组合不同的调度程序(也就是说,没有复合调度程序)。 例如,您不能选择“时间片”和“优先级”调度程序的组合。 此外,优先级调度程序仅允许您为每个优先级分配一个任务,即,优先级与任务数量一样多。 任务的优先级是在构建过程中设置的,并且不再更改(例如,如果选择了“时间片”调度程序的时隙)。

API调用


应用程序编程接口(API)-操作系统的可见“面孔”。 毫不奇怪,这是Nucleus RTOS和Nucleus SE之间最明显的区别。

Nucleus SE API与Nucleus RTOS API不同。 但是,Nucleus SE API经过精心设计,因此可以将其转移到Nucleus RTOS API片段中。 获得许可的Nucleus RTOS的持有人可以获得一个“外壳”(包含#define宏的头文件),该外壳几乎可以直接执行传输。

从可以将Nucleus SE API称为Nucleus RTOS API的“子集”这一事实出发,可以发现缺少一些API调用。 这是事实,这是Nucleus SE开发标准的必然结果。 一些API调用根本就没有意义,因为它们与不存在的功能相关联;其他调用被排除在外是为了简化某些内核对象的实现。 本文的以下各节将详细描述所有这些。

常用API函数


Nucleus RTOS具有几种不同类型的内核对象甚至所有类型的对象共有的API函数。 其中一些也是在Nucleus SE中实现的,可以重置此类功能的一个很好的例子。 其他功能不适用于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 RTOS和Nucleus SE中有所不同。

任务

由于Nucleus RTOS Scheduler比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_SUSPENDNUSE_NO_SUSPEND ,而不能使用超时值)。 将该功能添加到Nucleus SE非常简单。

暂停程序


在Nucleus RTOS中创建多个对象类型时,可以指定暂停顺序。 这是一个顺序,在此顺序中,将在资源可用时恢复几个被阻止的任务。 有两个选项:FIFO,先进先出(先进先出),其中任务按照被阻塞的相同顺序恢复; 或按优先级排列,其中优先级最高的任务始终首先恢复。 Nucleus SE不提供这种选择。 它仅实现优先级顺序。 实际上,用任务索引来说明顺序是更正确的,因为暂停顺序不仅可以在使用优先级调度程序时应用,而且在使用循环调度和时间片调度程序时也可以应用。

独特功能


在某些情况下,与某些类型的对象相关的功能更改是必要的。

信号处理器
如上所述,Nucleus SE中的信号实现不支持信号处理过程。

应用程序计时器设置
计时器具有初始运行时长/初始运行时长和重新启动时长,可以选择在完成时执行用户定义的功能。 Nucleus RTOS和Nucleus SE均支持此功能。 但是,与Nucleus RTOS不同,Nucleus SE不允许在调用API函数进行重置时更改上述参数。 另外,在Nucleus SE中,对计时器完成过程的所有支持都是可选的。

事件标志
Nucleus RTOS可以“吸收”事件标志。 这意味着将重置与任务设置的条件匹配的标志。 Nucleus SE不支持此类功能,因为搜索多个任务的标准的能力会大大增加系统的复杂性。

资料大小


与Nucleus RTOS相比,Nucleus SE的两个开发标准:保持简单性和最小化内存使用量,导致数据元素大小的某些差异。 值得注意的是,Nucleus RTOS通常使用无符号数据,最有可能是32位。 Nucleus SE使用简化的数据类型,例如U32U16U8等。 ( 译者注:我认为作者是对8位系统而言是正确的。在现代系统中,寄存器仍为32位,因此剪切较旧的部分会消耗代码和执行时钟周期所需的内存,并且将数据存储在32位时都相同,等于32位内存,否则系统性能会下降,因此这种方法不会给现代系统带来任何好处,并且由于编译器添加的指令会切断较旧的部分而造成的损失会非常好

邮箱


在Nucleus RTOS中,邮箱存储由四个未签名的数据元素组成的消息。 在Nucleus SE中,邮箱存储ADDR数据项。 在我看来,邮箱通常用于在任务之间传输地址(指示特定数据)。

Queue列


在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中,其数量减少到八个。 选择此大小是因为可能的目标Nucleus SE处理器可以有效地处理8位数据。 同时,改变由Nucleus SE处理的事件的标志组中的标志数量将不会很困难。

讯号


在Nucleus RTOS中,每个任务都有一组32个信号标志。 在Nucleus SE中,信号是可选的,每个任务都有一组8个标志。 选择此大小是因为可能的目标Nucleus SE处理器可以有效地处理8位数据。 同时,改变由Nucleus SE处理的信号的标志集中的标志数量将不会很困难。

内存段


在Nucleus RTOS中,分区的数量和大小是无符号的 。 在Nucleus SE中,分区数是U8类型的参数,分区大小是U16 。 这导致了一些分区和池大小的限制。

计时器


在Nucleus RTOS中,计时器(应用程序计时器和任务睡眠计时器)都使用无符号值。 在Nucleus SE中,它们的类型为U16 。 选择该类型的原因是,可能的目标Nucleus SE处理器可以有效地处理16位数据(而八位显然不足以使用计时器)。 同时,在Nucleus SE中更改计时器的大小并不困难。

下一篇文章将研究如何在嵌入式软件项目中使用Nucleus SE。

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

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


All Articles