S-functionコードで意図通りの動作をしない。
2 次查看(过去 30 天)
显示 更早的评论
■事象
① 関数の引数を参照するかマジックナンバー等を参照するかで出力結果が変わる
② 乗算の有無(無:コメントアウト)で出力結果が変わる
■解決策
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 个评论
回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!