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.

[参考译文] TMS320F28386D:如何跳过 CM 入口点?

Guru**** 2455360 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/971450/tms320f28386d-how-to-jump-cm-entry-point

器件型号:TMS320F28386D
主题中讨论的其他器件:C2000WARE

您好!

我想跳转至 CM 入口地址并重新启动 main()程序。 我该怎么做?

我的定义如下:

#define BOOTMODE_INEIT_POINT_CM 0x00200000

void (* BootfuncPtr)(void)=(void (*)(void)) bootmode_entry_point_cm;

我打电话给:

(*BootfuncPtr )();

但它会进入 faultISR()无限循环。

这是我的 CM .cmd

e2e.ti.com/.../0028.2838x_5F00_FLASH_5F00_lnk_5F00_cm.txt

在 CPU1和 CPU2中,该方法可以完美地重新启动 main(),如下所示:

#define BOOTMODE_INTERY_POINT 0x080000

void (* BootfuncPtr)(void)=(void (*)(void)) bootmode_entry_point;

(*BootfuncPtr )();

如何在 CM 中执行?

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

    地址 0x00200000对应于堆栈指针。 请尝试下一个地址 - 0x00200004

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

    您好!

    它仍然进入 faultISR()。

    我可以从代码在线获取入口点地址吗?

    或者、我是否应该 像 CPU1" code_start"那样设置项目属性"-entry_point"?

    谢谢

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

    您可以从映射文件中检查当前 entry_point 并跳转到该入口点。

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

    您好!

    我 的映射文件中显示了"入口点符号:"_c_int00_noargs"地址:00204d09"。

    1.我使用下面的代码跳到这一点,但它进入 了 defaultISR()。 如何解决此问题?

    #define BOOTMODE_END_POINT_CM 0x00204D09

    void (* BootfuncPtr)(void)=(void (*)(void)) bootmode_entry_point_cm;

    (*BootfuncPtr )();

    2.入口点 0x00204D09是否固定? 我们是否可以将其修改为我们想要的位置?

    谢谢。

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

    可以使用链接器选项 --entry_point 更改入口点。

    您能否共享您的地图文件、我想检查输入地址。

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

    您好!

    这是我的映射文件。 每次构建差异代码的入口点似乎都不是固定的。

    e2e.ti.com/.../OpenDriveLoader_5F00_FLASH_5F00_cm.txt

    您能否为 入口点建议套件地址以及--entry_point 的示例 cmd ?

    谢谢你

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

    您好、Frederick、

    为什么不使用   AIRCR 中的 SYSRESETREQ 位模拟 CM 复位? 可以使用 driverlib 函数 Interrupt_requestSystemReset。

    此致、

    Veena

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

    您好!

    我们有两个程序。

    程序1:闪存扇区中的引导加载程序0~3

    程序2:闪存  扇区中的 APP 4~13

    不止是重置 main()程序,在某些情况下:

     在引导加载程序(Program1)运行期间、我们需要跳转到 应用程序(Program2)的入口点。

    在 我们的应用程序(Program2)运行期间、我们需要跳转到引导加载程序(Program1)的入口点。

    因此、我们需要 Program1和 Program2的确切入口点。

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

    您好、Frederick、

    您能否 直接调用_c_int00()函数而不是分支到引导条目地址?

    此致、

    Veena

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

    您好、 Veena、

    我调用 了_c_int00(),但它仍然进入 defaultISR ()和无限循环。

    c_int00 ()函数指针位于地址0x0020af59。

    它与映射文件"入口点符号:"_c_int00_noargs" 地址:0020af59"匹配

    它是一个奇数地址、它是正常的吗?

    但是、在内存浏览器上、它位于 0020af58。

    此致、

    弗雷德里克

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

    您好、 Veena、

    此外,我按照 论坛跳转至地址0x200001,但它仍然进入 defaultISR()。

    此致、

    弗雷德里克

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

    您好、Frederick、

    我尝试直接从 main 调用_c_int00 ()、它能够分支到 c_int00并返回到 main 函数。 我尝试了 RAM 配置和闪存配置。

    您能否共享项目中使用的编译选项?

    此致、

    Veena

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

    您好、 Veena、

    这些是我的项目设置文件。

    CCS:v9.3.0.00012  

    C2000ware:3.2.0

    请帮我检查。 谢谢你。

    e2e.ti.com/.../3542.cproject.txt

    e2e.ti.com/.../7801.ccsproject.txt

    e2e.ti.com/.../0702.project.txt

    此致、

    弗雷德里克

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

    您好、Frederick、

    对于这些 CCS 文件、我添加了一个 cmd 文件 startup_cm.c 和一个纯主函数、该主函数只调用_c_int00 ();但我看到它分支到 _c_int00并返回到 main。

    您能否单步执行代码并查看它是否是导致故障的分支指令?

    这是我的主函数:

    void main()

    asm (" B $");
    c_int00();
    asm (" B $");

    汇编指令" bl _c_int00_noinit_noargs"正确分支到函数。

    此致、

    Veena

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

    您好、 Veena、

    我添加 了 asm (" B $")、它不会进入 faultIsr 或 defaultIsr()。

    但是 propram 只会停在  asm 的前一行(" B $")、而不会重新启动 main()。

    您能告诉我您使用的 C2000Ware 和 CCS 版本,并给我 您的 cmd 文件和 startup_cm.c。

    此致、

    弗雷德里克

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

    您好、 Veena、

    我使用了 C2000Ware 中的示例,它成功地重新启动 main()。

    我发现我的项目因链接 driverlib_cm.lib 而丢失。 在我添加到链接 driverlib_cm.lib 之后、我可以 成功重新启动 main()。

    这两种方法 都是成功的:

    1.调用_c_int00();

    2.跳转至 0x00200001。

    所以、我认为我的问题已经解决了。

    但是、如果我丢失了链接 driverlib_cm.lib、为什么没有链接错误?

    这会导致故障排除变得困难。

    此致、

    弗雷德里克

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

    您好、Frederick、

    asm (" B $")只是对自身语句的分支。 我添加了它、以确保它在复位后卡在那里并返回到 main。  

    我不确定为什么您没有收到任何 driverlib.lib 的链接问题。 如果编译器找到未定义的函数、则会报告错误。 有许多函数是内联定义的。 要使用这些内联函数、不需要链接库。 是否确实使用了非内联函数、但在没有.lib 的情况下仍然能够无错误地构建该函数?

    它可能是 startup_cm 文件的链接问题。 您在这里不会遇到任何链接错误、因为此处定义的所有函数都不会被应用显式调用。 但需要在地址正确加载这些内容。

    此致、

    Veena