« DHT11を使った出窓の結露対策用ヒータ制御回路 | トップページ | ひさしぶりのイベントだったけど・・・「ピコピコ・スイッチ」破損 »

2021年12月11日 (土)

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のような遅延はありません。
この値だと、こんな具合。
Aa11_20211211154701

乗算が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」終端
され分離された元文字列の先頭アドレスをポインタとして記録し
ています。

|

« DHT11を使った出窓の結露対策用ヒータ制御回路 | トップページ | ひさしぶりのイベントだったけど・・・「ピコピコ・スイッチ」破損 »

Arduino」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« DHT11を使った出窓の結露対策用ヒータ制御回路 | トップページ | ひさしぶりのイベントだったけど・・・「ピコピコ・スイッチ」破損 »