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.

[参考译文] TMS570LS0914:当中断矢量起始地址从0x00000000更改为0x00020000时、启动代码自检失败并且 SP 指向 UNDEF 条目地址(0x00000004)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/824824/tms570ls0914-start-up-code-self-test-fails-and-sp-pointing-to-undef-entry-address-0x00000004-when-the-interrupt-vector-starting-address-changed-from-0x00000000-to-0x00020000

器件型号:TMS570LS0914

大家好、

我将 TMS570LS0914用于其中一个应用。 在启动代码期间遇到如下问题;

我 尝试将链接器文件中应用程序的起始地址从0x00000000更改为0x00020000。

存储器

   引导程序(X) :origin=0x00020000 length=0x00000020

   FLASH0 (RX):origin=0x00020020 length=0x000DFFE0

   堆栈 (RW):origin=0x08000000 length=0x00001500

   RAM    (RW):origin=0x08001500 length=0x0001EB00

 

/*用户代码开始(2)*/

/*用户代码结束*/

  1. 当我们尝试以调试模式运行应用程序时、代码进入启动代码(ESM 故障(循环无限大)或指向未定义存储器位置的堆栈指针(0x00000004))。

  2. 代码使用 Halocogen v4.7.1生成、其中启动代码包含所有自检序列。

  3. 但是在测试时、当我们将矢量起始地址保留为0x00000000、并将 FLASH0地址保留在0x00020000、应用程序工作正常。

我是否错过了任何配置?

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

    您好!

    问题是矢量表必须位于地址0x00000000处、因为这是 CPU 在启动或获取中断时加载指令的位置。

    执行的第一条指令位于地址0x00000000、它是复位中断处理程序的分支指令。

    因此、如果您如上所述更改链接器脚本、则会出现未定义的行为。

    此致、

    Marko

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

    您好、Marko、

    我的引导加载程序代码将位于0x00000000至0xXXXXXXXX 之间、然后我的应用程序代码从0x00020000开始。 这里的问题是、如果我尝试调试从地址0x00020000开始的应用程序代码、它在启动代码中出现故障、有时 RAM ECC 不可纠正的错误上升、有时 SP 指向 UNDEF 进入位置。

    中断矢量起始地址可以更改。

    此致、

    Saravanan

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

    您好!

    我所做的事情完全相同。

    您不需要固件(应用)的矢量表。

    我的引导加载程序链接器脚本:

    /*------------------ */
    /*链接器设置 */
    
    --retain="*(.intvecs)"
    
    /*用户代码开始(1)*/
    --entry_point=__mutters_int00
    -iF021//*
    用户代码结束*/
    
    /*-->--- */
    /*内存映射 */
    
    //*--------------------------------------------------------------------------------------------------------- */
    /*链接器设置 */
    
    --retain="*(.intvecs)"
    
    /*用户代码开始(1)*/
    --entry_point=__mutters_int00
    -iF021//*
    用户代码结束*/
    
    /*-->--- */
    /*内存映射 */
    
    MEMORY
    {
    * USER CODE BEGIN (2)*/
    * USER CODE END */
    引导程序(X):origin=0x00000000 length=0x00000020
    FLASH0 (RX):origin=0x00000020 length=0x001FFFE0
    FLASH1 (RX):origin=0x00200000 length=0x00200000
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0007EB00
    
    /* USER CODE BEGIN (3)*/*
    /
    * USER CODE END */}/*
    
    USER CODE BEGIN (4)*/
    /* USER CODE END *//*---
    
    
    --- */
    /*段配置 */
    
    SECTIONS
    {
    /* USER CODE BEGIN (5)*/
    mut_flash align (32):{
    --library= F021_API_CortexR4_be_V3D16.lib (.text)
    } LOAD > FLASH0
    ,运行> RAM
    ,load_start (__mut_flash_start)
    ,load_end (__mut_flash_end)
    ,run_start (__mut_flash_run_start)
    /*用户代码 end */
    .intvecs:{}>向量
    .text align (32):{}> FLASH0 | FLASH1
    .const align (32):{}> FLASH0 | FLASH1
    .cinit align (32):{}> FLASH0| FLASH1
    .pinit align (32):{}> FLASH0 | FLASH1
    .bss :{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM
    
    
    /*用户代码开始(6)*/*
    用户代码结束*/
    }/*
    
    用户代码开始(7)*/
    /*用户代码结束*/*---
    
    
    --- */
    /*其他 */
    
    /*用户代码开始(8)*/
    /*用户代码结束*/
    /*-->------------ *
    

    我的固件链接器脚本:

    /*------------------ */
    /*链接器设置 */
    
    --retain="*(.intvecs)"
    
    /*用户代码开始(1)*/
    --entry_point=fw_main
    /*用户代码结束*/
    
    /*-->--- */
    /*内存映射 */
    
    MEMORY
    {
    * USER CODE BEGIN (2)*/
    * USER CODE END */
    FLASH0 (RX):origin=0x00010000 length=0x001EFFE0
    FLASH1 (RX):origin=0x00200000 length=0x00200000
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0007EB00
    
    /* USER CODE BEGIN (3)*/*
    /
    * USER CODE END */}/*
    
    USER CODE BEGIN (4)*/
    /* USER CODE END *//*---
    
    
    --- */
    /*段配置 */
    
    SECTIONS
    {
    /* USER CODE BEGIN (5)*/
    mutters_init align (32):{}> 0x10000
    //用户代码结束*/
    .text align (32):{}> FLASH0
    .const align (32):{}> FLASH0
    .cinit align (32):{}> FLASH0
    .pinit align (32):{}> FLASH0
    .bss :{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM
    
    fee_text_section:{}> FLASH0
    fee_const_section:{}> FLASH0
    fee_data_section:{}>RAM
    
    /*用户代码开始(6)*/*
    /*用户代码结束*/
    }/*
    
    用户代码开始(7)*/
    /*用户代码结束*/
    
    
    /*------ */
    /*其他 */
    
    /*用户代码开始(8)*/
    /*用户代码结束*/
    /*-->------------ * 

    如您所见、在 FW 链接器脚本.intvecs 部分中删除、并且我不需要针对 FW 代码的中断向量。

    引导加载程序负责处理中断、而不是 FW。 您可以实现一些回调机制、其中引导加载程序将调用 FW 处理程序。

    此致、

    Marko

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

    Marco、

    感谢您的帮助!!!

    此致、
    米罗

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

    您好、Miroslav、

    没问题、总是很乐意提供帮助。