硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1749|回复: 5
收起左侧

[BOOT/IAP] 关于OpenBLT使用过程遇到的.srec文件加载错误和RTOS跳转问题请教

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2023-12-19 23:32:41 | 显示全部楼层 |阅读模式
本帖最后由 jsarthur 于 2023-12-19 23:34 编辑

最近有项目应用需要在学习移植OpenBLT,过程中遇到两个问题请教下。

目前测试demo可以正常运行,但过程中遇到两个问题
1.生成的.srec文件使用V2.0X的是mircoBOOT提示固件加载错误
然后使用V1.03可以正常加载并完成下载过程程序也能正常跑。
下载.png

2.APP应用是裸机系统下载跳转运行正常,APP应用使用了Freertos系统就不能正常跳转(APP是正常的修改地址单独烧录测试过,并且APP只有一个点LED的测试应用)
也尝试在跳转前添加 __set_CONTROL(0);还是一样不能正常跳转运行。
下载 (1).png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2023-12-20 09:03:16 | 显示全部楼层
帮顶。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2023-12-20 19:24:57 | 显示全部楼层
Snipaste_2023-12-20_16-46-57.png
OpenBLT带固件校验更新程序后会将校验写到APP向量表末尾(默认设置),对照boot更新和下载器烧录回读的flash,对比了差异
发现应该就是校验写入影响的RTOS的正常启动,疑惑是的裸机系统正常,对此暂还没有去细究,RTOS下硬件接口初始化也正常到创建任务时会进入硬件错位中断导致死机。
目前先取消了flash校验功能注释掉校验写入部分代码就正常了,其实之前也没有使用到校验。
因为平时烧录器下载后BLT计算的校验和之前写入的不一致会到时app不能正常启动。除非一直是使用BLT下载或将烧录时一并将校验烧录到指定位置才行。

回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

积分
78
发表于 2024-12-16 22:22:58 | 显示全部楼层
回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

积分
78
发表于 2024-12-16 22:47:52 | 显示全部楼层
关于楼主提到的问题,我也同样遇到了。

  • 我用的MCU是:STM32G0B1CBT6, 我的APP也是用到了FreeRTOS。
  • 我用的是CAN Bootloader,使用的是USB-CAN工具。

网上的各种解决说法,我都尝试了,都是无果而终!

有个现象就是我的APP:
  1、在IAR中开启最高编译优化选项【High  Speed】,Boot可以正常跳转,可以正常运行。
  2、要是编译优化等级,设置为其它任意的低于最高优化级别的,都是App卡死了,卡死在HardFault_Handler中断中。


最后反复研究OpenBLT的源代码,找到问题所在了:
【以下以 IAR开发环境,STM32G0B1为例说明】

在boot源码中,有个定义:
  #ifndef BOOT_FLASH_VECTOR_TABLE_CS_OFFSET
  #define BOOT_FLASH_VECTOR_TABLE_CS_OFFSET    (0xBC)
  #endif

源代码文件flash.c中,截图如下:



   源代码文件flash.c中---截图.jpg
重要的是: 校验和,它被设置为向量表的末尾。

所以在App的启动文件中,就要添加这个:校验和向量!!!

解决方案如下:
    1.最最重要的是:中断向量表后面要添加:
       DCD  0x55AA11EE ; Reserved for OpenBLT checksum   
   2.特别注意的是,在startup_stm32g0b1xx.s中增加如下代码:
       [------在启动文件执行SystemInit前:如不添加:App程序无法跳转!!!]   
        LDR     R0, =sfe(CSTACK)          ; set stack pointer
        MSR     MSP, R0   
   3. 增加函数:VectorBase_Config()

附图2 【启动文件----添加校验和向量】:
   【启动文件----添加校验和向量】.jpg

附图3 【启动文件中,在SystemInit之前,设置堆栈指针】:
【启动文件中,在SystemInit之前,设置堆栈指针】.jpg

添加函数:
  static void VectorBase_Config(void)
{
  /* The constant array with vectors of the vector table is declared externally in the
   * c-startup code.
   */
  extern const unsigned long __vector_table[];


  /* Remap the vector table to where the vector table is located for this program. */
  SCB->VTOR = (unsigned long)&__vector_table[0];
}

附图4 【添加函数】:
   添加函数VectorBase_Config.jpg

还有就是最基本的了,编译链接向量表设置了:
   编译链接向量表设置-1.jpg

编译链接向量表设置-2.jpg

  按照我说的这几点,配置后,就完全OK了!

  我反复测试了,App的程序编译优化等级,随意设置,都可以正常跳转运行了!。










回复

使用道具 举报

8

主题

54

回帖

78

积分

初级会员

积分
78
发表于 2024-12-17 12:11:13 | 显示全部楼层
按照我提供的OpenBLT,RTOS App跳转运行的解决方法,


  • 刚刚在ThreaX的APP中,也测试了,都是完全OK的!



   另外: 还按照我原来回复他们帖子的方法,
        1、把项目中ThreaX用到的源文件打包成库文件[.a]了,编译运行就更节省时间了。
             方法如下: 利用原来编译后Obj对应文件夹下的所有.o文件,打包:
                              armar -r  ThreadX_Core.a  *.o
            
        2、把项目中用到的STM32 Hal驱动源文件打包成库文件[.a]了,编译运行就更节省时间了。
              方法如下: 利用原来编译后Obj对应文件夹下的所有.o文件,打包:
                  armar -r  stm32_hal_used.a  *.o
           

附图1 [OpenBLT_Threax App测试-1]:
          OpenBLT_Threax App测试-1.png

附图1 [OpenBLT_Threax App测试-2]:
       OpenBLT_Threax App测试-2.png



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 03:34 , Processed in 0.346308 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表