因此,我在使用 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
并最终得到相同的结果。我不知道我可能做错了什么,因为这个功能是如此基本。