こんにちは、
FRDM A S32K344上でユーザーApp 1からユーザーApp 2へのカスタムジャンプをテストしています
app1とapp2のリンカーファイルは以下に添付されています。
#define APP_START_ADDRESS 0x00500000
void Bootup_Application ( const uint32_t app_StarAddress)
{
uint32_t appEntry、appStack;
static void (*jump_to_application)( void );
/* アプリケーションの初期スタックポインタ値を取得 */
appStack = *(( uint32_t *)(app_StarAddress));
/* アプリケーションのリセットハンドラー(エントリポイント)アドレスを取得する */
appEntry = *(( uint32_t *)(app_StarAddress + 4));
/* アプリケーションのエントリアドレスを関数ポインタに割り当てる */
jump_to_application = ( void (*)( void ))appEntry;
/* 割り込みベクターテーブルをアプリケーションに再配置する */
S32_SCB-> VTOR = ( uint32_t )app_StarAddress;
/* グローバル割り込みを無効にする (ASM_KEYWORD(" cpsid i");) */
__asm volatile ( " cpsid i" : : : "memory" );
/* メインスタックポインタ (MSP) を設定します */
__asm volatile ( "MSR msp , %0\n" : : "r" (appStack) : "memory" );
/* プロセススタックポインタ(PSP)を設定します */
__asm volatile ( "MSR psp , %0\n" : : "r" (appStack) : "memory" );
/* アプリケーションへジャンプ */
jump_to_application();
( 1)
{
/* ここに到達した場合は、エラーが発生したことを示します */
Siul2_Dio_Ip_WritePin(LED_RED_PORT, LED_RED_PIN, 1U);
}
}
Bootup_Application funcがapp2に確実にジャンプできるか確認してもらえますか?他に何か必要な手順があれば、お知らせください。
こんにちは、 @ganavi1さん
原則としては、問題はないと思います。ただ、グローバル割り込みを無効にするだけでは不十分な場合がある。私はいつも、使用済みのペリフェラルはすべて初期化解除することをおすすめします。すべての割り込みは、周辺レジスタを通じてローカルでも無効化されているか確認してください。これにより、App2でグローバル割り込みが有効化された後に再び割り込みがトリガーされないようにしてください。
よろしくお願いいたします。
ルーカス