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.

[参考译文] MSP430F5529:在调试时、分支至间接地址使用20位用于 MSP430x

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1271014/msp430f5529-branch-to-indirect-address-uses-20-bits-for-msp430x-when-debugging

器件型号:MSP430F5529

您好! 对于我的应用、我将尝试跳回 存储在复位矢量0xFFFE 中的地址。 我将`asm ("  branch &0xFFFE")`执行此操作。 在正常操作中、这似乎可以正常工作、但如果我在指令之前暂停执行并尝试逐步执行(就像我尝试验证它是否有效时那样)、PC 始终 在_reset_vector 处加载20位而不是16位的内存。 即使我跳过仿真指令并直接使用`MOV.W`、情况也是如此。  例如、使用下面的存储器、我希望 PC 加载0x06EAE、但加载的是0xF6EAE。 这仅在我在分支指令处或刚好在分支指令之前暂停执行时发生。 如果我只是简单地连接到调试器并从 main 开始运行、就没有问题。 这不是我第一次被这种行为烧毁,我在这里缺少什么吗? 为什么即使使用小代码模型、分支指令也会加载20位 PC?

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

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

    使用`asm volatile`似乎可以解析 this....no的原因。 希望能有一些见解。

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

    您好、Jacob:

    修复此问题的 volatile 关键字指出、编译器可能是问题的根源。 您正在使用哪个编译器/IDE?  

    如果是 CCS、您是否可以在调试时转到"View"->"Disassembly"、然后查看两种情况下的实际汇编指令?  

    此致、
    布兰登·费舍尔

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

    我没有看到"分支"助记符。 仅限"BR"和"BRA"。 第一个字符总是清除高4位、而"BRA"是扩展版本。

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

    《MSP430x5xx 用户指南》的第6.6.2.8节的标题为"BR、branch"、适用于作为助记符的其他操作码。 我把这理解为"BR"或"branch"将会"分支到低64k 地址空间中的目标"。 我相信我尝试了全部三个"BR""BRA"和"branch",并得到了相同的结果。

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

    我使用 CCS。 在不使用 Volatile 的情况下调试时、它会显示`BR &_RESET_VECTOR `及操作码` 0x0200 0xFFFE`。 使用 Volatile、它是相同的助记符、但操作码`0x4210 0xFFFE`

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

    从零开始的操作码(例如0x0200)为 MOVA 指令、因此为20位。 以4开始的值为 MOV。

    为什么使用 Volatile 会改变我不知道的事情。 借助 GNU 编译器、它禁用了一些可能会导致问题的优化。 docs 说出来

    我使用 GCC 尝试了它并检查了输出。 分支与之不符、BR 生成了 MOV 和 BRA MOVA。 都无需易失性标签。

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

    在我看来、这只是与编译器优化此代码的方式相关的细微差别。 我会看看我们的工具团队能否发表评论。

    我不一定希望编译器优化内联汇编语句(除非确定它们无法访问)、但这里我的预期可能不正确。  

    此致、
    布兰登·费舍尔

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

    有关包含 Problem asm 语句的源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。  创建预处理文件后、添加一条注释、以该文件工作的形式显示 asm 语句、即使用 volatile。

    谢谢。此致、

    -乔治