运行在MCU上的Linux-Nuttx 简介
之前在论坛看到过一篇帖子,说怎么在 STM32 上移植 Linux ,帖子写了很长,最后才发现使用的 uclinux,而且还是只启动一个 uboot。
现在想想为什么需要在 STM32 这种 MCU 上移植 Linux 呢,个人猜测可能是因为 Linux 环境丰富的组件和软件可移植性吧。
可是如果有一个 mini 版的 Linux 系统可以用呢,而且还不需要移植上手即用,这个就是 Nuttx。
NUTTX 简介
NuttX 可拓展的实时操作系统,在2017年由 Gregory Nutt 发布, 并在2019年在正式进入Apache基金会,成为 Apache 孵化项目。
它最大的特点是:
高度可扩展性:Nuttx 支持8位到64位多种 CPU,其功能全部可进行裁剪和配置,可根据需要选择所需的组件。
合规性:Nuttx 的系统 API 原生支持标准 POSIX 接口和完整的 C 标准库,这让一些 Linux/Unix 的程序可以很方便的移植到 Nuttx 中使用,而不需要做太多更改。
(吐槽一下:在之前使用其他 RTOS 的 Posix 接口使用体验并不太友好:FreeRTOS 支持的 POSIX 接口仅包含线程的的部分,缺少文件按系统支持使用总感觉有点鸡肋。RT-Thread 在组件中支持了 POSIX 线程的部分也有文件系统,但是使用的时候总会有一两处不同让人心烦意乱)
除此之外 Nuttx 还有丰富的系统组件:
文件系统:Nuttx 支持多种不同的文件系统,包括但不限于 LittleFS、 ROMFS、NFS、FATFS 等等,甚至你还可以在 Nuttx 中挂载一个 FTP 服务器~
设备驱动: Nuttx 提供了丰富统一的设备和总线驱动,在不同芯片平台可使用相同的方式访问设备。包括网络、USB、SDIO、TFT 等多种总线或者设备。
网络支持:Nuttx 中支持了 IPv4、IPv6、TCP/IP、ICMP、BT、BLE 等多种协议栈,还支持 DHCP、SMTP、Telnet 、FTP、HTTP 等多种服务端和客户端,在使用中可无缝对接 Linux 程序。
多核支持:在一些复杂应用的所使用 SOC,往往不止一个 CPU,Nuttx 中基于 OpenAMP 提供了一个强大的多核框架,能够在使用时完全忽略多核差异。
支持的平台
根据官方的文档,现在 Nuttx 已经支持了 16 中不同芯片架构,累计 280+ 中芯片。包括 TI、NXP、ST、乐鑫在内的众多常用芯片都已支持在内。
更重要的是 Nuttx 支持,在电脑中使用模拟器运行 nuttx。在开发时先在 sim 中调试验证完成后,在使用硬件进行调试,能够提高开发效率和缩短开发时间。
快速开始
开发 Nuttx 推荐使用 Ubuntu 20.04 进行开发,在 windows 中可以使用 wsl2 安装 Ubuntu 20.04 可获得相同体验。以下以 WSL2 (Ubuntu 20.04)为例进行说明。
安装开发环境
安装编译工具
由于 nuttx 在编译是会使用到一些额外的工具,所以需要提前安装一下依赖的工具。(其实下面的有些也不常用。。)
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
sudo apt install kconfig-frontends
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi
下载代码
mkdir nuttx-learning
cd nuttx-learning
git clone --depth=1 -b nuttx-10.2.0 https://github.com/apache/incubator-nuttx.git nuttx
git clone --depth=1 -b nuttx-10.2.0 https://github.com/apache/incubator-nuttx-apps apps
配置编译
在 Nuttx 的代码中默认包含所有支持的芯片驱动,所有无需下载额外的代码,只要根据需要选择你需要使用配置即可:
# 进入 nuttx 目录
cd nuttx
# c查看所有可用的配置
./tools/configure.sh -L
输入命令后会打印非常多配置,以 sim:minibaisc
为例,其中冒号前面的 sim 表示使用芯片,冒号后面的 minibasic 表示具体配置名称。
sim:minibasic 表示在模拟器中运行的最小程序配置,它编译完后它只包含一个 shell 和一个 hello world。
# 生成指定配置的配置信息
./tools/configure.sh -l sim:minibasic
# 编译程序
make -j
编译完成后,在 nuttx 目录下(执行 make 的当前目录),会生成一个 ./nuttx 文件。
运行 ./nuttx 后会出现一个新的 shell,这个是 Nuttx 的终端 nsh,输入 help 命令可查看当前可用命令。
输入 hello 后按回车,即执行 hello 的程序,然后打印出 hello world。
退出 nsh 需要使用命令 poweroff,而不能使用 Ctrl-C 结束程序。
修改文件
hello 程序所在位置为:apps/examples/hello/hello_main.c 中,打开文件可以可进行修改然后编译运行。
将我之前移植 FreeRTOS 时所自带的 Posix 测试程序,替换 hello_main.c 的内容,修改入口函数名为 main,然后重新编译运行。
无需任何移植,即可完美兼容 POSIX 接口的程序。
结语
这是我关于 Nuttx 学习记录的第一篇文章,如有不严谨或者错误的地方欢迎大家指出。
在下一篇会讲到如何新建一个自己的工程以及如何修改 Nuttx 的配置,给 Nuttx 添加功能。
该项目的两个仓库,我已合并成一个 github 仓库方便下载,后续学习记录的代码和笔记都会同步到改仓库,有需要可点文末阅读原文自取。
如果喜欢的话,希望大家多多点赞转发。
参考链接
https://os.51cto.com/article/584942.html
https://nuttx.apache.org/docs/latest/introduction/about.html
https://github.com/apache/incubator-nuttx
https://cwiki.apache.org/confluence/collector/pages.action?key=NUTTX