我有一个 mplabx 项目,其中包含 PIC32MX795F512L 的自定义引导加载程序和应用程序。在整个开发过程中,我一直从引导加载程序跳转到应用程序,使用以下行没有问题:
((void (*)(void))(APPLICATION_RESET_ADDRESS))();
whereAPPLICATION_RESET_ADDRESS
是一个宏,其中包含我的应用程序的重置处理程序的地址。在最近对引导加载程序进行了一些修改之后,我突然在执行该行之后和进入应用程序功能之前的某个时间开始进入通用异常处理main
程序。奇怪的是,如果我在该行上设置一个断点,然后在中断后继续它工作正常。此外,如果我将跳转到应用程序的方式更改为:
asm volatile
(
"JALR %0"
:
:"r"(APPLICATION_RESET_ADDRESS)
:
);
它毫无问题地跳转到应用程序,这真的很令人困惑,因为生成的程序集是((void (*)(void))(APPLICATION_RESET_ADDRESS))();
:
LUI v0,-25341
ADDIU V0, V0, -28672
JALR V0
NOP
和生成的程序集:
asm volatile
(
"JALR %0"
:
:"r"(APPLICATION_RESET_ADDRESS)
:
);
是
LUI V0, -25342
ORI V0, V0, -28672
JALR V0
NOP
所以这两种方法都使用相同数量的指令,并且都使用 JALR 跳转,两者之间的唯一区别是它们如何将指针加载到寄存器中。有人有什么想法吗?