S-function​コードで意図通りの動​作をしない。

2 次查看(过去 30 天)
道生 早川
道生 早川 2021-12-6
■事象
 ① 関数の引数を参照するかマジックナンバー等を参照するかで出力結果が変わる
 ② 乗算の有無(無:コメントアウト)で出力結果が変わる
■解決策
 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 个)

类别

Help CenterFile Exchange 中查找有关 Parallel Computing 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!