之前在论坛看到过一篇帖子,说怎么在 STM32 上移植 Linux ,帖子写了很长,最后才发现使用的 uclinux,而且还是只启动一个 uboot。
现在想想为什么需要在 STM32 这种 MCU 上移植 Linux 呢,个人猜测可能是因为 Linux 环境丰富的组件和软件可移植性吧。
可是如果有一个 mini 版的 Linux 系统可以用呢,而且还不需要移植,上手即用,这个就是 Nuttx。
NuttX 可拓展的实时操作系统,在2017年由 Gregory Nutt 发布, 并在2019年正式进入Apache基金会,成为 Apache 孵化项目。
它最大的特点是:
(吐槽一下:在之前使用其他 RTOS 的 Posix 接口使用体验并不太友好:FreeRTOS 支持的 POSIX 接口仅包含线程的的部分,缺少文件按系统支持使用总感觉有点鸡肋。RT-Thread 在组件中支持了 POSIX 线程接口也有文件系统支持,但是使用的时候总会有一两处不同让人心烦意乱)
除此之外 Nuttx 还有丰富的系统组件:
根据官方的文档,现在 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 仓库方便下载,后续学习记录的代码和笔记都会同步到该仓库,有需要可点文末阅读原文自取。
全部0条评论
快来发表一下你的评论吧 !