1

因此,我在使用 XC32 的 MPLABX 项目中编译了以下代码,目的是检查是否需要更改 RTOS 实现的上下文:

    .extern OS_TaskRUNNING, 0x04 # Both of these are pointers in a C file
    .extern OS_TaskNEW, 0x04

CheckSwitch:
    la $1, OS_TaskRUNNING
    la $2, OS_TaskNEW
    lw $1, 0x00($1)
    lw $2, 0x00($2)
    xor $1, $1, $2
    bne $1, $0, ConfirmSwitch
AbortSwitch:
    # stuff happens...
ConfirmSwitch:
    # stuff happens...

当两个指针中的值不同时,程序执行将无法分支到 ConfirmSwitch,而是继续执行 AbortSwitch(注意非常细心的人:我在此文件中的代码中使用了“noat”设置)。无论价值以 1 美元和 2 美元结束,分支永远不会发生。我尝试了其他变体,例如bne $1, $2, ConfirmSwitch并最终得到相同的结果。我不知道我可能做错了什么,因为这个功能是如此基本。

4

1 回答 1

1

根据下面的评论弄清楚了;在每个分支指令后添加一个 nop 解决了这个问题。在模拟器中,无论分支条件是否为真,执行都会转到 nop,但随后会转到正确的位置。顺便说一句,我还使用了“noreorder”指令来阻止汇编程序重新组织我的代码。XC32 汇编器手册在提到上述指令时讨论了分支延迟槽:“默认情况下,汇编器尝试通过重新排序周围的指令来自动填充分支或延迟槽。” 这是整个手册中唯一真正提到延迟槽的地方——没有讨论什么分支指令需要这些或它们可能需要多大。我在网上找到的许多示例代码示例来调查这个问题

于 2021-10-11T01:07:09.007 回答