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.

[参考译文] TMS570LS1227:意外的_copyAPI2RAM_汇编函数行为

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1653805/tms570ls1227-unexpected-_copyapi2ram_-assembly-function-behavior

器件型号: TMS570LS1227

我们正在开发一款使用引导加载程序+应用程序的产品。   

我们引用了 (SPNA186) SafetyMCUBootloader 代码、其中 sys_core.asm 文件包含 名为_copyAPI2RAM_的汇编函数。  

 

我们多年来一直成功使用该闪存、但最近对写入 RAM 的闪存进行了一些微小的修改、并一直遇到持续的未定义中止。   

 

经过一些调试后、我们认为我们已经确定了问题-_copyAPI2RAM_函数在函数开始处定义了 3 个常量、在执行期间、这些常量在到达真实指令(即复制循环等)之前被视为指令。  我们的修改更改了要写入闪存的字节大小、随后更改 了 所表示大小的视在汇编指令。   

 

根据我们得出的结果、解决方案是将这 3 个常量 (FLASH_LOAD、FLASH_RUN 和 FLASH_SIZE) 的定义移动到函数末尾。   

 

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

    尊敬的 Jacob:

    感谢您提前通知我们。

    这似乎是  ARM 汇编所固有的字面池放置问题。 当在函数开头定义内联常量时、ARM Cortex-R4 处理器的流水线获取并尝试将这些常量值作为操作码执行。 以前、闪存大小的特定字节值恰好解码为良性或可剥离指令。 更改闪存大小后、新的常量值会解码为未定义的指令、从而触发未定义中止

    在 函数的 return 指令之后移动常量可确保:

    1. 在正常执行流程中、处理器永远不会到达它们
    2. ldr 引用这些常量的指令使用 PC 相对偏移量将它们读取为 数据、而不是作为代码执行

    我将再次进行验证、并为此采取适当的措施。

    --
    此致、
    Jagadish。