PX4模塊設計之十:PX4啟動過程
PX4飛控啟動過程從邏輯的角度看,分為以下幾個階段:
- 飛控硬件上電
- 飛控硬件初始化
- 飛控bootloader初始化
- 飛控系統(tǒng)初始化
- 飛控應用初始化
通常來說,購買飛控板、外圍傳感器等,在正確組裝和連線的情況下,需要最為關注的是飛控應用初始化階段。作為購買的硬件,其他階段只要正確按照使用手冊操作,一般不會有太大的問題。
注1:硬件廠家對于開發(fā)的飛控板子調(diào)試,最重要的1、2、3、這幾塊的ICT測試,確保硬件質(zhì)量OK。后面才是應用軟件的移植(常說的porting)以及調(diào)優(yōu)。
注2:這里我們作為使用者(非硬件制造廠家)對每個階段做一個簡單的介紹,并結合實際情況給出可能出現(xiàn)的問題,以及尋找答案的工種(硬件,軟件)。
1. 【硬件】飛控硬件上電
這個階段如果不注意,容易出現(xiàn)硬件損壞。最為重要的注意事項:
- 電源正負極不要接反;
- 電源輸入/輸出不要出現(xiàn)短路;
注:很多電腦的USB口子都有電源保護功能(即使短路也不會將板子和電腦燒壞,請先確認USB口是否有這個保護功能),可以先通過有保護功能的USB口進行上電檢查,確保沒有短路或者反接的問題。
后續(xù)只要新增硬件,都要進行相關檢測,確保硬件上電瞬間冒煙損壞硬件,通常購買的硬件(電調(diào)、LED燈帶、GPS、圖傳、攝像頭等等)。
2. 【硬件】飛控硬件初始化
炸機或者出現(xiàn)冒煙等情況導致上電后無響應,就要注意硬件初始化到哪里(電池、電調(diào)、飛控、圖傳、接收機、傳感器),那個部件出現(xiàn)什么問題了。這個時候尚未到bootloader階段,最長使用的方法是全部斷開鏈接,一段一段的檢查。
電池
└──> 電調(diào)
├──> 電機
├──> 圖傳
└──> 飛控
├──> 燈帶
├──> GPS
├──> 攝像頭
└──> 接收機
3. 【硬件+軟件】飛控bootloader初始化
通常這個部分主要是為了刷固件,因為bootloader+system+application是對應的一整套(比如:PX4的bootloader和betaflight的固件就不配套)。
注:如果bootloader啟動卡住,請先檢查板子上按鈕(通常按鈕長按進入燒錄固件模式,是否有斷路或者短路的情況)
4. 【硬件+軟件】飛控系統(tǒng)初始化
通常來說這塊是指bootloader將控制權交給系統(tǒng)(nuttx或者其他OS),進入idle任務,并正確調(diào)用系統(tǒng)啟動腳本。
注:bootloader和固件燒錄正確的情況下,通常這塊不會出問題。
__start
└──> nx_start
└──> nx_bringup
└──> nx_create_initthread
└──> nx_start_application
└──> nxtask_create //CONFIG_USER_ENTRYPOINT nsh_main --> platforms\nuttx\NuttX\apps\system\nsh\nsh_main.c main
main //nsh_main
├──> nsh_initialize // --> boardctl(BOARDIOC_INIT, 0) --> board_app_initialize
└──> nsh_consolemain (nsh_main)
└──> nsh_initscript
└──> nsh_script(vtbl, "init", NSH_INITPATH);
宏定義如下:
# ifndef CONFIG_NSH_ROMFSMOUNTPT
# define CONFIG_NSH_ROMFSMOUNTPT "/etc"
# endif
# ifndef CONFIG_NSH_INITSCRIPT
# define CONFIG_NSH_INITSCRIPT "init.d/rcS"
# endif
# undef NSH_INITPATH
# define NSH_INITPATH CONFIG_NSH_ROMFSMOUNTPT "/" CONFIG_NSH_INITSCRIPT
PX4板子啟動平臺公共部分:HRT、console_buffer、crypto、WorkQueue、uorb、log、mavlink_usb_check等。(這部分后續(xù)有時間繼續(xù)深入。)
board_app_initialize ├──> px4_platform_init ├──> <board_dma_alloc_init()> //configure the DMA allocator │ └──> syslog(LOG_ERR, "[boot] DMA alloc FAILED\n"); ├──> hrt_call_every(&serial_dma_call, 1000, 1000, (hrt_callout)stm32_serial_dma_poll, NULL); //set up the serial DMA polling at 1ms intervals for received bytes that have not triggered a DMA event. drv_led_start(); ├──> led_off(LED_RED); ├──> led_on(LED_GREEN); // Indicate Power. ├──> led_off(LED_BLUE); ├──> <board_hardfault_init(2, true) != 0> │ └──> led_on(LED_RED); ├──> struct spi_dev_s *spi_dev = stm32_spibus_initialize(CONFIG_NSH_MMCSDSPIPORTNO);//Get the SPI port for the microSD slot ├──> <!spi_dev> │ ├──> syslog(LOG_ERR, "[boot] FAILED to initialize SPI port %d\n", CONFIG_NSH_MMCSDSPIPORTNO); │ └──> led_on(LED_BLUE); ├──> int result = mmcsd_spislotinitialize(CONFIG_NSH_MMCSDMINOR, CONFIG_NSH_MMCSDSLOTNO, spi_dev); //bind the SPI interface to the MMCSD driver ├──> <result != OK> │ ├──> led_on(LED_BLUE); │ └──> syslog(LOG_ERR, "[boot] FAILED to bind SPI port 1 to the MMCSD driver\n"); ├──> <defined(FLASH_BASED_PARAMS)> │ ├──> result = parameter_flashfs_init(params_sector_map, NULL, 0); │ └──> <result != OK)> │ ├──> syslog(LOG_ERR, "[boot] FAILED to init params in FLASH %d\n", result); │ └──> led_on(LED_AMBER); └──> px4_platform_configure
5. 【軟件】飛控應用初始化
PX4的應用腳本:
- ROMFS/px4fmu_common/init.d: 該目錄下的腳本用于NuttX,部分腳本也被使用在Posix系統(tǒng)。
- ROMFS/px4fmu_common/init.d-posix: 該目錄下的腳本僅用于Posix系統(tǒng)。
PX4的啟動文件:
- Nuttx系統(tǒng):build/<target>/init.d/rcS
- Posix系統(tǒng):build/<target>/init.d-posix/rcS
比如:build/px4_sitl_default/etc/init.d/rcS 或者build/holybro_kakutef7_default/etc/init.d
6. 【配置】SD卡配置文件
SD卡文件布局及配置文件(配置文件可以自定義應用初始化流程)。
/
├── etc //Extra config (+ mixers)
│ ├── rc.txt //If this file is present nothing in the system will be auto-started
│ ├── config.txt //used to modify shell variables. It is loaded after the main system has been configured and before it is booted
│ ├── extras.txt //used to start additional applications after the main system boot. Typically these would be payload controllers or similar optional custom components.
│ ├── mixers //Mixers
│ └── NAME_OF_MIXER //e.g. gimbal.aux.mix
├── log //Full flight logs
├── mission_log //Reduced flight logs
├── fw //UAVCAN firmware
├── uavcan.db //UAVCAN DB + logs
├── params //Parameters (if not in FRAM/FLASH)
├── dataman //Mission storage file
├── fault_<datetime>.txt //Hardfault files
└── bootlog.txt //Boot log file
6.1 extras 應用
e.g. etc/extras.txt
set +e
optional_app start # Will not result in boot failure if optional_app is unknown or fails
set -e
mandatory_app start # Will abort boot if mandatory_app is unknown or fails
6.2 mix自定義配置
e.g. gimbal.aux.mix with etc/config.txt
set MIXER_AUX gimbal
set PWM_AUX_OUT 1234
set PWM_AUX_DISARMED 1500
set PWM_AUX_MIN 1000
set PWM_AUX_MAX 2000
set PWM_AUX_RATE 50
7. 參考資料
【1】PX4開源軟件框架簡明簡介
【2】PX4 System Startup
【3】PX4 Custom System Startup
【4】Nuttx nsh-start-up-script