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

2 visualizaciones (últimos 30 días)
道生 早川
道生 早川 el 6 de Dic. de 2021
■事象
 ① 関数の引数を参照するかマジックナンバー等を参照するかで出力結果が変わる
 ② 乗算の有無(無:コメントアウト)で出力結果が変わる
■解決策
 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

Respuestas (0)

Categorías

Más información sobre Parallel Computing en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!