3

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 つの唯一の違いは、ポインタをレジスタにロードする方法です。誰かアイデアはありますか?

4

2 に答える 2

2

あなたがすでにこのケースをカバーしているかどうかはわかりません。ただし、発生している可能性のある問題の 1 つは、アプリケーションにジャンプしているときに割り込みを実行している可能性があるという事実です。Microchip はPIC 32 ブートローダに関するアプリケーション ノート - AN1388でこの状況を明示的にカバーしていませんが、割り込みが発生し、スタートアップ コードをアプリケーション - これの多くは、スタートアップ コードのセットアップ方法によって異なります。

アプリケーションにジャンプする前に、割り込みを無効にすることを常にお勧めします。

マイクロチップのAN1388 ソース コードを見ると、アプリケーションにジャンプする前に割り込みが無効になっていることがわかります。以下は、私自身のコメントを含むコードです。

//Enter firmware upgrade mode if there is a trigger or if the
//application is not valid.
if(CheckTrigger() || !ValidAppPresent())
{
    TRANS_LAYER_Init(pbClk);  //  Init the transport layer...
                              //Interrupts are enabled during
                              //this function.
    while(!FRAMEWORK_ExitFirmwareUpgradeMode())
    {
        /* Keep receiving commands from the PC */
        ...
    }

    TRANS_LAYER_Close();  //   This is just a wrapper that
                          //makes a call to a function which
                          //disables all interrupts.
}

JumpToApp();  //Similar to your function.

うまくいけば、これはあなたに見る場所を与えるでしょう。ジャンプの呼び出し方法に問題はありません。

于 2014-07-29T20:40:07.160 に答える