Arduinoのスケッチ floatの乗算と除算の速度
DHT11を使った出窓の結露対策用ヒータ制御回路
このスケッチでちょい気になるところがあったので
確かめてみました。
420行目の
humi_w = d; //湿度確定(wordで)
humi_f = (float)d / 10.0; // 0.1%で
436行目の
temp_w = d; // 温度確定(wordで)
temp_f = (float)d / 10.0; // 0.1℃で
ここで整数値を1/10して0.1%あるいは0.1℃単位の
floatに湿度と温度を変換しています。
「1/10」するのに割り算を使ったわけです。
floatですので「* 0.1」という乗算でも同じ結果が
出ます。
しかし・・・実行速度が違うのでは? っと気になり
始めたのです。
整数の演算では、乗算命令のあるATmega328Pが圧倒的に
有利です。
整数の除算、16bit÷16bitでもどうしても遅くなります。
割り込み処理の中では使いたくありません。
※1/2や1/16、1/64は右シフトで割り算が
できるので高速処理になります。
さて、Arduino-UNOでのfloat、どんな具合かちょっと
確かめてみました。
こんなスケッチで
・ダウンロード - test_float1.txt
起動すると、
Num 1 2> 入力プロンプトが出ますんで、
2つの数値をスペースあるいはコンマで区切って
入力します。小数点、マイナスもOK。
例えば、
Num 1 2>234 0.1 数値を2つ入力
1つ目に2つ目を乗じた値g1と、「1/n」した2つ目で
割った値g2(結果的にnを乗じてる)を出力します。
g1:23.4000 g2:23.4000 乗算と1/nした値を除算
それをオシロスコープで見られるようにパルスを出力しました。
パルスはポートの直叩きでDigitalWriteのような遅延はありません。
この値だと、こんな具合。
乗算が10μS弱、除算が30μsちょいと約3倍の差がありました。
ということで、乗算に直せる切りの良い数字は乗算で、という
ことが処理時間の短縮につながります。
このスケッチ、1行入力した文字列から数値を分離するstrtok
の使い方あたりが何かの参考になるでしょうか。
// 1行文字受信処理
if(f_rxok){ // CR入力あり
f_rxok = 0;
n = 0;
s = strtok(rx_bff, " ,"); // 最初の文字分離
while(s != NULL){
s_in[n] = s;
s = strtok(NULL, " ,"); // 次文字分離
n++;
if(n >= 2) break; // 2文字まで
}
if(n >= 2){ // 2文字ok ?
// 文字→floatへ
:
分離した文字列は、文字列をコピーするのではなく、「nul」終端
され分離された元文字列の先頭アドレスをポインタとして記録し
ています。
| 固定リンク
「Arduino」カテゴリの記事
- 初めて買ったArduino UNO・・・今は(2023.05.25)
- 液晶表示コントローラ HD44780で迎撃(2023.05.16)
- Arduino UNOで3相モーターを回す(2023.05.01)
- Arduino サーミスタを使った温度測定で 【ゼロ除算問題】(2023.03.23)
- A/Dコンバータでサーミスタの抵抗値を読む サーミスタをつなぐ場所は?(2023.03.21)
コメント