RT-Thread论坛
直播中

刘玉兰

8年用户 1096经验值
私信 关注
[问答]

BootLoader app程序反复重启,IAP升级失败怎么处理?

keil开发的BootLoader程序,用RT-Thread Studio开发的app程序,板子每次上电后,从BootLoader程序跳转到app程序,就打印几行RT-Thread的日志,然后就反复重启:先执行BootLoader程序,再执行app程序打印几行日志,见图片:



回帖(1)

gfhtrdfd

2025-9-12 18:20:37

针对BootLoader与App程序反复重启的问题,结合常见原因及解决方案,以下是详细排查步骤:




1. 检查向量表偏移设置 (最常见原因)




  • App程序需配置向量表偏移地址

    在RT-Thread App的启动文件或初始化代码中,必须重新设置向量表偏移寄存器 (VTOR),指向App自身的中断向量表起始地址。  


    // 示例代码(在App的board.c的rt_hw_board_init()中)
    #include // 替换为实际芯片头文件
    void rt_hw_board_init()
    {
      // 设置VTOR为App起始地址(假设App从0x08010000开始)
      SCB->VTOR = 0x08010000;
      // ...其他初始化
    }



  • BootLoader跳转前应禁用全局中断  


    void jump_to_app(uint32_t app_address) {
      typedef void (*pFunction)(void);
      pFunction app_entry;
      uint32_t stack_pointer;

      // 检查栈顶地址合法性
      stack_pointer = *(volatile uint32_t*)app_address;
      if (stack_pointer < 0x20000000) return; // 检查是否在RAM范围内

      // 禁用中断
      __disable_irq();

      // 设置主堆栈指针
      __set_MSP(stack_pointer);

      // 获取App入口地址(复位地址 = app_address + 4)
      app_entry = (pFunction)*(volatile uint32_t*)(app_address + 4);

      // 跳转并永不返回
      app_entry();
    }





2. 检查链接脚本地址一致性




  • BootLoader配置(Keil)  



    • ROM起始地址:0x08000000  

    • 大小:根据实际大小(例如64KB → 0x10000)  




  • App配置(RT-Thread Studio)  



    • 链接脚本修改

      linker_scripts 目录下找到 .ld 文件,确保以下配置:  
      MEMORY
      {
      ROM (rx) : ORIGIN = 0x08010000, LENGTH = 256K  /* BootLoader后64KB→0x08010000 */
      RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
      }

    • 编译后验证

      检查生成的 rtthread.bin 文件是否位于正确地址(如0x08010000)。






3. 关闭外设与中断




  • BootLoader跳转前需清理外设

    在跳转函数前添加以下代码:


    // 关闭所有中断
    HAL_NVIC_DisableIRQ(所有IRQn);

    // 停用SysTick定时器
    SysTick->CTRL = 0;

    // 关闭外设时钟(UART、SPI等)
    HAL_RCC_DeInit();





4. 处理看门狗复位



  • 检查看门狗配置  

    • BootLoader:若启用IWDG/WWDG,跳转前停止或复位计数器。  

    • App:启动后若需用看门狗,确保初始化后及时喂狗。

      推荐在跳转前先关闭看门狗:
      IWDG->KR = 0xCCCC;  // 启动看门狗(如果需要保持)
      // 或直接禁用(根据芯片支持)





5. 堆栈大小不足排查



  • 增大App堆栈空间

    rtconfig.h 中调整:
    #define HEAP_BEGIN  0x20000000
    #define HEAP_END    0x20010000
    #define RT_MAIN_THREAD_STACK_SIZE 4096  // 至少2KB→4096




6. 验证App独立运行



  • 直接烧录App到0x08000000

    移除BootLoader,将App起始地址设为 0x08000000 并烧录。若可正常运行,则问题在BootLoader跳转逻辑。




7. 添加调试日志



  • 在HardFault中断添加跟踪

    在App中注册HardFault处理函数:
    void HardFault_Handler(void) {
      rt_kprintf("!!! HardFault !!!n");
      while (1);
    }

    若进入此函数,说明程序崩溃(需检查内存越界、空指针)。





8. 排查时钟冲突



  • App避免重新配置时钟

    若BootLoader已初始化时钟(如HSE/PLL),在App中跳过HAL_RCC_Init(),或确保两者配置一致。




总结步骤



  1. 优先检查VTOR设置是否匹配App地址  

  2. 验证链接脚本地址是否正确  

  3. BootLoader跳转前禁用中断+清理外设  

  4. 增大堆栈大小并关闭看门狗  

  5. 通过直接烧录App隔离问题  


通过以上步骤,90%的反复重启问题可解决。重点排查 向量表偏移链接地址一致性,这是RT-Thread与BootLoader配合最常见的问题点。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分