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进板子?

Parents
  • 请明确几个问题:

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

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

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

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

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

Reply
  • 请明确几个问题:

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

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

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

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

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

Children
  • 你好,

    目前已经能够更改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
    }