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.

[参考译文] TMS320F28384S:CM4中的代码分支。

Guru**** 2393725 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1064129/tms320f28384s-code-branch-in-cm4

器件型号:TMS320F28384S

您好、查姆斯、

我的客户希望在 CM4中实现引导加载程序、他为引导和应用代码削减闪存。 应用代码.reshtisr 的地址为0x00210000、入口点为0x002103C5。

如果软件分支到.reshtisr、则引导代码无法分支到应用代码、如果直接分支到入口点、则启动代码运行良好。 当我们研究这个问题时、发现当我们分支到.reshtisr 时、PC 的内容为0x002103C4 (应用代码将立即分支到_c_int00_noinit_noargs )、而不是0x002103C5

我们检查.map 文件并发现 有两个不同的地址_c_int00_noinit_noargs、这个 问题似乎是由于 ARM Thumb 模式引起的、我是不是正确的? 我们应该怎么做才能使 CM4分支到应用代码.reshtisr 并 顺利执行?

部分分配映射

 输出                  属性/
段  页  原点   长度   输入段
----  --------   ------  --------
重新密封
*      0  00210000  00000006
         00210000  00000006  startup_cm.obj (.resettisr:resetISR)

text.1  0  0021017c  00000284
         0021017c  0000009c  rtsv7M4_T_le_eabi.lib:memcpy_t2.asm.obj (.text)
         00210218  00000094  app_led_blinky_cm.obj (.text:GPIO_writePin)
         002102ac  00000076  cm.obj (.text:cm_enableAllPeripherals)
         00210322  00000002  startup_cm.obj (.text:defaultISR)
         00210324  00000050  app_led_blinky_cm.obj (.text:main)
         00210374  00000008  driverlib_cm.lib:sysctl.obj (.tramp.sysctl_delay.1)
         0021037c  00000048            :sysctl.obj (.text:sysctl_enablePeripheral)
         002103c4  00000020  rtsv7M4_T_le_eabi.lib:boot_cortex_m.c.obj (.text:_c_int00_noinit_noargs:_c_int00_noinit_noargs)
         002103e4  0000001a  app_led_blinky_cm.obj (.text:GPIO_isPinValid)
         002103fe  00000002  startup_cm.obj (.text:faultISR)

全局符号:按名称按字母顺序排序

地址名称   
----   ----
002103c5  _c_int00_noinit_noargs
002105db  _system_pre_init
002105df  中止

感谢您的帮助、

Luke

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

    您好、Luke、

    主题专家因假期中断至年底而不能任职。 请在1月第一周结束前回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114524" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1064129/tms320f28384s-code-branch-in-cm4"]这个 问题似乎是由于 ARM Thumb 模式引起的、我是否正确?

    是的、对于只支持 ARM Thumb 模式的 Cortex-M、必须将分支地址中的最低有效位设置为设置 Thumb 模式。

    [引用 userid="114524" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1064129/tms320f28384s-code-branch-in-cm4"]如果软件到.tisrr、则引导代码无法分支到应用代码、如果软件直接分支到.tisr/分支点、则引导代码运行良好。]

    引导代码如何分支到.reshtisr?

    以及引导代码如何获取.reshtisr 的地址? 例如、 引导代码是否具有.res尾 数的固定地址。

    TMS320F28388D:在 CM 引导加载程序中、如何分支到 RAM 入口点? 引导加载程序如何分支到固定的入口地址。

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

    切斯特、

    我们为应用代码创建一个.cmd 文件、并将.reshtisr 的地址配置为0x210000。

    存储器

       /*闪存扇区*/
       CMBANK0_RESETISR:origin = 0x00210000,length = 0x00000008 //引导至闪存入口点*/

    在引导代码中、我们使用 C 语句分支到应用代码.reshtisr。 如果我们分支到0x210000、它将无法正常工作、如果直接分支到0x2103C5、它将正常工作。

    ((void (*)()((uint32_t *) 0x210000))();

    由于  Thumb 模式、如果分支到.reshtisr、CM4似乎出错_c_int00_noinit_noargs 地址、请建议如何解决此问题(如果有)、感谢您的帮助。

    此致、

    Luke

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114524" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1064129/tms320f28384s-code-branch-in-cm4/3940759#3940759"]在引导代码中,我们使用以下 C 语句分支到应用代码./tisr]。

    尝试将 C 语句更改为以下内容:

    ((void(*)())((uint32_t *)0x210001))();

    该位转移到最低有效位设置的地址、用于指示 Thumb 模式。

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

    切斯特、

    您是对的、分支到地址0x210001可解决此问题。

    在.reertisr 中、实际上有一个汇编分支命令、将程序计数器分支到函数 _c_int00_noinit_noargs ()。 您的意思是、当我分支到最低有效位设置的地址时、CM4将了解这是 Thumb 模式、并分支到地址0x2103c5 (不是0x2103c4)?

    此致、

    Luke

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114524" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1064129/tms320f28384s-code-branch-in-cm4/3941381#3941381"]您是指当我分支到具有最低有效位的地址时,此引用将被设置为 CM4/Thumb]

    是的。 另请参阅  ARM 文档中的 Thumb 状态函数指针。

    [引用 userid="114524" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1064129/tms320f28384s-code-branch-in-cm4/3941381#3941381"]并分支到地址0x2103c5 (不是0x2103c4s[引用]

    发现 的 ARM Cortex M0/M3/M4:为什么在 StackOverflow 上、PC 始终为 Thumb 状态中的偶数 、这说明 PC 始终在最低有效位清零的情况下回读、但当您写入 PC 时、最低有效位 会加载到 EPSR T 位中。 其中 EPSR T 位指示处理器是处于 ARM 模式还是 Thumb 模式。

    这使得 Cortex-A 等其他 ARM 处理器能够支持在 ARM 或 Thumb 模式下混合调用函数的互操作。 Cortex-M 仅支持 Thumb 模式、因此 EPSR T 位必须始终置位、因为当 T 位为0时尝试执行指令会导致故障或锁定。

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

    切斯特、

    对于 Thumb 模式、我知道应该为函数指针设置最低有效位、但我没有意识到应该为分支命令设置地址 LSB。

    感谢您提供所有详细信息。

    Luke