feat(bootloader): 实现APP延迟启动模式支持OTA请求检测

当APP可用但未激活时,系统现在会进入延迟启动模式,在指定时间内
监听CAN总线上的OTA请求。如果在此期间收到OTA请求,则进入OTA模式;
否则超时后自动跳转到APP。

新增配置参数APP_DELAY_BOOT_TIME用于设置延迟启动时间,默认为10秒。
在延迟期间,系统持续进行CAN通信检查和OTA心跳消息发送,确保能够
及时响应OTA更新请求。

此功能增强了系统的OTA更新灵活性,允许在启动过程中动态决定
是否进行固件更新而不是强制进入OTA模式。
This commit is contained in:
cbb
2026-04-26 03:36:45 +08:00
parent d019b41ed6
commit 46d4bfe8ef
11 changed files with 908 additions and 912 deletions
Binary file not shown.
+117 -117
View File
@@ -6,9 +6,9 @@ Memory Map of the image
Image Entry point : 0x08000165
Load Region LR_ROM0 (Base: 0x08000000, Size: 0x00005148, Max: 0x08006000, ABSOLUTE)
Load Region LR_ROM0 (Base: 0x08000000, Size: 0x00005180, Max: 0x08006000, ABSOLUTE)
Execution Region ER_ROM0 (Base: 0x08000000, Size: 0x00005050, Max: 0x08006000, ABSOLUTE)
Execution Region ER_ROM0 (Base: 0x08000000, Size: 0x00005088, Max: 0x08006000, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
@@ -68,121 +68,121 @@ Memory Map of the image
0x08002b58 0x00000042 Code RO 165 .text._ZN14CAN_transmiter19communication_checkEv Can.o
0x08002b9a 0x00000002 PAD
0x08002b9c 0x00000040 Code RO 163 .text._ZN14CAN_transmiter4initEv Can.o
0x08002bdc 0x00000086 Code RO 6 .text._ZN16BootloaderSystem3runEv main.o
0x08002c62 0x00000002 PAD
0x08002c64 0x00000074 Code RO 993 .text._ZSt11__terminatePFvvE libcppabi_wx.l(cxa_handlers.cpp.o)
0x08002cd8 0x00000030 Code RO 984 .text._ZSt9terminatev libcppabi_wx.l(cxa_handlers.cpp.o)
0x08002d08 0x0000000a Code RO 979 .text.__clang_call_terminate libcppabi_wx.l(cxa_exception.cpp.o)
0x08002d12 0x00000002 PAD
0x08002d14 0x0000006c Code RO 927 .text.__cxa_begin_catch libcppabi_wx.l(cxa_exception.cpp.o)
0x08002d80 0x0000000a Code RO 1348 .text.__cxa_get_globals libcppabi_wx.l(cxa_exception_storage.cpp.o)
0x08002d8a 0x0000000a Code RO 1350 .text.__cxa_get_globals_fast libcppabi_wx.l(cxa_exception_storage.cpp.o)
0x08002d94 0x00000026 Code RO 233 .text.can_deinit gd32c10x_can.o
0x08002dba 0x00000002 PAD
0x08002dbc 0x00000114 Code RO 239 .text.can_fd_init gd32c10x_can.o
0x08002ed0 0x000000b2 Code RO 241 .text.can_filter_init gd32c10x_can.o
0x08002f82 0x00000002 PAD
0x08002f84 0x00000176 Code RO 237 .text.can_init gd32c10x_can.o
0x080030fa 0x00000002 PAD
0x080030fc 0x00000008 Code RO 283 .text.can_interrupt_enable gd32c10x_can.o
0x08003104 0x00000016 Code RO 293 .text.can_interrupt_flag_clear gd32c10x_can.o
0x0800311a 0x00000002 PAD
0x0800311c 0x00000066 Code RO 291 .text.can_interrupt_flag_get gd32c10x_can.o
0x08003182 0x00000002 PAD
0x08003184 0x000001f4 Code RO 267 .text.can_message_receive gd32c10x_can.o
0x08003378 0x000001f0 Code RO 261 .text.can_message_transmit gd32c10x_can.o
0x08003568 0x00000072 Code RO 235 .text.can_struct_para_init gd32c10x_can.o
0x080035da 0x00000002 PAD
0x080035dc 0x000001b0 Code RO 161 .text.canfd_config Can.o
0x0800378c 0x00000238 Code RO 99 .text.check_sleep initial.o
0x080039c4 0x00000066 Code RO 319 .text.crc_block_data_calculate gd32c10x_crc.o
0x08003a2a 0x00000002 PAD
0x08003a2c 0x00000012 Code RO 309 .text.crc_data_register_reset gd32c10x_crc.o
0x08003a3e 0x00000002 PAD
0x08003a40 0x00000018 Code RO 307 .text.crc_deinit gd32c10x_crc.o
0x08003a58 0x00000024 Code RO 66 .text.delay_1ms systick.o
0x08003a7c 0x00000028 Code RO 64 .text.delay_1us systick.o
0x08003aa4 0x00000018 Code RO 68 .text.delay_decrement systick.o
0x08003abc 0x00000024 Code RO 371 .text.dma_channel_enable gd32c10x_dma.o
0x08003ae0 0x00000074 Code RO 361 .text.dma_init gd32c10x_dma.o
0x08003b54 0x00000022 Code RO 407 .text.dma_interrupt_enable gd32c10x_dma.o
0x08003b76 0x00000002 PAD
0x08003b78 0x0000000e Code RO 405 .text.dma_interrupt_flag_clear gd32c10x_dma.o
0x08003b86 0x00000002 PAD
0x08003b88 0x0000003a Code RO 403 .text.dma_interrupt_flag_get gd32c10x_dma.o
0x08003bc2 0x00000002 PAD
0x08003bc4 0x0000001a Code RO 359 .text.dma_struct_para_init gd32c10x_dma.o
0x08003bde 0x00000002 PAD
0x08003be0 0x00000096 Code RO 93 .text.enter_deep_sleep initial.o
0x08003c76 0x00000002 PAD
0x08003c78 0x00000090 Code RO 424 .text.exti_init gd32c10x_exti.o
0x08003d08 0x00000012 Code RO 428 .text.exti_interrupt_disable gd32c10x_exti.o
0x08003d1a 0x00000002 PAD
0x08003d1c 0x00000010 Code RO 426 .text.exti_interrupt_enable gd32c10x_exti.o
0x08003d2c 0x0000000c Code RO 444 .text.exti_interrupt_flag_clear gd32c10x_exti.o
0x08003d38 0x00000012 Code RO 442 .text.exti_interrupt_flag_get gd32c10x_exti.o
0x08003d4a 0x00000002 PAD
0x08003d4c 0x0000000c Code RO 515 .text.fmc_flag_clear gd32c10x_fmc.o
0x08003d58 0x00000012 Code RO 477 .text.fmc_lock gd32c10x_fmc.o
0x08003d6a 0x00000002 PAD
0x08003d6c 0x00000166 Code RO 481 .text.fmc_page_erase gd32c10x_fmc.o
0x08003ed2 0x00000002 PAD
0x08003ed4 0x00000026 Code RO 475 .text.fmc_unlock gd32c10x_fmc.o
0x08003efa 0x00000002 PAD
0x08003efc 0x000001aa Code RO 487 .text.fmc_word_program gd32c10x_fmc.o
0x080040a6 0x00000002 PAD
0x080040a8 0x0000002c Code RO 86 .text.fputc initial.o
0x080040d4 0x00000098 Code RO 216 .text.gd_eval_com_init gd32c10x_eval.o
0x0800416c 0x00000004 Code RO 571 .text.gpio_bit_reset gd32c10x_gpio.o
0x08004170 0x00000048 Code RO 587 .text.gpio_exti_source_select gd32c10x_gpio.o
0x080041b8 0x000002c0 Code RO 567 .text.gpio_init gd32c10x_gpio.o
0x08004478 0x00000080 Code RO 585 .text.gpio_pin_remap_config gd32c10x_gpio.o
0x080044f8 0x00000022 Code RO 8 .text.main main.o
0x0800451a 0x00000002 PAD
0x0800451c 0x00000060 Code RO 614 .text.nvic_irq_enable gd32c10x_misc.o
0x0800457c 0x0000001c Code RO 618 .text.nvic_vector_table_set gd32c10x_misc.o
0x08004598 0x000000c6 Code RO 647 .text.pmu_to_deepsleepmode gd32c10x_pmu.o
0x0800465e 0x00000002 PAD
0x08004660 0x00000012 Code RO 736 .text.rcu_all_reset_flag_clear gd32c10x_rcu.o
0x08004672 0x00000002 PAD
0x08004674 0x0000010c Code RO 764 .text.rcu_clock_freq_get gd32c10x_rcu.o
0x08004780 0x00000010 Code RO 762 .text.rcu_deepsleep_voltage_set gd32c10x_rcu.o
0x08004790 0x00000020 Code RO 684 .text.rcu_periph_clock_disable gd32c10x_rcu.o
0x080047b0 0x0000001e Code RO 682 .text.rcu_periph_clock_enable gd32c10x_rcu.o
0x080047ce 0x00000002 PAD
0x080047d0 0x00000020 Code RO 692 .text.rcu_periph_reset_disable gd32c10x_rcu.o
0x080047f0 0x0000001e Code RO 690 .text.rcu_periph_reset_enable gd32c10x_rcu.o
0x0800480e 0x00000002 PAD
0x08004810 0x00000014 Code RO 698 .text.rcu_system_clock_source_config gd32c10x_rcu.o
0x08004824 0x00000002 Code RO 91 .text.scanAppFlashContent initial.o
0x08004826 0x00000002 PAD
0x08004828 0x00000020 Code RO 70 .text.system_soft_reset systick.o
0x08004848 0x00000048 Code RO 62 .text.systick_config systick.o
0x08004890 0x00000006 Code RO 1333 .text.unlikely.abort_message libcppabi_wx.l(abort_message.cpp.o)
0x08004896 0x00000002 PAD
0x08004898 0x0000006a Code RO 780 .text.usart_baudrate_set gd32c10x_usart.o
0x08004902 0x00000002 PAD
0x08004904 0x00000008 Code RO 806 .text.usart_data_transmit gd32c10x_usart.o
0x0800490c 0x0000007a Code RO 778 .text.usart_deinit gd32c10x_usart.o
0x08004986 0x00000002 PAD
0x08004988 0x0000000a Code RO 788 .text.usart_enable gd32c10x_usart.o
0x08004992 0x00000002 PAD
0x08004994 0x00000010 Code RO 868 .text.usart_flag_get gd32c10x_usart.o
0x080049a4 0x00000014 Code RO 794 .text.usart_receive_config gd32c10x_usart.o
0x080049b8 0x00000014 Code RO 792 .text.usart_transmit_config gd32c10x_usart.o
0x080049cc 0x0000000e Code RO 1925 i.__scatterload_copy mc_w.l(handlers.o)
0x080049da 0x00000002 Code RO 1926 i.__scatterload_null mc_w.l(handlers.o)
0x080049dc 0x0000000e Code RO 1927 i.__scatterload_zeroinit mc_w.l(handlers.o)
0x080049ea 0x00000002 PAD
0x080049ec 0x00000024 Code RO 1059 i.puts mc_w.l(puts.o)
0x08004a10 0x00000100 Data RO 50 .rodata._ZL4sbox aes128.o
0x08004b10 0x00000010 Data RO 143 .rodata._ZL8K_master OTA.o
0x08004b20 0x00000400 Data RO 145 .rodata._ZZ24calculate_crc32_with_keyPKhS0_PhE9crc_table OTA.o
0x08004f20 0x00000008 Data RO 766 .rodata.cst8 gd32c10x_rcu.o
0x08004f28 0x00000007 Data RO 295 .rodata.g_can_fdlength_table gd32c10x_can.o
0x08004f2f 0x00000100 Data RO 49 .rodata.inv_sbox aes128.o
0x0800502f 0x00000001 PAD
0x08005030 0x00000020 Data RO 1924 Region$$Table anon$$obj.o
0x08002bdc 0x000000be Code RO 6 .text._ZN16BootloaderSystem3runEv main.o
0x08002c9a 0x00000002 PAD
0x08002c9c 0x00000074 Code RO 993 .text._ZSt11__terminatePFvvE libcppabi_wx.l(cxa_handlers.cpp.o)
0x08002d10 0x00000030 Code RO 984 .text._ZSt9terminatev libcppabi_wx.l(cxa_handlers.cpp.o)
0x08002d40 0x0000000a Code RO 979 .text.__clang_call_terminate libcppabi_wx.l(cxa_exception.cpp.o)
0x08002d4a 0x00000002 PAD
0x08002d4c 0x0000006c Code RO 927 .text.__cxa_begin_catch libcppabi_wx.l(cxa_exception.cpp.o)
0x08002db8 0x0000000a Code RO 1348 .text.__cxa_get_globals libcppabi_wx.l(cxa_exception_storage.cpp.o)
0x08002dc2 0x0000000a Code RO 1350 .text.__cxa_get_globals_fast libcppabi_wx.l(cxa_exception_storage.cpp.o)
0x08002dcc 0x00000026 Code RO 233 .text.can_deinit gd32c10x_can.o
0x08002df2 0x00000002 PAD
0x08002df4 0x00000114 Code RO 239 .text.can_fd_init gd32c10x_can.o
0x08002f08 0x000000b2 Code RO 241 .text.can_filter_init gd32c10x_can.o
0x08002fba 0x00000002 PAD
0x08002fbc 0x00000176 Code RO 237 .text.can_init gd32c10x_can.o
0x08003132 0x00000002 PAD
0x08003134 0x00000008 Code RO 283 .text.can_interrupt_enable gd32c10x_can.o
0x0800313c 0x00000016 Code RO 293 .text.can_interrupt_flag_clear gd32c10x_can.o
0x08003152 0x00000002 PAD
0x08003154 0x00000066 Code RO 291 .text.can_interrupt_flag_get gd32c10x_can.o
0x080031ba 0x00000002 PAD
0x080031bc 0x000001f4 Code RO 267 .text.can_message_receive gd32c10x_can.o
0x080033b0 0x000001f0 Code RO 261 .text.can_message_transmit gd32c10x_can.o
0x080035a0 0x00000072 Code RO 235 .text.can_struct_para_init gd32c10x_can.o
0x08003612 0x00000002 PAD
0x08003614 0x000001b0 Code RO 161 .text.canfd_config Can.o
0x080037c4 0x00000238 Code RO 99 .text.check_sleep initial.o
0x080039fc 0x00000066 Code RO 319 .text.crc_block_data_calculate gd32c10x_crc.o
0x08003a62 0x00000002 PAD
0x08003a64 0x00000012 Code RO 309 .text.crc_data_register_reset gd32c10x_crc.o
0x08003a76 0x00000002 PAD
0x08003a78 0x00000018 Code RO 307 .text.crc_deinit gd32c10x_crc.o
0x08003a90 0x00000024 Code RO 66 .text.delay_1ms systick.o
0x08003ab4 0x00000028 Code RO 64 .text.delay_1us systick.o
0x08003adc 0x00000018 Code RO 68 .text.delay_decrement systick.o
0x08003af4 0x00000024 Code RO 371 .text.dma_channel_enable gd32c10x_dma.o
0x08003b18 0x00000074 Code RO 361 .text.dma_init gd32c10x_dma.o
0x08003b8c 0x00000022 Code RO 407 .text.dma_interrupt_enable gd32c10x_dma.o
0x08003bae 0x00000002 PAD
0x08003bb0 0x0000000e Code RO 405 .text.dma_interrupt_flag_clear gd32c10x_dma.o
0x08003bbe 0x00000002 PAD
0x08003bc0 0x0000003a Code RO 403 .text.dma_interrupt_flag_get gd32c10x_dma.o
0x08003bfa 0x00000002 PAD
0x08003bfc 0x0000001a Code RO 359 .text.dma_struct_para_init gd32c10x_dma.o
0x08003c16 0x00000002 PAD
0x08003c18 0x00000096 Code RO 93 .text.enter_deep_sleep initial.o
0x08003cae 0x00000002 PAD
0x08003cb0 0x00000090 Code RO 424 .text.exti_init gd32c10x_exti.o
0x08003d40 0x00000012 Code RO 428 .text.exti_interrupt_disable gd32c10x_exti.o
0x08003d52 0x00000002 PAD
0x08003d54 0x00000010 Code RO 426 .text.exti_interrupt_enable gd32c10x_exti.o
0x08003d64 0x0000000c Code RO 444 .text.exti_interrupt_flag_clear gd32c10x_exti.o
0x08003d70 0x00000012 Code RO 442 .text.exti_interrupt_flag_get gd32c10x_exti.o
0x08003d82 0x00000002 PAD
0x08003d84 0x0000000c Code RO 515 .text.fmc_flag_clear gd32c10x_fmc.o
0x08003d90 0x00000012 Code RO 477 .text.fmc_lock gd32c10x_fmc.o
0x08003da2 0x00000002 PAD
0x08003da4 0x00000166 Code RO 481 .text.fmc_page_erase gd32c10x_fmc.o
0x08003f0a 0x00000002 PAD
0x08003f0c 0x00000026 Code RO 475 .text.fmc_unlock gd32c10x_fmc.o
0x08003f32 0x00000002 PAD
0x08003f34 0x000001aa Code RO 487 .text.fmc_word_program gd32c10x_fmc.o
0x080040de 0x00000002 PAD
0x080040e0 0x0000002c Code RO 86 .text.fputc initial.o
0x0800410c 0x00000098 Code RO 216 .text.gd_eval_com_init gd32c10x_eval.o
0x080041a4 0x00000004 Code RO 571 .text.gpio_bit_reset gd32c10x_gpio.o
0x080041a8 0x00000048 Code RO 587 .text.gpio_exti_source_select gd32c10x_gpio.o
0x080041f0 0x000002c0 Code RO 567 .text.gpio_init gd32c10x_gpio.o
0x080044b0 0x00000080 Code RO 585 .text.gpio_pin_remap_config gd32c10x_gpio.o
0x08004530 0x00000022 Code RO 8 .text.main main.o
0x08004552 0x00000002 PAD
0x08004554 0x00000060 Code RO 614 .text.nvic_irq_enable gd32c10x_misc.o
0x080045b4 0x0000001c Code RO 618 .text.nvic_vector_table_set gd32c10x_misc.o
0x080045d0 0x000000c6 Code RO 647 .text.pmu_to_deepsleepmode gd32c10x_pmu.o
0x08004696 0x00000002 PAD
0x08004698 0x00000012 Code RO 736 .text.rcu_all_reset_flag_clear gd32c10x_rcu.o
0x080046aa 0x00000002 PAD
0x080046ac 0x0000010c Code RO 764 .text.rcu_clock_freq_get gd32c10x_rcu.o
0x080047b8 0x00000010 Code RO 762 .text.rcu_deepsleep_voltage_set gd32c10x_rcu.o
0x080047c8 0x00000020 Code RO 684 .text.rcu_periph_clock_disable gd32c10x_rcu.o
0x080047e8 0x0000001e Code RO 682 .text.rcu_periph_clock_enable gd32c10x_rcu.o
0x08004806 0x00000002 PAD
0x08004808 0x00000020 Code RO 692 .text.rcu_periph_reset_disable gd32c10x_rcu.o
0x08004828 0x0000001e Code RO 690 .text.rcu_periph_reset_enable gd32c10x_rcu.o
0x08004846 0x00000002 PAD
0x08004848 0x00000014 Code RO 698 .text.rcu_system_clock_source_config gd32c10x_rcu.o
0x0800485c 0x00000002 Code RO 91 .text.scanAppFlashContent initial.o
0x0800485e 0x00000002 PAD
0x08004860 0x00000020 Code RO 70 .text.system_soft_reset systick.o
0x08004880 0x00000048 Code RO 62 .text.systick_config systick.o
0x080048c8 0x00000006 Code RO 1333 .text.unlikely.abort_message libcppabi_wx.l(abort_message.cpp.o)
0x080048ce 0x00000002 PAD
0x080048d0 0x0000006a Code RO 780 .text.usart_baudrate_set gd32c10x_usart.o
0x0800493a 0x00000002 PAD
0x0800493c 0x00000008 Code RO 806 .text.usart_data_transmit gd32c10x_usart.o
0x08004944 0x0000007a Code RO 778 .text.usart_deinit gd32c10x_usart.o
0x080049be 0x00000002 PAD
0x080049c0 0x0000000a Code RO 788 .text.usart_enable gd32c10x_usart.o
0x080049ca 0x00000002 PAD
0x080049cc 0x00000010 Code RO 868 .text.usart_flag_get gd32c10x_usart.o
0x080049dc 0x00000014 Code RO 794 .text.usart_receive_config gd32c10x_usart.o
0x080049f0 0x00000014 Code RO 792 .text.usart_transmit_config gd32c10x_usart.o
0x08004a04 0x0000000e Code RO 1925 i.__scatterload_copy mc_w.l(handlers.o)
0x08004a12 0x00000002 Code RO 1926 i.__scatterload_null mc_w.l(handlers.o)
0x08004a14 0x0000000e Code RO 1927 i.__scatterload_zeroinit mc_w.l(handlers.o)
0x08004a22 0x00000002 PAD
0x08004a24 0x00000024 Code RO 1059 i.puts mc_w.l(puts.o)
0x08004a48 0x00000100 Data RO 50 .rodata._ZL4sbox aes128.o
0x08004b48 0x00000010 Data RO 143 .rodata._ZL8K_master OTA.o
0x08004b58 0x00000400 Data RO 145 .rodata._ZZ24calculate_crc32_with_keyPKhS0_PhE9crc_table OTA.o
0x08004f58 0x00000008 Data RO 766 .rodata.cst8 gd32c10x_rcu.o
0x08004f60 0x00000007 Data RO 295 .rodata.g_can_fdlength_table gd32c10x_can.o
0x08004f67 0x00000100 Data RO 49 .rodata.inv_sbox aes128.o
0x08005067 0x00000001 PAD
0x08005068 0x00000020 Data RO 1924 Region$$Table anon$$obj.o
Execution Region RW_NOINIT (Base: 0x20000000, Size: 0x00000000, Max: 0x00007200, ABSOLUTE, UNINIT)
File diff suppressed because it is too large Load Diff