S-functionコードで意図通りの動作をしない。
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
■事象
① 関数の引数を参照するかマジックナンバー等を参照するかで出力結果が変わる
② 乗算の有無(無:コメントアウト)で出力結果が変わる
■解決策
mexコンパイルで"-g(最適化無効)"をオプションを指定したところ意図通りの動きになる。
■詳細
① 関数の引数を参照するかマジックナンバー等を参照するかで出力結果が変わる
サンプルコードのBand()関数相当。(★Point 1のコメント箇所)
関数の戻り値は0.0 (trueルート) or 引数でで与えたそのままの値 (falseルート)という処理。
num < max && num > minがtrue場合のみprintfが出力されるはずだが、出力されない。ただ、値は"0.0"に変更されている。
② 乗算の有無(無:コメントアウト)で出力結果が変わる
サンプルコードの"spd = gain * spd;"の箇所(★Point 2のコメント箇所)。
spdが更新されない。
gainをマジックナンバーに
ローカル変数同士の乗算処理であるが、処理の有無(無:コメントアウト)で出力結果に変化がある。
■サンプルコード
static double g_min_A = -10.0;
static double g_max_A = 10.0;
static double g_min_B = -10.0;
static double g_max_B = 10.0;
static double g_gain_A = 1.0;
static double g_gain_B = 1.0;
static struct Table tbl;
static double Band(double num, double max, double min);
void main(void)
{
double angle,spd,min,max;
volatile double gain=2.0;
if (tbl.sts != A) {
//~ いろいろな処理 ~
if (tbl.sts == B) {
min = g_min_A;
max = g_max_A;
gain = g_gain_A;
} else {
min = g_min_B;
max = g_max_B;
gain = g_gain_B;
}
//~ "angle" の算出 ~
// ★point 1
angle = Band(angle, min, max);
~ "spd" の算出 ~
// ★point 2
spd = gain * spd;
}
else {
//~ いろいろな処理 ~
}
//~ いろいろな処理 ~
return;
}
static double Band(double num, double max, double min) {
double out;
if (num < max && num > min) {
printf("override:%lf\n", num);
out = 0.0;
}
else{
out = num;
}
return out;
}
■環境
MATLAB R2021b version 10.4 May14, 2021
MATLAB Support for MinGW-w64 C/C++ Compiler バージョン21.2.0
Simulink Desktop Real-Time バージョン 5.13
0 Kommentare
Antworten (0)
Siehe auch
Kategorien
Mehr zu Parallel Computing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!