一、背景
最近在自己開發基於Nuttx的四軸飛行器控制系統。慢慢的對Nuttx有了自己的理解。
二、Nuttx系統分層
- NSH(Nuttx Shell),各種APP
- Virtual File System(虛擬文件系統)
- Upper Half Drivers(上層驅動)
- Lower Half Drivers(下層驅動)
- Microcontroller + Peripherals(外設)
三、各層的作用
- NSH, APP。這一層也就是實際的應用層,應用程序或者我們常說的終端。
- Virtual File System。這一層比較容易理解,也就是一個文件系統,這個虛擬文件系統符合Linux系統的思想。即這一層主要的作用是,將設備的操作,轉化爲對於虛擬文件的操作。比如我們的NSH輸出,就可以虛擬成
/dev/console
這個文件。通過open打開設備,write進行數據傳輸,read進行數據讀取。文件在很多地方和設備有共性,畢竟都視作資源。 - Upper Half Drivers 上層驅動,這一層的驅動實現的是對於各種設備的操作接口的定義,比如PWM,Network, Graphics等等。這一層也就是可以認爲是系統的API。應用程序中你可以用這一層提供給你的函數操作PWM設備。這一層的驅動位於
nuttx/include/drivers
中。 - Lower Half Drivers 下層驅動,這一層驅動是對於上層驅動的具體實現。這一層的驅動提供的API直接操作各種芯片,也就是說不同的芯片這部分的驅動將是不同的。STM32有STM32對應的驅動,Intel也有有其對應的。
- Microcontroller + Peripherals, 這層就是各種硬件了。這一層的驅動位於
nuttx/arch/*
內。
四、各層之間的粘合劑
Nuttx的各層之間存在着各種粘合劑。這些粘合劑是在進行Nuttx系統移植的時候,你需要進行編寫或者修改的。
我的這篇文章中介紹了這些粘合劑的實例編寫(採用的是星瞳的pyboard)。
文章鏈接:Nuttx移植-星瞳pyboard開發板
- 首先是
configs/<board-name>/include/board.h
這個文件。這個文件中定義了,你所用的開發版的外設和芯片的有關參數。晶振配置,SD卡,DMA的配置等等。這一層是粘合硬件與Lower Half Drivers 下層驅動的。 - 其次,
configs/<board-name>/src/*
這個目錄下的各種Nuttx啓動外設初始化c文件。比如我移植時編寫的stm32_pwm.c
就負責通過調用設備註冊函數,來創建PWM設備。stm32_sdio.c
負責創建和初始化SD卡設備。
五、總結&開發步驟
Nuttx系統的設計還是十分簡潔的,分層較爲清晰。一般的開發步驟如下。
- 移植Nuttx系統至你所用的開發版上(編寫粘合劑)。可以參考:文章鏈接:Nuttx移植-星瞳pyboard開發板
- 分析你的應用程序需要哪些設備,並在
configs/<board-name>/src/*
下的c文件中編寫,創建並初始化你所需要的設備。 - 應用程序的開發,在app目錄下創建你自己的app目錄,通過調用Upper Half Drivers 上層驅動來進行實現功能。