ardupilot 的启动根据不同HAL 的启动过程不一样 , chibios 的硬件入口是
硬件启动 ->
modules/Chibios/common/startup/ARMCMx/compilers/GCC/VECTOR.S ResetHandler:
modules/Chibios/common/startup/ARMCMx/compilers/GCC/ crt0_v7m.S crt0_entry
--AP_HAL_Chibios/hwdef/common/Board.c __early_init() 初始化pal(gpio)& sysClock
--AP_HAL_Chibios/hwdef/common/Board.c __late_init ()
-- modules/Chibios/os/hal/src/hal.c halInit()
-- modules/Chibios/os/hal/osal/lib/osal_vt.c vtInit
-- modules/Chibios/os/hal/ports/AT32/AT32f435_437xx/hal_lld.c hal_lld_init
--rccEnablePWRInterface() dmaInit IrqInit 初始化RCC DMA Irq
--palInit 初始化gpio
-- adcInit lld 库各种外设初始化
-- 。。。。。canInit\cryInit\dacInit\eflInit\gptInit\i2cInit\i2sInit\icuInit\eicuInit\macInit
pwmInit\sdInit\sioInit\spiInit\trngInit\uartInit\mmcInit\sduInit\rtcInit\wdgInit\wspInit
--boardInit()
--modules/Chibios/os/rt/src/ch.c chiSysInit() chibios 初始化
bl main ->跳转到 Tools/AP_Bootloader.cpp main()
-- jump_to_app() 跳转到具体的app
app结构: Copter\Plane\Sub\Rover 都是继承自 AP_Vehicle
Copter.cpp 最后 AP_HAL_MAIN_CALLBACK 宏,作为app 的main 函数入口, 以Copter 类为Callback 对象传入
chibios 的AP_HAL_Chibios_Class.cpp HAL
宏解开大概是这样:
int main(int argc char* const argv[]) {
hal.run(copter);
}
hal.run() 中 调用 Copter.Setup() 然后
while(true){
copter.loop();
}
正式进入到具体应用处理逻辑