前提・実現したいこと
- Arduino
- if文を簡潔にして処理速度を向上させたい。それによって低消費電力にしたい。
発生している問題・エラーメッセージ
- ifが長すぎる
該当のソースコード
c++
1 int alarm_h = 6; 2 int alarm_m = 30; 3 int value = analogRead( A0 ); 4 int resistance = 1023 - value; 5 6 if (resistance <= 128) { 7 alarm_h = 6; 8 alarm_m = 0; 9 } else if (resistance <= 256) { 10 alarm_h = 6; 11 alarm_m = 30; 12 } else if (resistance <= 384) { 13 alarm_h = 6; 14 alarm_m = 45; 15 } else if (resistance <= 512) { 16 alarm_h = 7; 17 alarm_m = 0; 18 } else if (resistance <= 768) { 19 alarm_h = 7; 20 alarm_m = 30; 21 } else if (resistance <= 896) { 22 alarm_h = 8; 23 alarm_m = 0; 24 } else if (resistance <= 1023) { 25 alarm_h = 8; 26 alarm_m = 30; 27 }
試したこと
- swich文で記述する方法を検討した。
既にスリープは使っております。
補足情報(FW/ツールのバージョンなど)
Arduinoです。
alarm_h,alarm_mにA0の値に応じて代入しています。
C# は関係ないのではないでしょうか。
C# のタグは外してください。タグで探して見ている人にはノイズになって迷惑です。
あわわわわ、すみません
間違って付いていましたぁぁ
低消費電力を考慮するなら、変にコード弄り回すより適切なスリープを入れたりといった事を考えるべきだと思いますが。
既にスリープは使っております。
その結果27μAまで消費電力は落ちました。
情報漏れ申し訳ない
エスパーじゃないので書いてない事までは判らんです。
既にやった事などは質問文に追記しといてください。
こういう if~elseif~ ... の羅列のコンパイル結果がどのようになるのか全く知らないど素人ですが,
仮に「実際上の resistance のとる値の頻度に結構な差がある」ような場合,ifの順序を変えると平均的に速度が向上する(条件判定回数が減る)なんてことは無いのでしょうか?
または,2分探索みたく「最初に512の上下で分けて…」という形にすると平均的にマシになるとか.
頻度はかなりランダムですね。
2分探索って手段良さげですね。
ぇ、これって回答に書かなくても大丈夫ですか?
自分は全然良いんですけど、、、
(そうですね,こういう話は他の有識者からのご指摘等もあり得るかもしれないので,同内容を回答として書いておきます)
switch文で最適化を期待するなら、caseの数値が連続するような値にすると、テーブル作ってジャンプするようなコードができると思いますが、どのようにswitch文を検討しましたか?
