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来处理不同大小的计时器并不困难。

Nucleus-SE迁移:未实现的设施和兼容性的更多相关文章

  1. 使用Nucleus SE实时操作系统

    使用Nucleus SE实时操作系统 Using the Nucleus SE real-time operating system 到目前为止,在本系列文章中,我们详细介绍了Nucleus SE提供 ...

  2. Nucleus SE RTOS初始化和启动

    Nucleus SE RTOS初始化和启动 Nucleus SE RTOS initialization and start-up 对于任何类型的操作系统,都有某种类型的启动机制.具体的工作方式因系统 ...

  3. java SE(未完结)

    数据类型与运算符 数据类型 基础数据类型 数值型 正整型 byte short int long 结尾加(l/L) 浮点型 float 结尾加(f/F) double 字符型 char 只能存储一个字 ...

  4. ECshop 在迁移到 PHP7 时遇到的兼容性问题

    在 PHP7 上安装 ECShop V2.7.3时,报错! Deprecated: Methods with the same name as their class will not be cons ...

  5. Nucleus 实时操作系统中断(上)

    Nucleus 实时操作系统中断(上) Interrupts in the Nucleus SE RTOS 所有现代微处理器和微控制器都有某种中断设施.这种能力对于提供许多应用程序所需的响应能力是必不 ...

  6. 关于 Java(TM) Platform SE binary 已停止工作 的解决方法

    一.问题描述 昨天晚上Myeclipse还用着好好的,今天早上打开工程,只要运行就卡住,大半天弹出个消息窗口:Java(TM) Platform SE binary 已停止工作. 如图 关闭Myecl ...

  7. Laravel学习笔记(三)数据库 数据库迁移

    该章节内容翻译自<Database Migration using Laravel>,一切版权为原作者. 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: ...

  8. 平台支持的从经典部署模型到 Azure Resource Manager 的 IaaS 资源迁移

    本文介绍如何才能将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Resource Manager 部署模型. 用户可以阅读有关 Azure Resource Manager 功能和优点的更多 ...

  9. Nucleus 实时操作系统中断(下)

    Nucleus 实时操作系统中断(下) Nucleus RTOS兼容性 由于中断在Nucleus SE中的实现方式与Nucleus rto截然不同,因此不应期望有特定的兼容性.Nucleus RTOS ...

随机推荐

  1. POJ 2135 简单费用流

    题意:       题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路:        这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最 ...

  2. Python中根据库包名学习使用该库包

    目录 Python库包模块 import 语句 from-import 语句 搜索路径 PYTHONPATH 变量 命名空间和作用域 查看模块中所有变量和函数,以及查看具体函数的用法 globals( ...

  3. [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护

    首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了.在他的教程里我学到了不少东西.第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出.说不定 ...

  4. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

  5. angr脚本——以angrctf解题记录为参考

    angr脚本--以angrctf解题记录为参考 ​ angr是用于逆向工程中进行二进制分析的一个python框架 ​ 符号执行 (Symbolic Execution)是一种程序分析技术.其可以通过分 ...

  6. ThreadLocal引起的一次线上事故

    > 线上用户存储数据后查看提示无权限 前言 不知道什么时候年轻的我曾一度认为Java没啥难度,没有我实现不了的需求,没有我解不了的bug 直到我遇到至今难忘的一个bug . 线上用户存储数据后查 ...

  7. VS·.Net WCF多项目调试方法

    阅文时长 | 0.12分钟 字数统计 | 252.8字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·.Net WCF多项目调试方法』 编写人 | SCscHero 编写时间 | ...

  8. [Java] SpringBoot

    背景 简化SSM(H)中大量的配置工作,开发人员只关心提供业务功能 可以看成简化了的.按照约定开发的SSM(H) 概念 JavaBean:满足规范的Java类(属性private+默认构造方法+get ...

  9. 攻防世界(六)supersqli

    攻防世界系列:supersqli 方法一: 用逗号包裹回显正常,说明存在注入 1';--+(注释符也可用 -- 或 # 发现均未被过滤!) 有order by 语句可知表由2个字段,使用联合查询 (想 ...

  10. Ansible_编写Playbook文件

    一.Playbook的实施 1.Ansible playbook与临时命令概述: 临时命令可以作为一次性命令对一组目标主机运行一项简单的任务 play是针对清单中选定的主机运行的一组有序任务.play ...