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 文件。

Linux

运行 ./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 接口的程序。

Linux

结语

这是我关于 Nuttx 学习记录的第一篇文章,如有不严谨或者错误的地方欢迎大家指出。
在下一篇会讲到如何新建一个自己的工程以及如何修改 Nuttx 的配置,给 Nuttx 添加功能。

该项目的两个仓库,我已合并成一个 github 仓库方便下载,后续学习记录的代码和笔记都会同步到该仓库,有需要可点文末阅读原文自取。

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

全部0条评论

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

×
20
完善资料,
赚取积分