R7A2L1AB _Bootloader 如何从BOOT 跳 APP

大家好,有问题想咨询各位大佬。

使用的是R7A2L1AB板子,当前BOOT函数中,调用实例代码中 do_boot函数,其中 flash_base = 0x10000。我希望将APP程序的其实位置从0x0000改到0x10000,从而满足BOOT ---JUMP--->

APP 。

APP程序能够发送周期性CAN数据,BOOT本身不主动发数据,可通过这块确认是否跳转成功。但是当我改动script中 memory_regions.ld文件中 FLASH_START的赋值,整个APP工程就会报错

失效,必须从worksapce中删除才能重新使用。

我应当如何修改配置文件才能使APP程序生成出来的HEX文件,起始地址从0X10000开始?又应该怎样操作才能使BOOT+APP的HEX文件一起down进板子?

  • 请明确几个问题:

    1.所用的IDE和compiler是什么?

    2.“实例代码中 do_boot函数”所指的示例代码是?

    3.“改动script中 memory_regions.ld文件中 FLASH_START的赋值,整个APP工程就会报错”,报错的细节是什么可否提供?

    4.“如何修改配置文件才能使APP程序生成出来的HEX文件,起始地址从0X10000开始?又应该怎样操作才能使BOOT+APP的HEX文件一起down进板子?”这两个问题依赖问题1的答案。

    如果可以的话,请删除敏感代码后,将源码直接贴上来,便于分析和支持,谢谢。

  • 你好,

    目前已经能够更改APP去程序的ld文件了,是编译器内部链接的BUG,需要把script中fsp.ld文件里面的 !DEFINED增加空格 ! DEFINED,这样。

    现在刷写完后,会进入do_boot函数跳转,跳转0X20000时候出现

    break at address"0xeffffffe"with no debug information

    1我用的是e2 studio, 使用HEX格式CAN刷升级

    2 do_boot实例代码如下:

    void do_boot(struct boot_rsp *rsp)
    {
        /* Clang at O0, stores variables on the stack with SP relative addressing.
         * When manually set the SP then the place of reset vector is lost.
         * Static variables are stored in 'data' or 'bss' section, change of SP has
         * no effect on them.
         */
        static struct arm_vector_table *vt;
        uintptr_t flash_base;
        uint32_t vt_msp, vt_reset;
        int rc;
        flash_base = APP_IMAGE_START;//0X20000;
        vt = (struct arm_vector_table *)(flash_base);
        vt->msp = *(uint32_t *)flash_base;
        vt->reset = *(uint32_t *)(flash_base+4);
    #if defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8M_BASE__)
        /* Restore the Main Stack Pointer Limit register's reset value
         * before passing execution to runtime firmware to make the
         * bootloader transparent to it.
         */
        __set_MSPLIM(0);
    #endif
       
        SCB->VTOR = ((int)(&(vt->msp)) & 0x1FFFFF80);
        __DSB();
        /* Disable MSP monitoring  */
    #if BSP_FEATURE_BSP_HAS_SP_MON    //Added WangJin 2021.02.22
        R_MPU_SPMON->SP[0].CTL = 0;
        while(R_MPU_SPMON->SP[0].CTL != 0);
    #endif
        __set_MSP(vt->msp);
        ((void (*)()) vt->reset)();
    #endif
    }
  • 目前已经能够更改APP去程序的ld文件了,是编译器内部链接的BUG,需要把script中fsp.ld文件里面的 !DEFINED增加空格 ! DEFINED,这样。

    现在刷写完后,会进入do_boot函数跳转,跳转0X20000时候出现

    break at address"0xeffffffe"with no debug information

    是否出了起始地址FLASH_START和FLASH_LENGTH以外还有别的需要修改?

  •  调试到JUMP的时候如下

  • 你好,在此状态下,请确认0x20000处有合理的代码,可以在memory窗口查看。

    另外,你所说的调试,是调试哪一个project呢?Boot Project吗?如果调试Boot Project的同时,需要加载App Project的内容,可参考下图的方法进行下载。

    如果调试的是App Project,则需要在调试前将Boot Project内容下载到MCU中(参考上图的操作)。

    特别需要注意的是,仔细确认烧写地址,以免产生无法恢复的锁死。

  • 你好,我在调试BOOT的时候,通过load file 加入了APP的HEX文件(文件地址是从0x2000开始),同时选择了Address为0x20000,稍后在BOOT调试时查看memory,显示如图。

    等到程序调试走到 

    ((void (*)()) vt->reset)();

    调试进入,project报出

    我不知道应该怎样才能从BOOT实现跳转,以及我在BOOT中刷写新程序(已经在代码中修改好起始地址的HEX文件偏移),直接跳转至APP区。

    谢谢

  • APP区域的代码,我单独调试其project(起始地址为0x0000)是能够正常运行,并且发出CAN数据来判断工作正常。

  • 你好,请参考下图的配置,从0x20000开始调试App Project。调试前确认App Project重新build生成的目标文件(*.srec 或*.hex)起始地址是0x20000。

    下图中的参数分别替换为:

    set $sp = *0x20000

    set $pc = *0x20004

    set {int}0xe000ed08 = 0x00020000

    关于这三行的意义说明,请参考以下链接中的文档说明:

    https://developer.arm.com/documentation/ddi0337/e/

    另:从提供的memory window内容看,里面的内容是不合理的。

    如果0x20000是App Project的起始地址,则0x20000处的4 Byte应该是stack pointer的地址,解析之后为RAM空间才对,0x20004开始的4 Byte是中断向量表的存放地址,应该是code flash空间,从目前的结果上看均不合理。请再次确认。

  • 你好,w,请问这个问题是否已经解决。如已解决,管理员将关闭该问题。