Nuttx RTOS入门知识简介及开源代码运行

电子说

1.3w人已加入

描述

1. 简介

1.1 nuttx介绍

定时器

NuttX是一个成熟的实时操作系统,于07年由Gregory Nutt先生正式开源,2016年被三星选为TizenRT操作系统的内核,2019年在小米的推动下正式进入Apache基金会,经过开源社区多年的不懈努力,NuttX功能丰富,性能稳定,商业化成熟度高,Fitbit最近两代的手环产品和索尼多款消费级产品都是基于NuttX开发的。

NuttX 是一个实时操作系统 (RTOS),强调标准合规性占用空间小。NuttX 中的主要管理标准是 Posix ANSI 标准,可从 8 位微控制器环境扩展到 64 位微控制器环境。来自 Unix 和其他常见 RTOS(例如 VxWorks)的附加标准 API 被用于这些标准下不可用的功能,或者不适合深度嵌入环境的功能(例如 fork())。

NuttX可运行于各种处理器架构硬件平台上,包括ARM、MIPS、AVR等其重点遵从特定的标准并且尽量 可伸缩良好且可适应从8位到32位单片机环境

NuttX遵循POSIX标准,在Linux中广泛应用的API接口,并且具有实时操作系统(RTOS)的特性。它采用模块化设计,将内核空间和用户空间分离,并提供了丰富的驱动程序和服务程序,包括文件系统、网络协议栈、USB主机/设备支持等。同时,它还支持多任务、多线程、信号量、消息队列、事件驱动等特性,方便用户进行开发和调试。 

NuttX特点: 

开源免费:NuttX是一款完全开源、免费的操作系统,可以自由下载和使用。 

可移植性:支持各种处理器架构和硬件平台,具有良好的可移植性和通用性。 

稳定可靠:经过长时间的使用和测试,已经成熟稳定,能够满足各种嵌入式应用的需求。

易用性高:具有简单易学的API和文档,便于开发者学习和使用。

NuttX应用场景:

工控系统:可以将NuttX应用于各种工业自动化、机器人控制、智能电网等工控领域。

消费电子:可以将NuttX应用于各种消费电子产品,例如:移动设备、家庭娱乐系统、数字相框等。

智能家居:可以将NuttX应用于智能家居领域,例如:温度控制、灯光控制、安全监测等。

主要特点分析:

物联网领域应用广泛

系统资源的要求远小于Linux,但是可以提供和Linux系统相近的功能和性能,可以被看作很多低端Linux系统的替代方案。

功能高度可裁剪,可以支持系统资源使用跨度极大的各种产品形态,开发者可根据实际需求对系统进行定制。

由于它对POSIX接口的兼容,Linux平台上现有的开源库和组件都可以很方便的移植,另外由于软件平台对硬件平台作出了隔离和统一,因此厂商的上层应用代码在移植到不同硬件平台时也可以更好的复用。

NuttX本身提供了丰富的OS组件,所以应用开发者可以利用丰富的OS组件和应用框架,快速的完成系统的定制和应用的开发,减少开发成本,让产品更快的投放市场。

实时性:Nuttx是一个实时操作系统,可以提供精确的时间管理和响应。这对于需要严格时间控制的嵌入式应用非常重要。Linux系统虽然可以提供实时性,但通常需要额外的配置和补丁。

可移植性:Nuttx被设计为高度可移植的,可以在多种硬件平台上运行。它支持许多不同的处理器架构和设备。Linux系统也具有很高的可移植性,但在某些嵌入式设备上可能需要更多的定制和适配工作。

市场上开源或商业的RTOS非常多,为什么我们选择NuttX?主要有以下几个原因:

NuttX对POSIX标准有原生兼容:NuttX是可商用化RTOS中唯一一个对POSIX API有原生支持的实时操作系统,所以很多Linux社区的开源软件可以很方便的移植到NuttX上,这样可以极大的简化开源软件移植,方便代码复用,降低学习曲线,其它RTOS需要适配层把POSIX API转成内部API,而且通常只兼容一小部分的POSIX接口。

完成度高:NuttX集成了文件系统、网络协议栈、图形库和驱动框架,减少开发成本。

模块化设计:所有组件甚至组件内部特性,都可以通过配置Kconfig来调整或关闭,可按需对系统进行裁剪,适用于不同产品形态。

代码精简:所有组件都是从头编码,专门对代码和数据做了优化设计。

轻量级:虽然NuttX实现了传统操作系统的所有功能,但是最终生成的代码尺寸还是可以很小(最小配置不到32KB,最大配置不超过256KB)。

和Linux系统的兼容性:因为NuttX整体设计、代码组织,编译过程和Linux非常接近,将会极大地降低Android/Linux开发者的迁移成本。

活跃开放的社区:很多厂商(比如小米、Sony,乐鑫、NXP等)和开源爱好者都在积极回馈社区。

1.2 NuttX的系统架构

定时器

上图从纵向看,NuttX和传统操作系统一样由调度子系统、文件子系统、网络子系统、图形子系统和驱动子系统组成。

从横向看,NuttX向上给应用程序提供了POSIX和ANSI定义的标准C/C++接口。对于没有标准化的组件(比如各种外设),NuttX通常会提供兼容Linux的API。向下NuttX定义了Arch API、块设备驱动接口、网卡驱动接口、display驱动接口,以及各种总线和外设的lower half驱动接口,使得芯片厂商能够规范、快速地完成移植工作。下图中数量众多的蓝色模块就是NuttX实现的各种功能。

子系统介绍:

调度子系统: NuttX支持大多数RTOS都没有实现的进程概念,并提供完整的POSIX API,比如pthread、信号量、消息队列、时钟/定时器、信号、环境变量等。同时,也支持RTOS上常见的优先级翻转和tickless模式。NuttX支持对称多处理(SMP)和非对称多处理(AMP)两种多核编程模式,开发者可以根据芯片设计的特点和应用场景的需求,选择使用SMP或AMP,甚至同时使用SMP和AMP。NuttX支持所有常见CPU架构,比如Cortex-A/Cortex-R/Cortex-M、AVR、MIPS、32位/64位 RISC-V,X86/X64,Z80,以及Tensilica和CEVA的DSP,并有超过150款芯片成功移植到NuttX上。 

文件系统: NuttX设计了一套完整而小巧的虚拟文件系统,除了支持统一的目录和文件操作外,还支持挂载点、字符设备,块设备等高级概念。直接支持10多种常用的文件系统。比如FAT、LittleFS、SmartFS、NFS、ROMFS、TMPFS等。另外,NuttX内置根文件系统,无需挂载即可启动,极大的简化了开发和部署流程。

 网络子系统: NuttX实现了完整的网络协议栈,支持以太网、WiFi、802.15.4、蓝牙、CAN等数据链路层协议,支持IPv4、IPv6以及相关的ARP、ICMP、IGMP、MLD等传输层协议,实现了BSD兼容套接字API,除了常见的TCP、UDP协议外,还支持raw packet、unix domain、netlink套接字类型。另外,NuttX还提供了大量的应用层协议实现,比如DHCP、DNS、NTP、Telnet、FTP、SMTP、HTTP等。 

驱动子系统: 除了接入到文件系统的块设备驱动和接入到TCP/IP协议栈的网络设备驱动外,NuttX还为各种常见总线和外设定义了类似Linux的字符设备驱动。一方面通过NuttX为每类设备定义的标准IOCTL接口,应用程序可以用统一的API访问不同厂商的硬件驱动,另一方面NuttX驱动框架实现了和硬件无关的操作(比如权限控制、buffer管理,睡眠/唤醒等),降低驱动程序的开发难度。最后,NuttX提供了一套基于activity统计的低功耗管理框架,使得驱动程序可以方便地实现低功耗控制。

1.3 Xiaomi Vela 介绍

定时器

Xiaomi Vela 项目,是小米基于开源实时操作系统NuttX打造的嵌入式物联网软件平台。小米基于 Apache NuttX 开发了为解决物联网碎片化而生的,物联网领域自研的嵌入式软件平台——Xiaomi Vela。

在各种不同的物联网硬件上提供统一的软件平台,支持高性价比的MCU设备,为IoT的繁荣构建基础设施。Xiaomi Vela 通过组件化能力,做到高度可伸缩、可裁剪,支持丰富的组件和易用的框架。同时,可以很方便的去支持功能差异跨度极大的各种物联网设备。还与 Linux 保持高度兼容性,适合做 Linux 的平替,帮助硬件实现降本。并基于物联网的特性,在多核异构、安全、超低功耗渲染和连接方面都建设了独有的能力。

IoT领域跟传统的PC和手机行业相比,最大的差异点就是IoT设备极其碎片化,这个碎片化给小米自身以及整个行业带来了效率低下的问题(代码的不可复用、软件的重复建设)。随着IoT行业的高速发展,到2030年全球还会新增150亿IoT设备,所带来的碎片化问题只会是越来越严重。因此,迫切的需要一个统一的软件平台来打通碎片化的IoT应用,让其能够和谐共通。

Xiaomi Vela 可以通过丰富的组件和标准化的软件框架,打通碎片化的物联网应用场景;可以确保信息在设备间高效无缝的流转;能够做到更多物联网产品的互联随心配,为用户带去更趣味、多样性的搭配选择。目前 Xiaomi Vela 已经装载在含智能家居、穿戴、智能音箱等品类的数百款、千万级的智能设备上。能够联动构建更多丰富且实用的智能场景,拥有更极致的设备互联的体验,让全球每个人都能享受科技带来的美好生活,这是Xiaomi Vela的目标,同时也是小米公司的愿景。

定时器

Xiaomi Vela 主要特性:

高效性能:Vela 基于 NuttX 内核,具有高实时性、低功耗、低延迟等特点,适用于各种资源受限的嵌入式设备。

丰富组件:Vela 提供了多种常用的组件,如网络、音频、视频、图形、安全等,方便开发者快速构建应用。

易用框架:Vela 提供了一套统一的应用框架,支持 Lua、JavaScript 等脚本语言开发应用,并提供了丰富的 API 和文档。

万物互联:Vela 支持多种通信协议和标准,如 WiFi、BLE、Zigbee、MQTT 等,并提供了小米妙享技术,实现设备之间的无缝连接和协同。

定时器

底层 NuttX 内核:提供最基本的任务调度、跨进程间通信、文件系统等基础 OS 功能,同时也提供简洁高效的设备驱动、轻量级的 TCP/IP 协议栈和电源管理等组件。

应用框架:分为上下两层,下层是为扩展系统服务而提供的通用应用框架,上层是针对不同的物联网应用而开发的定制应用框架,例如多媒体应用框架和传感应用框架,提供 Cloud SDK 可以方便开发者更快速的接入小米云服务。

开发者工具:除了常见的 Logger 和 Debugger 工具,Xiaomi Vela 还提供 Emulator 工具来帮助开发者提升调试效率,使用 Emulator,开发者可以利用 PC 端丰富的调试工具和调试信息,降低嵌入式系统开发和调试的难度。

1.3.1 小米澎湃OS

看架构图,澎湃OS是一个大OS的概念,涵盖硬件上的所有软件。

定时器

小米澎湃OS的底层核心系统由Linux和自研Xiaomi Vela融合而成,异构兼容性与系统资源管理能力可以让每一台设备都能发挥最佳性能。

小米Vela是基于开源嵌入式操作系统 NuttX 打造的物联网软件系统平台,目前已运作于小米多款智能家居产品之上。也就是说,小米澎湃OS搭建于安卓开源与小米物联网平台基础之上,保留安卓生态与海外市场,同时争取留存尽可能多的小米生态用户群体。

小米将安卓的服务框架和自研Vela系统的服务框架都作为“中间件”纳入其中。同时全新打造八大子系统,其中全新的AI子系统融合大模型能力成为整个系统的“智能大脑”,不仅可以让单设备实现极强的端侧AI能力,同时赋予整个生态智能能力。

最上层HyperConnect 跨端层打破了硬件设备的隔阂,让所有设备可以统一连接协议,并且实时通信,最终构建“人车家全生态”的智能世界。另外,此次小米打造了贯穿内核层、服务框架层、跨端层的全端安全系统, 尤其在内核层启用了完全独立的“自研微内核安全系统”,保障了安全从最底层实现。

澎湃 OS 最重要的五大特性:

澎湃OS以底层重构覆盖人车加全生态丰富多样的硬件设备;

基于自研的先进跨端互联框架,让设备高效连接;

拥有AI 框架,在AI大模型的全面加持下,给系统应用带来了更好的表现,

同时搭载 Hyperman 的这个设备互联的思考中枢,

迈向主动智能时代。

用小米澎湃OS去对标华为鸿蒙系统,两个系统目的类似,但做法不一样。小米主要基于安卓系统基础上重写底层,再加入嵌入式系统的兼容,其本质内核没有变,但由于重写了底层,在以后其他产品进行系统配对或系统间互动的时候,会更加平滑。

因此,小米要建一个小米生态世界,这个OS势在必行。而小米下一个要开发的场景就是车,车机交互、人机交互、人才交互,紧密关系到用户的实际体验,所以重构的操作系统对于未来小米提升自身产品使用体验具有重大意义。

国内其他厂商也在做同样类似的事情,在硬件同质化越来越严重的情况下,需要通过做好软件去提升人际交互和用户体验。一个能拥有自主开发的操作系统更便于做深度定制或者差异化定制,也可以为未来导入人工智能相关打开更好的通道

小米汽车有两个独特的竞争优势:第一是与既有生态整合,包括操作系统、应用程式、手机与IoT等硬件;第二是销售渠道遍及海外市场。

1.3.2 鸿蒙与Vela的异同

IoT领域迫切需要一个统一的物联网操作系统,比ucosIII、freeRTOS更高级,比linux更轻量级。能提提供丰富组件,丰富的生态,便捷的使用,解决碎片化问题。在这方面 Xiaomi Vela和开源鸿蒙系统都在发力,比如OpenHarmony。OpenHarmony LiteOS-A内核是基于Huawei LiteOS内核演进发展的新一代内核,Huawei LiteOS是面向IoT领域构建的轻量级物联网操作系统。在IoT产业高速发展的潮流中,OpenHarmony LiteOS-A内核能够带给用户小体积、低功耗、高性能的体验以及统一开放的生态系统能力,新增了丰富的内核机制、更加全面的POSIX标准接口以及统一驱动框架HDF(OpenHarmony Driver Foundation)等,为设备厂商提供了更统一的接入方式,为OpenHarmony的应用开发者提供了更友好的开发体验。

在物联网时代,操作系统是最底层基础的系统架构,很多上层应用都基于操作系统才能布局生态。就在小米对外正式发布自家物联网操作系统Xiaomi Vela同一天,华为也举办了一场新品发布会,发布了15款智选新品,这是华为的物联网操作系统鸿蒙OS首次应用在华为智选生态产品上。而在小米官方对Vela介绍中,Xiaomi Vela对标的其实是华为LiteOS。然而,随着LiteOS融入鸿蒙OS,Xiaomi Vela终将要面对的仍然是鸿蒙OS。无论是鸿蒙还是Xiaomi Vela,都是为了打通物联网最基础的联通、协同相关功能。

但两者仍然略有差异:在战略层面:鸿蒙OS发布之初,华为官方对标的是安卓系统比;Xiaomi Vela则更倾向于认为是与Linux、安卓等高价操作系统是互补共生关系。在应用层面:鸿蒙搭载的范围更广,覆盖到了内存配置比较大的领域,搭载华为鸿蒙OS的第一款产品是荣耀智慧屏;Xiaomi Vela更注重低功耗和轻量级的应用场景,其目标应用是智能家居、可穿戴设备等算力受限设备,而非手机、智能电视等。逐步完善的物联网生态版图

2. 代码下载编译运行

2.1 代码运行

环境搭建:

 

sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux

apt install kconfig-frontends

apt install gcc-arm-none-eabi binutils-arm-none-eabi

 

代码下载:

 

mkdir nuttx_project
cd nuttx_project
git clone https://github.com/apache/nuttx.git nuttx
git clone https://github.com/apache/nuttx-apps apps

 

代码编译:

 

cd nuttx
./tools/configure.sh -L | less  查看支持板卡
./tools/configure.sh -l sim:nsh 选择一个板卡,例如sim:nsh
make menuconfig 配置Kconfig文件
make

 

编译后代码根目录有nuttx目标文件,执行后自动运行

 

./nuttx

 

nut shell 终端如下:

定时器

退出shell输入poweroff,或者另一个终端输入pkill nuttx

默认用户名:admin

默认密码:Administrator

或者使用make menuconfig去掉登录密码

定时器

2.2 目录结构:

nuttx/arch:该目录包含多个子目录,每个子目录包含特定于体系结构的逻辑。将 NuttX 移植到新处理器的任务包括在arch/ 包含特定于新架构的逻辑下添加一个新的子目录。

nuttx/binfmt:binfmt/子目录包含将文件系统中的二进制文件以可用于执行它们的形式加载到内存中的逻辑。

nuttx/audio:audio/子目录包含 NuttX 音频子系统

nuttx/boards:boards/子目录包含每个板的自定义逻辑和板配置数据。board板特定配置子目录 < boards/arch-name> / //configs 如:boards/arm/stm32/nucleo-f103rb/configs

nuttx/crypto:crypto子目录包含 NuttX 加密子系统。

nuttx/drivers:crypto子目录包含与体系结构无关的设备驱动程序。

nuttx/fs:fs子该目录包含 NuttX 文件系统。

nuttx/graphics:graphics子目录包含 NuttX 下的图形/视频支持文件。

nuttx/include:目录包含 NuttX 头文件。

nuttx:这几乎是一个空的目录,用于存放生成的静态库。

nuttx/libs/libc:目录包含一组标准的类 libc 函数,带有 NuttX 的自定义接口。

nuttx/mm:这是 NuttX 内存管理器。

nuttx/net:该目录包含 NuttX 网络层的实现,包括内部套接字 API。

nuttx/sched:构成 NuttX RTOS 核心的文件位于此处。

nuttx/syscall:该目录包含一个系统调用接口,可用于用户模式应用程序和内核模式 RTOS 之间的通信。

nuttx/tools:该目录包含一组工具和脚本,用于简化配置、构建和维护 NuttX。

nuttx/wireless:该目录包含对独立于硬件的无线支持的支持。

nuttx/Makefile:Makefile目录中的顶层$(TOPDIR)包含构建 NuttX 的所有顶层控制逻辑。

3. 启动流程分析

定时器定时器

在NuttX内存布局中,KROM和UROM分别存放着内核启动和NSH启动的程序,启动流程如下图所示,下面对启动流程进行简要介绍。

在KROM中内核启动流程是:

硬件初始化

_start是内核启动的入口点,处理器将从这里开始执行内核启动的第一条指令

初始化栈指针和中断向量表,将中断模式设置为CLIC Direct模式。在Direct中断模式下,BASE被要求必须是64字节对齐,且所有的异常和中断将会跳转trap中断处理函数进行中断处理,中断处理函数地址保存在mtvec寄存器中,中断处理流程如下图6-3所示:

搬移data段,清空BSS段,进行clock配置;完成uart的前期初始化,这里只进行了uart设备初始化,没有做驱动初始化,目的是实现控制台信息打印功能。

系统级初始化

根据用户镜像中的信息进行应用程序空间中data和BSS段的搬移和初始化工作,使用PMP设置地址空间访问权限

NuttX系统的初始化,主要有内核list初始化、idle tcb初始化、信号量初始化、内存堆初始化、task子系统初始化、fs子系统初始化、watchdog初始化、clock子系统初始化等

堆地址初始化:用户空间堆初始化和内核空间堆初始化

设置初始环境变量并启动init程序

根据系统配置找到应用程序入口点,并启动应用程序。

经过上面步骤已实现硬件环境初始化和NuttX系统初始化,下面将启动应用程序。应用程序放置在UROM地址空间中,总的来说获取应用程序入口点有三种方式:第一种通过宏直接设置入口点地址;第二种从用户空间结构体中获取入口点;最后一种则从文件系统中获取init程序并动态载入后跳转。获取应用程序入口通过menuconfig进行配置。三种方式都可实现应用程序的加载,但第二种实现方式还具有其他优点,它可将用户空间结构体以符号的形式传递给拓展ELF固件,因此我们选择第二种应用程序加载方式。这里简要介绍如何选择第二种加载方式即如何加载应用程序:

在menuconfig中选择CONFIG_INIT_ENTRYPOINT(应用程序入口点配置项) 和 CONFIG_BUILD_PROTECTED(指定从用户空间结构体中获取应用程序入口点)这两个宏,可以指定以第二种方式加载应用程序。

用户空间结构体在链接时会被工具链放在用户镜像的text段首地址

NuttX启动应用程序过程中,将用户空间结构体作为参数传递给任务创建函数,如此可根据应用程序入口点创建应用程序任务

上面提到用户镜像中包含NSH和内嵌的应用。NSH是NuttX提供一个小型的、可伸缩的、类似bash的shell命令解析器,具有命令行解析、实时串口输出、系统挂载等功能,具有丰富的特性集和较小的占用空间,支持脚本启动、拓展程序动态加载,因此考虑将NSH作为第一个用户程序。

 

enum nx_initstate_e
{
    OSINIT_POWERUP = 0, /*上电。尚未执行初始化,取决于.bss的初始化逻辑值。* /
    OSINIT_BOOT = 1,   /*基本启动初始化完成。操作系统服务和硬件资源还没有可用。* /
    OSINIT_TASKLISTS = 2, /*准备运行/分配的任务列表头有效*/
    OSINIT_MEMORY = 3,   /*内存管理器已经初始化*/
    OSINIT_HARDWARE = 4, /* mcu专用硬件初始化。硬件资源,如定时器和设备驱动程序现已提供。
                        足够的底层操作系统服务支持的硬件也有但是操作系统尚未完成其全部初始化。* /
    OSINIT_OSREADY = 5, /*操作系统已经完全初始化,多任务正在进行活动。* /
    osinit_idlelloop = 6 /*操作系统进入空闲循环*/
};

 

可以代码中添加打印,自己上手调试下:

 

#include 
_info("ssss Entry
");

 






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分