之前在論壇看到過(guò)一篇帖子,說(shuō)怎么在 STM32 上移植 Linux ,帖子寫(xiě)了很長(zhǎng),最后才發(fā)現(xiàn)使用的 uclinux,而且還是只啟動(dòng)一個(gè) uboot。
現(xiàn)在想想為什么需要在 STM32 這種 MCU 上移植 Linux 呢,個(gè)人猜測(cè)可能是因?yàn)?Linux 環(huán)境豐富的組件和軟件可移植性吧。
可是如果有一個(gè) mini 版的 Linux 系統(tǒng)可以用呢,而且還不需要移植,上手即用,這個(gè)就是 Nuttx。
NUTTX 簡(jiǎn)介
NuttX 可拓展的實(shí)時(shí)操作系統(tǒng),在2017年由 Gregory Nutt 發(fā)布, 并在2019年正式進(jìn)入Apache基金會(huì),成為 Apache 孵化項(xiàng)目。
它最大的特點(diǎn)是:
- 高度可擴(kuò)展性 :Nuttx 支持8位到64位多種 CPU,其功能全部可進(jìn)行裁剪和配置,可根據(jù)需要選擇所需的組件。
- 合規(guī)性 :Nuttx 的系統(tǒng) API 原生支持標(biāo)準(zhǔn) POSIX 接口和完整的 C 標(biāo)準(zhǔn)庫(kù),這讓一些 Linux/Unix 的程序可以很方便的移植到 Nuttx 中使用,而不需要做太多更改。
(吐槽一下:在之前使用其他 RTOS 的 Posix 接口使用體驗(yàn)并不太友好:FreeRTOS 支持的 POSIX 接口僅包含線程的的部分,缺少文件按系統(tǒng)支持使用總感覺(jué)有點(diǎn)雞肋。RT-Thread 在組件中支持了 POSIX 線程接口也有文件系統(tǒng)支持,但是使用的時(shí)候總會(huì)有一兩處不同讓人心煩意亂)
除此之外 Nuttx 還有豐富的系統(tǒng)組件:
- 文件系統(tǒng) :Nuttx 支持多種不同的文件系統(tǒng),包括但不限于 LittleFS、 ROMFS、NFS、FATFS 等等,甚至你還可以在 Nuttx 中掛載一個(gè) FTP 服務(wù)器~
- 設(shè)備驅(qū)動(dòng) :Nuttx 提供了豐富統(tǒng)一的設(shè)備和總線驅(qū)動(dòng),在不同芯片平臺(tái)可使用相同的方式訪問(wèn)設(shè)備。包括網(wǎng)絡(luò)、USB、SDIO、TFT 等多種總線或者設(shè)備。
- 網(wǎng)絡(luò)支持 :Nuttx 中支持了 IPv4、IPv6、TCP/IP、ICMP、BT、BLE 等多種協(xié)議棧,還支持 DHCP、SMTP、Telnet 、FTP、HTTP 等多種服務(wù)端和客戶端,在使用中可無(wú)縫對(duì)接 Linux 程序。
- 多核支持 :在一些復(fù)雜應(yīng)用的所使用 SOC,往往不止一個(gè) CPU,Nuttx 中基于 OpenAMP 提供了一個(gè)強(qiáng)大的多核框架,能夠在使用時(shí)完全忽略多核差異。
支持的平臺(tái)
根據(jù)官方的文檔,現(xiàn)在 Nuttx 已經(jīng)支持了 16 種不同芯片架構(gòu),累計(jì) 280+ 種芯片。包括 TI、NXP、ST、樂(lè)鑫在內(nèi)的眾多常用芯片都已支持在內(nèi)。
更重要的是 Nuttx 支持,在電腦中使用模擬器運(yùn)行 nuttx。在開(kāi)發(fā)時(shí)先在 sim 中調(diào)試驗(yàn)證完成后,再使用硬件進(jìn)行調(diào)試,能夠提高開(kāi)發(fā)效率和縮短開(kāi)發(fā)時(shí)間。
快速開(kāi)始
開(kāi)發(fā) Nuttx 推薦使用 Ubuntu 20.04 進(jìn)行開(kāi)發(fā),在 windows 中可以使用 wsl2 安裝 Ubuntu 20.04 可獲得相同體驗(yàn)。以下以 WSL2 (Ubuntu 20.04)為例進(jìn)行說(shuō)明。
安裝開(kāi)發(fā)環(huán)境
安裝編譯工具: 由于 nuttx 在編譯時(shí)會(huì)使用到一些額外的工具,所以需要提前安裝依賴的工具。(其實(shí)下面有些也不常用。。)
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 的代碼中默認(rèn)包含所有支持的芯片驅(qū)動(dòng),所有無(wú)需下載額外的代碼,只要根據(jù)需要選擇你需要使用配置即可:
# 進(jìn)入 nuttx 目錄
cd nuttx
# c查看所有可用的配置
./tools/configure.sh -L
輸入命令后會(huì)打印非常多配置,以 sim:minibaisc
為例,其中冒號(hào)前面的 sim 表示使用芯片,冒號(hào)后面的 minibasic 表示具體配置名稱(chēng)。
sim:minibasic 表示在模擬器中運(yùn)行的最小程序配置,它編譯完后它只包含一個(gè) shell 和一個(gè) hello world。
# 生成指定配置的配置信息
./tools/configure.sh -l sim:minibasic
# 編譯程序
make -j
編譯完成后,在 nuttx 目錄下(執(zhí)行 make 的當(dāng)前目錄),會(huì)生成一個(gè) ./nuttx 文件。
運(yùn)行 ./nuttx 后會(huì)出現(xiàn)一個(gè)新的 shell,這個(gè)是 Nuttx 的終端 nsh,輸入 help 命令可查看當(dāng)前可用命令。
輸入 hello 后按回車(chē),即執(zhí)行 hello 的程序,然后打印出 hello world。退出 nsh 需要使用命令 poweroff,而不能使用 Ctrl-C 結(jié)束程序。
修改文件
hello 程序所在位置為:apps/examples/hello/hello_main.c 中,打開(kāi)文件可以可進(jìn)行修改然后編譯運(yùn)行。
將我之前移植 FreeRTOS 時(shí)所自帶的 Posix 測(cè)試程序,替換 hello_main.c 的內(nèi)容,修改入口函數(shù)名為 main,然后重新編譯運(yùn)行。
無(wú)需任何移植,即可完美兼容 POSIX 接口的程序。
結(jié)語(yǔ)
這是我關(guān)于 Nuttx 學(xué)習(xí)記錄的第一篇文章,如有不嚴(yán)謹(jǐn)或者錯(cuò)誤的地方歡迎大家指出。
在下一篇會(huì)講到如何新建一個(gè)自己的工程以及如何修改 Nuttx 的配置,給 Nuttx 添加功能。
該項(xiàng)目的兩個(gè)倉(cāng)庫(kù),我已合并成一個(gè) github 倉(cāng)庫(kù)方便下載,后續(xù)學(xué)習(xí)記錄的代碼和筆記都會(huì)同步到該倉(cāng)庫(kù),有需要可點(diǎn)文末閱讀原文自取。
-
cpu
+關(guān)注
關(guān)注
68文章
10825瀏覽量
211150 -
Linux
+關(guān)注
關(guān)注
87文章
11229瀏覽量
208927 -
STM32
+關(guān)注
關(guān)注
2266文章
10871瀏覽量
354806 -
移植
+關(guān)注
關(guān)注
1文章
377瀏覽量
28111 -
實(shí)時(shí)操作系統(tǒng)
+關(guān)注
關(guān)注
1文章
196瀏覽量
30742
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論