よくある質問(FAQ)

【ARM Cortex】テストCSVで関数ポインタに関数名を設定したとき、シミュレーションが正しく実行できません。

シミュレーションエラーの回避策について

質問

【ARM Cortex 固有】
テストCSVで関数ポインタに関数名を設定しています。テスト対象関数から「関数ポインタ」を使用して関数コールをしたときシミュレーションが正しく実行されません。エラーの発生原因は分かりますでしょうか?

回答

「ARMモード」でコンパイルされた関数から「Thumbモード」でコンパイルされた関数を「関数ポインタ」を介してコール したときの問題になります。テストCSVの「関数ポインタ」へ設定する「関数名 (アドレス) 」の設定方法に注意が必要です。

※ 注意事項
「ARMモード」でコンパイルされた関数から「Thumbモード」でコンパイルされた関数をコールするとき は、「関数ポインタ」へ設定する「関数アドレス」の最下位ビットが"1" に設定されている必要があります。

最下位ビットが"0" の状態で関数コールをすると、「Thumbモード」でコンパイルされた関数が「ARMモード」で動作することになるため、コール先の関数は正しく動作しません。また、コール先の関数が2バイト境界のアドレスへ割り付けられている場合は「インターワーキングエラー」が発生します。詳細については、下の例 (画面キャプチャ) をご覧ください。

■回避策

テストCSVの関数ポインタへ設定する「関数 アドレス 」の最下位ビットを"1"に設定することで エラー回避できます。 具体的には、テストCSVの関数ポインタへ「関数名+1」を記述してください。詳細については、右側の例 (画面キャプチャ) をご覧ください。