【发布时间】:2021-11-29 20:00:36
【问题描述】:
所以我在一个使用 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 并最终得到相同的结果。我不知道我可能做错了什么,因为这个功能太基础了。
【问题讨论】:
-
这个 MIPS 有分支延迟槽吗?您可以尝试在
bne之后添加nop。 -
您是否在调试器(或模拟器)中单步执行代码以查看寄存器中的值?并查看执行的确切路径,包括可能的分支延迟槽,以防万一你认为 AbortSwitch 正在运行。 (如果 xc32 是 MIPS32r6,您可以使用新的 no-branch-delay 分支指令。)