PX4模块设计之十:PX4启动过程
PX4飞控启动过程从逻辑的角度看,分为以下几个阶段:
- 飞控硬件上电
- 飞控硬件初始化
- 飞控bootloader初始化
- 飞控系统初始化
- 飞控应用初始化
通常来说,购买飞控板、外围传感器等,在正确组装和连线的情况下,需要最为关注的是飞控应用初始化阶段。作为购买的硬件,其他阶段只要正确按照使用手册操作,一般不会有太大的问题。
注1:硬件厂家对于开发的飞控板子调试,最重要的1、2、3、这几块的ICT测试,确保硬件质量OK。后面才是应用软件的移植(常说的porting)以及调优。
注2:这里我们作为使用者(非硬件制造厂家)对每个阶段做一个简单的介绍,并结合实际情况给出可能出现的问题,以及寻找答案的工种(硬件,软件)。
1. 【硬件】飞控硬件上电
这个阶段如果不注意,容易出现硬件损坏。最为重要的注意事项:
- 电源正负极不要接反;
- 电源输入/输出不要出现短路;
注:很多电脑的USB口子都有电源保护功能(即使短路也不会将板子和电脑烧坏,请先确认USB口是否有这个保护功能),可以先通过有保护功能的USB口进行上电检查,确保没有短路或者反接的问题。
后续只要新增硬件,都要进行相关检测,确保硬件上电瞬间冒烟损坏硬件,通常购买的硬件(电调、LED灯带、GPS、图传、摄像头等等)。
2. 【硬件】飞控硬件初始化
炸机或者出现冒烟等情况导致上电后无响应,就要注意硬件初始化到哪里(电池、电调、飞控、图传、接收机、传感器),那个部件出现什么问题了。这个时候尚未到bootloader阶段,最长使用的方法是全部断开链接,一段一段的检查。
电池
└──> 电调
├──> 电机
├──> 图传
└──> 飞控
├──> 灯带
├──> GPS
├──> 摄像头
└──> 接收机
3. 【硬件+软件】飞控bootloader初始化
通常这个部分主要是为了刷固件,因为bootloader+system+application是对应的一整套(比如:PX4的bootloader和betaflight的固件就不配套)。
注:如果bootloader启动卡住,请先检查板子上按钮(通常按钮长按进入烧录固件模式,是否有断路或者短路的情况)
4. 【硬件+软件】飞控系统初始化
通常来说这块是指bootloader将控制权交给系统(nuttx或者其他OS),进入idle任务,并正确调用系统启动脚本。
注: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等。(这部分后续有时间继续深入。)
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系统。
- ROMFS/px4fmu_common/init.d-posix: 该目录下的脚本仅用于Posix系统。
PX4的启动文件:
- Nuttx系统:build/<target>/init.d/rcS
- Posix系统: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