之前在論壇看到過一篇帖子,說怎么在 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 倉庫方便下載,后續學習記錄的代碼和筆記都會同步到該倉庫,有需要可點文末閱讀原文自取。
-
cpu
+關注
關注
68文章
10878瀏覽量
212166 -
Linux
+關注
關注
87文章
11319瀏覽量
209830 -
STM32
+關注
關注
2270文章
10906瀏覽量
356560 -
移植
+關注
關注
1文章
379瀏覽量
28150 -
實時操作系統
+關注
關注
1文章
199瀏覽量
30776
發布評論請先 登錄
相關推薦
評論