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\macInitpwmInit\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();
}
正式进入到具体应用处理逻辑