MS-RTOS 内核定制
本章将介绍 MS-RTOS 内核定制。
登录进入 构建界面 进行内核定制,首先需要选择 MS-RTOS 的版本,然后进行相关的基本属性配置。
基本属性配置
- 工具链配置
CPU 架构以及支持的 FPU 类型
ARM 系列
arm_msrtos_toolchain | 描述 |
---|---|
cotex-m0 | 小巧的 ARM 处理器,可通过 DesignStart 免费获得许可费,非常适用于智能传感器和片上混合信号系统(SoC),三种高度优化的低功耗模式 |
cotex-m0plus | Cortex-M 中面积最小,功耗最低的处理器,8 位处理器成本,32 位处理器性能,三种高度优化的低功耗模式可节省能源,最常用于可穿戴设备的医疗保健,健身等 |
cotex-m1 | 针对 FPGA 设计优化的小处理器,利用 FPGA 上的存储块实现了紧耦合内存(TCM)。和 Cotex-M0 有相同的指令集 |
cotex-m3 | 针对低功耗微控制器设计的处理器,面积小但是性能强劲,支持处理器可以快速处理复杂任务的丰富指令集。具有硬件除法器和乘加指令(MAC),并且,M3 支持全面的调试和跟踪功能,使软件开发者可以快速的开发应用 |
cotex-m4 | 具有混合信号设备的性能,集成数字信号处理(DSP)简化了系统设计,基本的微控制器功能使其成为工业应用的理想选择,部署广泛的 Cortex-M 处理器具有广泛的生态系统 |
cotex-m7 | 性能最高的 Cortex-M 处理器,简化信号处理,为大众带来高性能 DSP,内置浮点处理功能可降低功耗,支持创新的 MCU,可实现更密集的自动化任务 |
cotex-m23 | 具有 TrustZone 安全性的尺寸最小,功耗最低的微控制器。包含 TrustZone 的内置安全基础,内存保护可最大限度地降低意外访问的风险,理想的处理器,用于能量收集物联网节点和小型传感器 |
cotex-m33 | 主流的处理器设计,与 M3/M4 类似,但系统设计更灵活,能耗比更高效,性能更高。M33 还支持 TrustZone 安全扩展 |
cotex-r4 | 主频高达 600MHz(具有 2.45DMIPS/MHz),配有 8 级流水线,具有双发送、预取和分支预测功能、以及低延迟中断系统,可以中断多周期操作而快速进入中断服务程序,适合安全攸关的系统 |
cotex-r5 | 提供无缝,实时的性能和功能安全性双核配置的性能是以前 Cortex-R 处理器的两倍,非常适合开发安全关键产品,最常用于大批量深度嵌入式 SoC 应用 |
cotex-a5 | 可定制的处理器,可在低功耗配置中实现高性能。可扩展的多功能性,适用于对成本敏感的低功耗应用;可配置选项为最小的设备提供丰富的 OS 支持;完整的 Armv7-A 体系结构,为 Cortex-A9 的三分之一面积和功耗 |
cotex-a7 | 适用于 32 位的最小,最低功耗处理器;Armv7-A 扩展提供增强的硬件虚拟化;与前代产品相比,内存性能提高了 20%;支持 32 位,丰富的操作系统,包括 Linux |
cotex-a8 | 适用于复杂操作系统及用户应用的应用处理器,支持智能能源管理(IEM,IntelligentEnergyManger)技术的 ARMArtisan 库以及先进的泄漏控制技术 |
cotex-a9 | 针对性能和功耗进行了优化的多核处理器;适用于低功耗,成本敏感的 32 位器件;可用作单核或最多四个处理器的集群;在多种工艺技术中建立了良好的基础 |
ARM fpu-type | 描述 |
---|---|
disable | - |
fpv-sp-d16 | - |
fpv5-d16 | - |
fvpv3-d16 | - |
fpv4-sp-d16 | - |
fpv5-sp-d16 | - |
ARM 架构的处理器有高中低档之分,corext-m 系列是最低端处理器,cortex-r 系列是中端处理器,cortex-a 系列是高端处理器。不同等级的处理硬件特性有所不同,比如 M 系列普遍没有 MMU,最低端的 M0 甚至没有 MPU 和 FPU,下面介绍构建不同等级的 CPU 类型的 SDK 配置注意事项。
(1)构建 m0,m0plus,m1,m23 系列 CPU 的 SDK 时:
这类 CPU 没有 FPU,MPU,MMU,CACHE,所以在体系结构配置中,必须非选中这 4 项配置,否则将构建失败。
(2)构建 m3,m4,m7,m33 系列,以及 r4,r5 系列 CPU 的 SDK 时:
这类 CPU 具有 FPU,MPU 和 CACHE,但没有 MMU。所以在体系结构配置中,必须非选中 MMU 这项配置,否则将构建失败。其它 3 项配置可以根据需要选中或非选中。
(3)构建 a5,a7,a8,a9 系列 CPU 的 SDK 时:
这类 CPU 具有 FPU,MMU 和 CACHE,但没有 MPU。所以在体系结构配置中,必须非选中 MPU 这项配置,否则将构建失败。其它 3 项配置可以根据需要选中或非选中。
CSKY 系列
csky_msrtos_toolchain | 描述 |
---|---|
ck807 | 面向中高端嵌入式应用的高能效 CPU 核产品;精简指令架构,32 位数据,16/32 位可变长指令;单位性能 2.0DMIPS/MHz;8 级双发射超标量流水线;指令乱序发射、乱序执行和按序退休。 |
CSKY fpu-type | 描述 |
---|---|
soft-float | 软浮点 |
Float_ABI_Type | 描述 |
---|---|
softfp | 编译器把浮点运算转换成浮点运算的函数调用和库函数调用,无 FPU 的指令调用,也无浮点寄存器的参数传递。浮点参数的传递通过 cpu 寄存器或者堆栈完成。 |
hard | 编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元 FPU)去执行。FPU 通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元 FPU 当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。 |
组件选择
组件名称 | 默认选择 | 协议 | 说明 |
---|---|---|---|
MS-RTOS | 必选 | Commercial | MS-RTOS 内核 |
lwip_net | 必选 | BSD-2-Clause | lwIP 网络协议库 |
libmsdriver | √ | BSD-3-Clause | 基于 MS-RTOS 的 IOT-PI 设备驱动 |
esp_at_net | - | MIT | ESP8266/32 无线网络库 |
fatfs | - | BSD-2-Clause | FAT 文件系统 |
littlefs | - | BSD-3-Clause | ARM 开发的小型文件系统 |
littlevgl | - | MIT | LittlevGL 纯 C 开源 GUI 可以搭配 NXP Gui-Guider 图形设计界面进行快速开发 |
st_touchgfx | - | SLA0044 | ST TouchGFX GUI 库 |
st_usb_stack | - | SLA0044 | ST USB 主从设备协议栈 |
nxp_emwin | - | NXP | NXP emWin GUI 库 |
libcmsis | - | Apache-2.0 | ARMCortex 微控制器软件接口标准 5,独立于供应商的 Cortex-M 处理器系列硬件抽象层,便于驱动开发适配 |
u8g2 | - | BSD-2-Clause | 嵌入式设备的单色图形库 |
cjson | - | MIT | ANSIC 编写的轻量化 JSON 解析器 |
mbedtls | - | Apache-2.0 | Mbed TLS 数据加密库 |
libsddc | - | Apache-2.0 | EdgerOS 智能设备发现和控制协议 |
MS-RTOS 内核参数配置
体系结构配置
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
CPU 异常处理 堆栈大小 | 1024 | - | 用于 CPU 进行异常处理 |
用户态线程 内核栈大小 | 1536 | - | ---- |
内核态线程 中断栈大小 | 512 | - | ---- |
FPU 硬件浮 点单元使能 | √ | - | 若 CPU 支持该功能,最好使能以便最大化性能 |
MPU 内存保 护单元使能 | √ | - | 内存安全保护功能,隔离应用层,系统层, 拒绝越级访问内存操作 |
MMU 内存 管理单元使能 | - | - | 虚拟内存管理单元, 嵌入式 CPU 很少具备该功能 |
Trustzone 使能 | - | - | 仅 Cortex-M33 支持该功能 |
CACHE 使能 | - | - | 使能 CPU Cache 缓冲 |
CPU 核心名 | CPU_Type | - | 为自动配置项,不要随意手动更改 |
关中断时间 测量使能 | - | - | 用于检测关闭中断所使用的时间 |
Trustzone 安全环境上下文栈大小 | 2048 | - | 用于进入 Trustzone 时保存上下文环境 |
Trustzone 安全环境异常栈大小 | 1024 | - | ---- |
C-SKY 处理器是否带有 ldex 指令 | - | - | ---- |
RISC-V 处理器是否使用 Machine Level | √ | - | RISC-V 处理器特权级 Machine ,用于运行 Bootloader 和其他固件, 该特权级为必须实现层级 |
RISC-V 处理 器 FPU 类型 | 单精度 | 单精度, 双精度,四精度 | RISC-V CPU 浮点运算 FPU 类型 |
内核配置
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
内核 tick 频率 | 1000Hz | - | 默认设置为 1ms,具体可以 根据实时性来更改配置 |
电源管理使能 | - | - | ----- |
Tick-less 模式使能 | - | - | 低功耗模式,自动调整 tick 频率, 减少 tick 中断,空闲时进入睡眠,降低功耗 |
内核 shell 命令使能 | √ | - | MS-RTOS 内核部分的 shell 命令, 通过串口交互来协助开发和调试 |
最大线程数 | 64 | - | 默认 64 个线程基本满足绝大部分场景, 具体可根据需要进行修改 |
最大计数信号量数 | 128 | - | 程序可以创建的计数信号量数目 |
最大互斥量数 | 64 | - | 程序可以创建的互斥信号量数目 |
最大条件变量数 | 32 | - | ----- |
最大消息队列数 | 32 | - | ----- |
最大事件标志组数 | 16 | - | ----- |
最大定长 内存分区数 | 6 | - | ----- |
最大读写锁数 | 16 | - | ----- |
最低线程优先级 | 64 | - | 线程的优先层级可根据 实际应用需要进行减少或扩充 |
空闲线程堆栈大小 | 512 | - | 用于空闲进程使用 |
最大内核软 件定时器数 | 4 | - | 在内核中可以创建的软件定时器数目 |
内核软件定时器 线程堆栈大小 | 1024 | - | ----- |
内核软件定时器 线程优先级 | 2 | - | ----- |
内核软件定时器 线程时间片 | 0 | - | 默认内核软件定时器不使用时间片 |
内核软件定时器 线程选项 | REENT_EN | None、REENT_EN、FPU_EN | ----- |
最大进程数 | 5 | - | 所能运行的最大进程数目 |
进程崩溃时 是否重启机器 | - | - | 默认关闭,在开发阶段 重启不太利于调试 |
最大进程 内存区域数 | 3 | - | ----- |
进程内存分配 单位大小 | 4KB | 4\8\16\ 32\64\128\ 256KB | 进程对内存分配时的 最小分配单位大小 |
最大进程软件 定时器数 | 4 | - | ----- |
进程软件定时器线程堆栈大小 | 1024 | ----- | |
进程软件定时器线程优先级 | 3 | - | 需要低于内核软件定时器的优先级 |
进程软件定时器线程时间片 | 0 | - | ----- |
进程软件定时器线程选项 | REENT_EN | None、REENT_EN、FPU_EN | 创建线程时可根据需要进行复选 |
最大进程信号数 | 32 | - | ----- |
最大进程通知数 | 6 | - | ----- |
中断管理使能 | - | - | ----- |
中断服务程序 ISR 管理使能 | - | - | ----- |
中断抢占使能 | √ | - | 软中断可以被硬中断抢占, 硬中断可以被更高优先级的中断抢占 |
最大中断号 | 64 | - | 默认为 64 个中断, 根据实际情况进行修改 |
最大中断底半部数 | 10 | - | 优先级偏低的,可以被打断的 中断处理数目,根据开发需要定义 |
中断底半部 线程堆栈大小 | 1024 | - | 根据具体底半部处理 局部变量使用情况而定 |
中断底半部 线程优先级 | 0 | - | 作为中断,应该放置到优先级为 0, 以便程序优先去调度处理 |
中断底半部 线程时间片 | 0 | - | 默认不使用时间片调度影响实时性 |
中断底半部 线程选项 | REENT_EN | None、 REENT_EN、FPU_EN | 可多选,线程使能 C 库 可重入结构,线程使能 FPU 使用 |
内核分析 子系统使能 | √ | - | ----- |
Segger RTT view 缓冲区索引 | 0 | - | ----- |
内核行为跟踪使能 | - | - | ----- |
内核代码覆盖率 分析使能 | - | - | ----- |
内核代码覆盖率 分析缓冲区大小 | 256 | - | ----- |
内核堆使用 检查使能 | √ | - | 方便用户查询内存堆使用情况, 在 shell 中可以直接使用命令进行查看 |
内存堆算法 | Original | TLSF、Original | TLSF 是一个动态内存算法,时间复杂度 O(1),在碎片问题上表现良好。 |
IO 子系统使能
配置项 | 默认值 | 可选范围 | 描述 |
---|---|---|---|
最大文件名长度 | 64 | ----- | ----- |
最大文件路径长度 | 128 | ----- | ----- |
最大打开文件数 | 32 | ----- | ----- |
最大文件描述符 | 32 | ----- | ----- |
IO 子系统 shell 命令使能 | √ | ----- | IO 部分 shell 命令,利于查看 IO 状况 |
IO 子系统动态 内存分配使能 | - | ----- | 默认使用静态内存分配,根据需求设置 |
最大 select 文件描述符数 | 16 | ----- | select 函数所能同时选择的文件描述符个数 |
MS-FLASHFS 使能 | √ | ----- | MS-RTOS 自主研发的针对 MCU 内部 FLASH 的掉电安全文件系统,主要用于存放 App 镜像和启动参数文件, 支持 App XIP(片内执行) |
MS-FLASHFS 最大扇区数 | 32 | ----- | 划分的 flash 扇区数目 |
MS-FLASHFS 最大文件数 | 32 | ----- | flash 上所支持的文件数目 |
MS-FLASHFS 每扇区最大单元数 | 16 | ----- | 每个扇区所分割的单元数目 |
IO JOB 功能使能 | √ | ----- | IO 工作一般用于检查 SD 是否插拨、网线是否插拨、 传感器数据采集等 |
IO JOB 线程 堆栈大小 | 1024 | ----- | ----- |
IO JOB 线程优先级 | 6 | ----- | ----- |
IO JOB 线程时间片 | 0 | ----- | ----- |
IO JOB 线程选项 | REENT_EN | None、REENT_EN、 FPU_EN | ----- |
IO JOB 最大缓存中断 API 消息数 | 4 | ----- | ----- |
驱动配置
配置项 | 默认 | 设置范围 | 描述 |
---|---|---|---|
管道驱动 | √ | ----- | pipe 驱动使能 |
空设备驱动 | √ | ----- | 作为一个黑洞设备, 用于丢弃不需要的输出流 |
共享内存 设备驱动 | √ | ----- | 用于不同进程间内存共享 |
Trace 设备驱动 | √ | ----- | 用于追踪记录进程,查找问题 |
RTC 驱动 | √ | ----- | 实时时钟驱动,默认使能, 一个标配驱动 |
伪终端驱动 | √ | ----- | tty 驱动,用于 ssh/telnet 等远程协议 打开的命令行界面 |
时钟驱动 | √ | ----- | ----- |
DMA 驱动 | √ | ----- | ----- |
DMA 工作池大小 | 8 | ----- | ----- |
硬件看门狗设备驱动使能 | √ | ----- | 打开硬件看门狗设备的 App 都需要 周期性及时喂狗,否则 CPU 重启, 主要用于提高系统的整体可靠性 |
硬件看门狗线程堆栈大小 | 512 | ----- | ----- |
硬件看门狗线程优先级 | 2 | ----- | 优先级足够高以将程序及时复位 |
硬件看门狗线程时间片 | 0 | ----- | 默认不使用时间片调度, 确保实时性 |
健康监控 设备驱动 | √ | ----- | 打开健康监控设备的 App 都需要周期性及时喂狗, 否则调用 BSP 自定义的异常处 理逻辑(如重启应用),主要用于在 App 卡死时能及时重启 App |
健康监控 线程堆栈大小 | 512 | ----- | ----- |
健康监控 线程优先级 | 2 | ----- | ----- |
健康监控 线程时间片 | 0 | ----- | ----- |
健康监控默认截止时间(单位:秒) | 10 | ----- | App 及时喂狗的截止时间间隔 |
健康监控异常时默认处理模式 | 记录到日志 | 记录到日志、重启应用、杀死应用、重启机器、关机 | 当出现异常时的处理方式 |
libc 使能
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
libc 使用全局锁使能 | √ | ----- | ----- |
C++ 使能
POSIX 子系统使能
配置项 | 默认值/字节 | 设置范围 | 描述 |
---|---|---|---|
mkfifo 函数创建的 fifo 大小 | 128 | ----- | 进程间通信 IPC 通道的缓冲大小 |
最大 posix 消息队列数 | 0 | ----- | 默认不使用 posix 消息队列, 使用 MS-RTOS 的消息队列, 可根据需求配置 |
posix 消息队列缺省最大消息数 | 16 | ----- | 创建消息队列时默认 的最大消息数量 |
posix 消息队列缺省消息大小 | 64 | ----- | 创建消息队列时默 认每个消息大小 |
posix 对象名字最大长度 | 64 | ----- | 创建 posix 对象时所 允许的名字长度 |
网络子系统使能
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
网络子系统 shell 命令使能 | √ | ----- | 网络相关 shell 命令加入,默认使能 |
SHELL 使能
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
Shell 输入 缓冲区大小 | 128 | ----- | shell 命令行所能接收的命令长度 |
Shell 输出 缓冲区大小 | 128 | ----- | shell 命令行输出时所使用的 缓冲区大小,分配过大影响空间,过小影响性能 |
最大 shell 命令参数个数 | 10 | ----- | 使用 shell 命令时最大传入的参数个数 |
xmodem 命令使能 | √ | ----- | uart 传输协议 xmodem 使用 shell 命令进行传输使能 |
xmodem uart 波特率 | 115200 | 1200,2400,4800,9600,19200,38400,57600,115200 | uart 传输速率 |
xmodem uart 校验位 | None | even,odd,space,mark | 数据校验方式,包括基本 的奇偶校验,固定 0(space)/1(mark)校验位 |
xmodem uart 数据位 | 8 | 5 - 8 | 每次传输的有效数据位, 影响传输的效率,一般默认为 8 位 |
差分升级库使能
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
ms_patch 函数内部动态分配缓冲区大小 | 1024Byte | ----- | 差分升级每次传输的包的大小 |
App 启动器使能
配置项 | 默认值 | 设置范围 | 描述 |
---|---|---|---|
App 镜像数字签名算法 | None | RSA-2048、RSA-3072、 ED25519、ECDSA | App 镜像数字签名有效阻止了未经签名或被恶意篡改或伪造的 App 在 目标系统(如智能电力设备)上运行,有效保证了目标系统的安全性 |