【发布时间】:2019-05-28 14:13:10
【问题描述】:
我正在为 Cortex M4 设备编写闪存加载程序,我想使用断点指令的立即值“返回”驱动 PC 应用程序的值。
虽然对立即数进行硬编码可以正常工作:
__asm("bkpt 0x70");
__asm("bkpt %0" : : "i" (0x70));
只要我想“返回”一些依赖于运行时的东西,比如
uint8_t status = Flash_EraseAll();
__asm("bkpt %0" : : "i" (status));
编译失败
错误[Ta090]:立即操作数不是常数
我尝试使用具有不同连接设置的预处理器宏,但无济于事。
有没有人知道如何将运行时相关状态标志作为即时输入到 IAR 中的 __asm() 块中?根据我阅读 here 的内容,这并不完全可能,但可能有一个聪明的 hacky 方法来做到这一点。
P.S.:是的,作为一种解决方法,我可以使用 switch 语句来列出并硬编码每个可能的状态,但这很丑而且很长。
【问题讨论】:
-
当您在第一个 ASM 语句中修改
sp时,您的解决方案是不安全的。sp的push、断点和恢复必须在同一个asm语句中。 -
@TimothyBaldwin 这可能解释了我遇到的一些奇怪行为。在我修改我的编辑之前,您能否详细说明这究竟是如何不安全的?设备/堆栈工作案例会发生什么?我必须添加 __("bkpt 0x0");是我的代码的最后一条语句
-
发布您的答案作为答案,人们可以对其进行投票。不要通过将其编辑到问题中来赋予它特殊状态。如果它比(半途而废的)现有答案更好,您可以接受自己的答案。
-
@PeterCordes 感谢您的提示,我修改了线程。
标签: c breakpoints inline-assembly iar