我正在为 Cortex M4 设备编写闪存加载程序,我想使用断点指令的立即值“返回”驱动 PC 应用程序的值。
虽然硬编码立即效果很好:
__asm("bkpt 0x70");
__asm("bkpt %0" : : "i" (0x70));
一旦我想“返回”依赖于运行时的东西,例如
uint8_t status = Flash_EraseAll();
__asm("bkpt %0" : : "i" (status));
编译失败
Error[Ta090]: Immediate operand is not constant
我尝试使用具有不同连接设置的预处理器宏,但无济于事。
有人知道如何将运行时相关状态标志输入到 __asm()
IAR 中的 block 作为立即数?根据我读到的here ,这并不完全可能,但可能有一个聪明的 hacky 方法来做到这一点。
P.S.:是的,作为一种解决方法,我可以使用 switch 语句,在其中列出并硬编码每个可能的状态,但这只是丑陋且冗长。
最佳答案
我会将值压入堆栈,然后使用带有定义数字的 bkpt
指令,以便调试器可以在堆栈中查看此状态。
类似这样的东西(伪代码):
__asm("push %0" : : "i" (status));
__asm("bkpt %0" : : "i" (0x70));
当然,您不应该忘记事后清理堆栈。
由于 bkpt
仅使用立即数进行编码,因此您显然无法在运行时更改它,因为您必须修改代码。
关于c - IAR 汇编器 BKPT 立即数作为输入操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56344191/