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.

[参考译文] TMS570LS1224:如何在运行时从一个地址跳转到另一个地址?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/955633/tms570ls1224-how-can-i-jump-from-one-address-to-another-at-runtime

器件型号:TMS570LS1224

大家好、

我正在尝试修改以下为 TMS570LS1224的 Arm Cortex M3编写的代码;

__attribute__((noinline))静态 void prv_enable_vfp ( void )
{
volatile uint32_t *cpacr =(volatile uint32_t *)0x20000000;
*cpacr |= 0xF << 20;
}

静态 void start_app (Uint32_t PC, uint32_t *)0x20000000;*void (_sp)

(_reset_apore)(_en_enu_micro)(_translit
handler )(_enu_enu_enu_enu_enu_enu_enu_enu_enu_br)
;(_enu_enu_micro





那么、如何编写 CMSIS Cortex-R4F 内核函数/指令呢?

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

    您好!

    以下是用于 Hercules 器件的 CMSIS 下载链接:

    CMSIS 中的大多数算法都以浮点和各种定点格式提供、并针对 Cortex-R 系列处理器进行了优化。 Cortex-R4处理器的实现方案使用 ARM DSP SIMD (单指令多数据)指令集和浮点硬件来完全启用 Cortex-R4处理器的信号处理算法功能。  

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

    大家好、感谢您的回答。 我尝试更改主堆栈指针、但 对 Cortex-R4系列不熟悉。 例如、当我尝试使用(Cortex M)时、

    __Set_MSP (*(volatile uint32_t *)( ); 

    如上所示、我可以为 Cortex M 设置堆栈指针、但找不到任何用于 Cortex R4的宏或函数。 你有什么建议吗?  

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

    此宏不用于 Hercules 器件。

    您可以使用以下指令跳转至地址:

        ((void (*)(void)) g_Address)();

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

    我尝试使用您的 Jump 函数、但我遇到了这样的错误;

    CortexR4:文件加载程序:存储器写入失败:闪存算法在闪存编程期间返回一个错误。 注意:自动 ECC 生成已打开、请确保数据段在链接器文件中对齐为64位内存;或者、在片上闪存设置中关闭自动 ECC 生成

    我的链接器文件、如下所示;

    /*链接器设置 */
    
    --retain="*(.intvecs)"
    
    /*用户代码开始(1)*/
    /*用户代码结束*/
    
    /*----------------- */
    /*内存映射 */
    
    MEMORY
    {
    FLASH0 (RX):origin=0x00009040 length=0x00136FC0
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0002EB00
    
    /* USER CODE BEGIN (2)*/*
    /
    }/*
    
    USER CODE BEGIN (3)*/*
    //* USER CODE END *//*---
    
    --- */
    /*段配置 */
    
    SECTIONS
    {
    .intvecs:{}>FLASH0
    .text:{}> FLASH0
    .const:{}>FLASH0
    .cinit:{}> FLASH0
    .pinit:{}> FLASH0
    .bss :{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM
    
    fee_text_section:{}> FLASH0
    fee_const_section:{}> FLASH0
    FEE 数据段:{}> RAM
    
    /*用户代码开始(4)*/*
    用户代码结束*/
    } 

    我的主;

    void main (void)
    {
    peripheral_init();//0x00010020 //0x00008020
    
    ((void (*)(void)) 0x00009040)();
    
    while (1)
    {
    //there is some code but the stack pointer should 't get here there.
    }
    
    } 

    我尝试跳过此地址:0x00009040。

    1) 1)我的链接器文件是否错误?

    2) 2)如果链接器为 true、如何传递自动 ECC 生成故障?  

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

    1.如果0x9040m 处没有有效指令、则会出现错误

    CCS 将程序加载到闪存中时、如果启用了该选项、则会自动对 ECC 进行编程:

      CCS-->TOOLS -->片上闪存-->闪存设置-->自动 ECC 生成