NuttX 是一個類 Linux 的即時作業系統,並被 PX4 所採用,以下是一些簡單的學習筆記。
以下做一些目前接觸以來的直觀感受:
優點:
缺點:
FreeRTOS 作為 Software library 提供了最基本的多工、行程間通訊、同步機制等功能,但 Nuttx 相對起來更像是一個如同 Linux 的現代作業系統。
~/.bashrc
並在最尾端增加以下指令:NuttX 系統結構分為 Kernel 本體以及 App,可以使用以下指令分別取得:
接著使用以下指令編譯 NuttX:
最終可以使用 QEMU 並將 UART2 重導向至 stdio 進行模擬:
進入 NSH 後可以測試 ps
和 hello
指令得到:
這裡針對一些我有興趣的功能進行測試以及紀錄。
NuttX 提供了許多範例程式碼,因此若要了解各個功能的使用,最快的方式就是瀏覽這些範例。這一點個人認為與 NuttX 抽象化程度高有關,因此許多功能並不直接依賴硬體平台。
術語:
一些常見週邊的使用:
先在 menuconfig 中進行以下設定:
開機載入 NSH 後執行:
預設情況下開機後會載入 NSH, 若要執行使用者定義的應用程式則須透過 NSH 輸入指令後載入。實際上我們可以在 NuttX 的 menuconfig 中修改預設執行的程式。
見 How to start directly my application instead starting NSH?
理論上可以自行設計一初始化程式,除了建立 NSH 的 Task 外,再載入其他應用程式的 Task。(待實驗後補上)
官方資料:
範例程式:
menuconfig
:
優先權繼承:
NuttX 支援優先權繼承,考慮以下情境:
像是本例中原本優先權最高的 Task A 卻必須反過來等待其他低優先權 Task (即 B 和 C) 的狀況我們稱為 "優先權反轉 (Priority Inversion)"。
要解決這樣的問題可以使用所謂"優先權繼承"的機制,一般教科書上有兩種做法:
根據文件描述,NuttX 應該是實做了 Priority Inheritance Protocol (PIP) 的機制,但也允許開發者自行設計所想要的繼承機制。
官方資料:
範例程式:
menuconfig
:
用於將某些任務卸載 (off-loading) 到多個 Threads 上,可分為:
參考但步驟有異:
使用 NUCLEO-746ZG 進行實驗:
menuconfig
須要進行以下設定 (有些選項有相依性,請依照順序設定):
STM32 以及 路由器的 IP 位址以及 遮罩可由 menuconfig
進行修改:
其中 0x0a000002
將 STM32 的 IP 位址設定為 10.0.0.2
,而 0x0a000001
將路由器的 IP 位址設定為 10.0.0.1
。
接著進行編譯以及燒錄韌體:
將 STM32 透過 RJ45 線材接到 Linux 主機 (在此用作路由器) 後進行以下設定:
在 Linux 主機上輸入:
即可得到如下回應: