ホーム > ユー ザーサポート > FAQ カバレッジマスターwinAMS
【質問】
マイコンが ARM
Cortex系の場合で、テスト対象関数から関数ポインタ経由でコールされる子関数に対して、テストCSVファイルに関数名を設定しています。
シミュレーションを実行すると、設定した子関数がコールされますが、子関数内でシミュレーションエラーが発生したり、
子関数からテスト対象関数に戻らず、シミュレーションが正しく実行できません。どのような原因が考えられるでしょうか?
【回答】
子関数がBLX/BX命令でコールされている場合は、インターワーキングが発生します。インターワーキングが発生する場
合は、実行する関数のモード(ARM/Thumb)に応じて、ジャンプ先の最下位ビットを正しく設定する必要がありま す。
ARMモードでコンパイルされている関数をコールする場合は、最下位ビットを0、Thumbコードでコンパイルされて いる関数をコールする場合は、最下位ビットを1に設定してください。
※プログラムカウンタに設定される値は、最下位ビットが0にマスクされます。
■ソースコードイメージ
// source1.c (ARM モードでコンパイルされていると仮定)
int add(int num1, int num2) {
return ( num1 + num2 );
}
// source2.c (Thumb モードでコンパイルされていると仮定)
int sub(int num1, int num2) {
return ( num1 - num2 );
}
int (*pfunc[2]) (int num1, int num2);
int test_func(int num1, int num2){
int ret;
ret = 0;
ret = ret + (*pfunc[0])(num1, num2);
ret = ret + (*pfunc[1])(num1, num2);
return ret;
}
■テストデータイメージ #COMMENT|@num1|@num2|pfunc[0]| pfunc[1]|@@test_func
--------+-----+-----+--------+---------+-----------
| 1| 1| add| sub+1| 2
(参考:ARM社WEBページ) 5.3.1. Thumb 状態の関数へのポインタ