PIC32MX795F512L 用のカスタム ブートローダとアプリケーションを含む mplabx プロジェクトがあります。開発中ずっと、次の行を使用して問題なくブートローダーからアプリケーションにジャンプしてきました。
((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 を使用してジャンプします。2 つの唯一の違いは、ポインタをレジスタにロードする方法です。誰かアイデアはありますか?