This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:如何在 CM 中跳转到次级应用的入口点

Guru**** 2394295 points
Other Parts Discussed in Thread: TMS320F28384S

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1112741/tms320f28388d-how-to-jump-to-entry-point-of-secondary-application-in-cm

器件型号:TMS320F28388D

您好!

我正在编写一些应用程序、它充当固件更新的引导加载程序和闪存写入器。

但我遇到了一些问题。 最终、它无法从引导加载程序应用程序跳转到次级应用程序。

我自己的引导应用程序中跳转到第二个应用程序的代码如下所示。

//
// Included Files
//
#include "driverlib_cm.h"
#include "cm.h"

#define APP_START_ADDRESS               0x00270000U

void exit(uint32_t address){
    //
    // Jump to entry address
    //
    __asm("   bx r0");
}

//
// Main
//
void main(void)
{
    CM_init();
    GPIO_writePin(120U,0);

    exit(APP_START_ADDRESS);
}

//
// End of File
//

链接命令脚本与下面的相同。

MEMORY
{
   /* Flash sectors */
   CMBANK0_RESETISR : origin = 0x00200000, length = 0x00000008 /* Boot to Flash Entry Point */
   CMBANK0_SECTOR0  : origin = 0x00200008, length = 0x00003FF8
   CMBANK0_SECTOR1  : origin = 0x00204000, length = 0x00004000
   CMBANK0_SECTOR2  : origin = 0x00208000, length = 0x00004000

   C1RAM            : origin = 0x1FFFC000, length = 0x00002000
   C0RAM            : origin = 0x1FFFE000, length = 0x00002000

   BOOT_RSVD        : origin = 0x20000000, length = 0x00000800 /* Part of S0, BOOT rom will use this for stack */
   S0RAM            : origin = 0x20000800, length = 0x00003800
   S1RAM            : origin = 0x20004000, length = 0x00004000
   S2RAM            : origin = 0x20008000, length = 0x00004000
   S3RAM            : origin = 0x2000C000, length = 0x00004000
   E0RAM            : origin = 0x20010000, length = 0x00004000

   CPU1TOCMMSGRAM0  : origin = 0x20080000, length = 0x00000800
   CPU1TOCMMSGRAM1  : origin = 0x20080800, length = 0x00000800
   CMTOCPU1MSGRAM0  : origin = 0x20082000, length = 0x00000800
   CMTOCPU1MSGRAM1  : origin = 0x20082800, length = 0x00000800
   CPU2TOCMMSGRAM0  : origin = 0x20084000, length = 0x00000800
   CPU2TOCMMSGRAM1  : origin = 0x20084800, length = 0x00000800
   CMTOCPU2MSGRAM0  : origin = 0x20086000, length = 0x00000800
   CMTOCPU2MSGRAM1  : origin = 0x20086800, length = 0x00000800
}

SECTIONS
{
   .resetisr        : > CMBANK0_RESETISR
   .vftable         : > CMBANK0_SECTOR0   /* Application placed vector table in Flash*/
   .vtable          : > S0RAM             /* Application placed vector table in RAM*/
   .text            : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
   .cinit           : > CMBANK0_SECTOR0
   .pinit           : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
   .switch          : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
   .sysmem          : > S2RAM

   .stack           : > C1RAM
   .ebss            : > C1RAM
   .econst          : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1
   .esysmem         : > C1RAM
   .data            : > S3RAM
   .bss             : > S3RAM
   .const           : >> CMBANK0_SECTOR0 | CMBANK0_SECTOR1

    MSGRAM_CM_TO_CPU1 : > CMTOCPU1MSGRAM0, type=NOINIT
    MSGRAM_CM_TO_CPU2 : > CMTOCPU2MSGRAM0, type=NOINIT
    MSGRAM_CPU1_TO_CM : > CPU1TOCMMSGRAM0, type=NOINIT
    MSGRAM_CPU2_TO_CM : > CPU2TOCMMSGRAM0, type=NOINIT

    .TI.ramfunc : {} LOAD = CMBANK0_SECTOR0,
                     RUN = C0RAM,
                     LOAD_START(RamfuncsLoadStart),
                     LOAD_SIZE(RamfuncsLoadSize),
                     LOAD_END(RamfuncsLoadEnd),
                     RUN_START(RamfuncsRunStart),
                     RUN_SIZE(RamfuncsRunSize),
                     RUN_END(RamfuncsRunEnd),
                     ALIGN(8)
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

上面的引导应用程序尝试跳转到的次级应用程序的链接命令如下所示、

MEMORY
{
   /* Flash sectors */
   CMBANK0_RESETISR10 : origin = 0x00270000, length = 0x00000008 /* Boot to Flash Entry Point */
   CMBANK0_SECTOR10_11 : origin = 0x00270008, length = 0x00007FF8
   CMBANK0_SECTOR12 : origin = 0x00278000, length = 0x00004000
   CMBANK0_SECTOR13 : origin = 0x0027C000, length = 0x00004000

   C1RAM            : origin = 0x1FFFC000, length = 0x00001FFF
   C0RAM            : origin = 0x1FFFE000, length = 0x00001FFF

   BOOT_RSVD        : origin = 0x20000000, length = 0x00000800 /* Part of S0, BOOT rom will use this for stack */
   S0RAM            : origin = 0x20000800, length = 0x000037FF
   S3RAM            : origin = 0x2000C000, length = 0x00003FFF
   S1_S3RAM			: origin = 0x20004000, length = 0x0000BFFF
   E0RAM            : origin = 0x20010000, length = 0x00003FFF

   CPU1TOCMMSGRAM0  : origin = 0x20080000, length = 0x00000400
   CPU1TOCMMSGRAM0_ECAT  : origin = 0x20080400, length = 0x00000400
   CPU1TOCMMSGRAM1  : origin = 0x20080800, length = 0x00000800

   CMTOCPU1MSGRAM0  : origin = 0x20082000, length = 0x00000400
   CMTOCPU1MSGRAM0_ECAT  : origin = 0x20082400, length = 0x00000400
   CMTOCPU1MSGRAM1  : origin = 0x20082800, length = 0x00000800

   CPU2TOCMMSGRAM0  : origin = 0x20084000, length = 0x00000800
   CPU2TOCMMSGRAM1  : origin = 0x20084800, length = 0x00000800
   CMTOCPU2MSGRAM0  : origin = 0x20086000, length = 0x00000800
   CMTOCPU2MSGRAM1  : origin = 0x20086800, length = 0x00000800
}

SECTIONS
{
   .resetisr        : > CMBANK0_RESETISR10, ALIGN(8)
   .vftable         : > CMBANK0_SECTOR10_11, ALIGN(8)   /* Application placed vector table in Flash*/
   .vtable          : > S0RAM             /* Application placed vector table in RAM*/
   .text            : >> CMBANK0_SECTOR10_11 | CMBANK0_SECTOR12, ALIGN(8)
   .cinit           : > CMBANK0_SECTOR10_11, ALIGN(8)
   .pinit           : > CMBANK0_SECTOR10_11, ALIGN(8)
   .switch          : > CMBANK0_SECTOR10_11, ALIGN(8)
   .sysmem          : > C1RAM

   .stack           : > C1RAM
   .ebss            : > C1RAM
   .econst          : > CMBANK0_SECTOR10_11, ALIGN(8)
   .esysmem         : > C1RAM
   .data            : >> C0RAM|C1RAM
   .bss             : > C0RAM
   .const           : > CMBANK0_SECTOR10_11, ALIGN(8)

    MSGRAM_CM_TO_CPU1 : > CMTOCPU1MSGRAM1, type=NOINIT
    MSGRAM_CM_TO_CPU1_ECAT : > CMTOCPU1MSGRAM0_ECAT, type=NOINIT
    MSGRAM_CM_TO_CPU2 : > CMTOCPU2MSGRAM0, type=NOINIT
    MSGRAM_CPU1_TO_CM : > CPU1TOCMMSGRAM0, type=NOINIT
    MSGRAM_CPU1_TO_CM_ECAT : > CPU1TOCMMSGRAM0_ECAT, type=NOINIT
    MSGRAM_CPU2_TO_CM : > CPU2TOCMMSGRAM0, type=NOINIT

    .TI.ramfunc : {} LOAD = CMBANK0_SECTOR10_11,
                           RUN = S1_S3RAM,
                           LOAD_START(RamfuncsLoadStart),
                           LOAD_SIZE(RamfuncsLoadSize),
                           LOAD_END(RamfuncsLoadEnd),
                           RUN_START(RamfuncsRunStart),
                           RUN_SIZE(RamfuncsRunSize),
                           RUN_END(RamfuncsRunEnd),
                           ALIGN(8)
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

虽然应用的位置不同、但我不确定它为什么不能正常工作。

如果您能告诉我如何正确执行该操作、我将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    代码对我来说看起来很好。 您能否在中执行汇编代码(在反汇编窗口中)步骤并查看其失败的位置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Baskaran

    我这样做是为了查看并检查它是否失败,并发现它必须位于 faultISR()中。

    此外、我修改了代码以直接跳转到次级应用程序的_c_int00_noargs。

    //
    // Included Files
    //
    #include "driverlib_cm.h"
    #include "cm.h"
    
    #define APP_START_ADDRESS               0x002765E8U
    void exit(uint32_t address){
        //
        // Jump to entry address
        //
        __asm("   bx r0");
    }
    
    //
    // Main
    //
    void main(void)
    {
        CM_init();
        GPIO_writePin(120U,0);
        exit(APP_START_ADDRESS);
    }
    

    但它仍然会进入 faultISR()。

    在辅助应用程序的映射文件中、入口点如下所示。

    0x002765E9

    我检查辅助应用的最终端点的反汇编。 我想它看起来不错。

    实际上、我不知道为什么映射文件的地址(0x2765E9)和下面的地址(0x2765E8)之间存在差异  

    请检查我是否有任何误解。

    谢谢。

        

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它是否执行了行0x2003F8

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能更详细地解释一下您的指导吗? 我不确定0x2003F8和0x2003F4之间的区别是什么。

    如何在诸如0x2003F8的特定地址上运行代码分支?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    参考此图像。 我看到线条2003F4被执行(因为它被突出显示)。 接下来、它应该已经执行了2003F8、但它没有被突出显示。

    这就是我问它是否执行了2003F8的原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="525525590" url="~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1112749/tms320f28388d-how-to-jump to entry-point-ofbide-application-in-cm/4125481#4125481"]我实际上不知道0x278 ( 引用以下地址和0x27658)地址之间的区别。

    在 仅支持 ARM Thumb 模式的 Cortex-M 中、分支地址中的最低有效位必须设置为设置 Thumb 模式。

    例如、尝试更改为以下定义:

    #define APP_START_ADDRESS               0x002765E9U

    有关  更多信息、请参阅 TMS320F28384S:CM4中的代码分支。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、您可能需要根据  xxx.map 更改 APP_START_ADDRESS、 现在我使用了0x00208400 而不 是0x00208000

    由于 在调试情况下、 您可以检查存储器地址0x00208400、因此该值 是栈地址

    重新密封
    0 00208000 00000006
    00208000 00000006 startup_cm.obj (.resetisr:resetISR)

    .vftable 0 00208400 00000140
    00208400 00000140 startup_cm.obj (.vftable:retain)

    .cinit 0 00208008 00000000未初始化

    .stack 0 1fffc000 00000200未初始化
    1fffc000 00000004 rtsv7M4_T_le_eabi.lib:boot_cortex_m.c.obj (.stack)
    1fffc004 000001fc -孔-

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Chester、

    我打算第一个引导加载程序跳转到次级应用程序的.reshtisr、它位于闪存上的0x270000、如下所示。

    MEMORY
    {
       /* Flash sectors */
       CMBANK0_RESETISR10 : origin = 0x00270000, length = 0x00000008 /* Boot to Flash Entry Point */
       ...
    }
    
    SECTIONS
    {
       .resetisr        : > CMBANK0_RESETISR10, ALIGN(8)
       ...
    }

    在我的代码中、当我将地址配置为0x270000、如上面所示、执行行(进入 faultISR)失败。

    我参考您给我的链接修改如下、发现它运行良好。

    #define APP_START_ADDRESS               0x00270001
     

    感谢您的详细建议。