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.

[参考译文] CCS/TMS570LS1224:为什么在 RAM 中运行的函数在执行所有语句后无法返回其原始位置?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/784128/ccs-tms570ls1224-why-does-a-function-that-runs-in-ram-fail-to-return-to-its-original-position-after-executing-all-the-statements

器件型号:TMS570LS1224

工具/软件:Code Composer Studio

如下图所示,在初始化主函数之前,我将地址为0x080014FC 的 FUNCK_TEST (2)函数复制到 RAM 区域,然后当我单步调试时,当我运行到 FUNCK_TEST_TEST_()时,它实际上会跳转到0x080014FC。 运行、但在运行此函数的所有语句后、它会直接提示"0x8001538"没有可用的源代码"。 我想问的是、为什么我不跳回我最初给他打电话的地方。

1、开始调用函数、PC 指针的地址为0x0000 7428 (在闪存区域中)

2.程序跳转至0x080014FC 以开始进入 FACK_TEST (2)函数。 下面的屏幕截图是运行到最后一条 FUNK_TEST (2)语句时的 PC 指针。 我认为在运行最后一个代码后、函数会跳回到最初调用它的位置、但它出错了、请参阅图3。

3.程序执行错误,提示符似乎不能执行代码。

所以、问题是一个从闪存复制到 RAM 的函数。 为什么该函数在运行结束时报告错误、而不返回到最初调用的位置、然后如何解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、似乎可以、我屏蔽了_copyAPI 2RAM_();、这样实际的程序就不会复制到 RAM、但可以在仿真过程中输入(这是为什么?)、唯一的效果是它不能跳回到最初调用的位置? 然后执行_APIcopy2RAM_();然后您可以跳回到您调用它的位置。

    这是另一个问题。 为什么不能执行_copyAPI 2RAM_()函数来跳转到 RAM 中的执行函数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BJ、

    是的、您可以在 SRAM 中执行复制函数。 我稍后将提供一个示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BJ、

    我在您的另一篇文章中提供了示例。

    1.在 c 中、将将将在 SDRAM 或 SRAM 中执行的函数放入用户定义的段中
    #pragma SET_CODE_SECTION (".blinky_section")
    空闪烁()

    int i;
    gioSetDirection (hetPORT1、1);
    while (1)

    gioToggleBit (hetPORT1、0);
    for (i=0;i<1000000;i++);


    #pragma SET_CODE_SECTION ()

    2.链接器 CMD 文件
    -在内存下添加以下内容
    -SDRAM (rwx):origin=0x8000000 length=0200000000
    -在各节下面添加以下内容
    -.blinky_section:run = SDRAM,load = FLASH0 | FLASH1
    load_start (BlinkyLoadStart)、load_end (BlinkyLoadEnd)、load_size (BlinkySize)、
    run_start (BlinkyStartAddr)、run_end (BlinkyEndAddr)

    加载项目后,函数 blinky()将被放置在 SDRAM 中并从 SDRAM 中执行。