この責任は呼び出し側にあるとする。飽和処理はこの関数が責任を持つ。offset_value){なるべく呼び出し元の責任が減るように関数内で判断するのが良いのですが、組み込みだとそうもいかないこともあると思いますので、責任関連は絶対残してください。コメントを書かない様にするソースコード中に現れるコメントは大別すると以下の3つしかありません。有害なコメントいずれ有害になるコメントソースコードとしては意味のないコメント従って、書いても良いコメントは無害な「ソースコードとしては意味のないコメント」だけです。以下のようなコメントは書いても良いです。私を探さないでください。*/その他のコメントは有害なので、極力書かないことをお勧めします。有害とはどういうことか?それは、コメントに書いてあることと、実際のコードが異なっている状態を指します。先ほどの例を再度挙げてみましょう。MODULE0の結果転送先を~~に切り替え。MODULE0をイネーブル。割り込みOnこの時点ではまだ有害ではありません。仕様が変わり、Event出力をoffにしました。MODULE0の結果転送先を~~に切り替え。MODULE0をイネーブル。割り込みOnこの瞬間、コメントが有害化しました。Event出力をしなくなったはずなのに、コメントは修正されず、「Event出力あり」となっています。これ、コンパイルエラーにはならないので、結構直すの忘れるんですよね。生ものは冷蔵庫に放っておくのではなく、すぐに食べるなりして残さない、もしくは完全に凍結してしまうかのどちらか以外扱い方はありません。コメントは生ものです。コメントは残さない、もしくはソースコードを二度と弄らない凍結状態とすることが鉄則です。コメントに頼らなくても、わかりやすく、「読めるコード」を書くことを心がけましょう。変数名がa,b,c,dなんかだったりして、コメントがなくて読めるでしょうか?関数名がhogeだったりして、何の関数なのか分かるでしょうか?何百行もひたすら、一つの関数のコードだけ書いてあって、果たして全体が把握できるでしょうか?コメントに頼らず、読みやすいコードを書こうとすると、自然と構造がわかりやすいプログラムになっていきます。読めるコード、「リーダブルコード」というキーワードを頭の片隅に置いておいてください。マジックナンバーを消すのもリーダブルコードの一つですね。カレーは飲み物、コードは読み物です。繰り返し出てくる処理は関数にまとめる組み込みではないのですが、サブルーチンも使わずひたすら同じ事をコピペによって繰り返すコードを見たことがあります。なんでサブルーチンにしないのか?と聞いてみたら、サブルーチンにするより、コピペの方が簡単だし、安心だからとの返答をいただいた。残念ですが、私には何を言っているのか理解できませんでした。コピペコードの修正し忘れによるバグの発生はよくありますし、そもそもコピペコードがバグってたときは悲惨で、あちこちに散乱したコピペコードを全て修正する必要があります。考えても一カ所にまとめて管理した方が安全です。バグってた場合はその一カ所だけ直せば良いのですから。次に、コピペでない場合でも、ひたすら処理が何百行と続いているコードよりも、関数で適切に区切りがあるコードの方が読みやすいです。これに対しては、あちこちに処理が散らばるよりも、一カ所の関数だけで書いてある方が読みやすいと言われたことがあります。関数で区切ることは、文章で言えば、漢字や句読点、章立てと同じです。なんぜんぺーじもあるほんがかんじもくとうてんもつかわずましてやもくじもないばあいをかんがえてみてくださいあなたはそのほんをさいごまでよみとおすことができますかわたしはこのぶんしょうですらたぶんあしたにはよめませんまた、長すぎるコードはテストが大変です。問題がどこにあるのかの切り分けが難しいのです。(組み込みでのテストの作り方は私は詳しくないので突っ込みませんが.........)関数は10~100行ぐらいにまとめると良いと思います。あとは、ファイルスコープなどを駆使して、グローバル変数が見える範囲とかも最小限にするなど.........まぁ、これはいいや.........。マクロを使って、同じ内容を繰り返し書かない様にするマイコンでは、各モジュールの設定手順は、変数名レベルでほとんど同じって事がよくあります。=1111;B0PROP2=2222;B0PROP3=3333;こういう場合はマクロでさっくりまとめられます。p3;//モジュールAの0の設定SetModuleProps(A,0,11,22,33);//モジュールAの1の設定SetModuleProps(A,1,111,222,333);//モジュールBの0の設定SetModuleProps(B,0,1111,2222,3333);マクロは関数ではなく、ソースコード文字列の置換なので、これら二つのコードは全く同じコードです。参考:プリプロセッサ#と##演算子マクロは使わないマクロは定数マクロ以外使わないでください。10」の様に定数に名前を付けるマクロです。)次のように、ほとんど書いている内容が同じだからと言うことで、マクロを使ってまとめるアホがいますが、お勧めは出来ません。p3;//モジュールAの0の設定SetModuleProps(A,0,11,22,33);//モジュールAの1の設定SetModuleProps(A,1,111,222,333);//モジュールBの0の設定SetModuleProps(B,0,1111,2222,3333);このように書くぐらいなら、下手なことをせず、以下のように書きましょう。=1111;B0PROP2=2222;B0PROP3=3333;なぜなら、これら二つのコードは等価ではありません。.........ん?同じじゃないかって?これね、ブレークポイントが非常に扱いにくいんですよ。マクロを展開すると、以下のようになるから、A0PROP2の所にブレークをおきたくても、エディタ上からは設定できなくて、直にブレークするアドレス探して設定するなんて手間がかかる。=1111;B0PROP2=2222;B0PROP3=3333;コンパイラやデバッガが頑張ってくれて、A0PROP2,A2PROP2,B0PROP2の場所にブレークポイントを設置できる場合があったとしても残念なことになる。マイコンなんてしょぼいデバイスは大概ブレークポイントも一、二個しかおけないから、今回のように3箇所に展開されてしまうと、どうもならない。その他の理由としてはマクロは難しいし、色々面倒くさいという理由もあります。C++ではプリプロセッサ界は魔界と呼ばれております。触らぬ神にたたりなし。不必要に関わらないようにしましょう。ローカル変数は書き換えない、使い回さない状態が変化するものを完璧に把握し、完璧にプログラムを組み上げるのは中々難しいものです。「AならばB」という明快なプログラムは、ミスしにくいです。「AならばBが基本だけど、状態によってはCで、まれにDとかEにする」ってなると、一気にバグが入り込みやすくなります。本当は「状態に依存しないプログラムを書くことを心がける」と書きたかったのです。......、組み込みで状態に依存しないプログラムなんて不可能です。基本的にほとんど全ての処理が状態に依存しまくりですよね。状態の変化は諦めるとしても、ローカル変数を書き換えない、使い回さないという意識は出来るとおもいます。何カ所にも渡って変数が書き換えられると、その都度、変数の意味を再解釈しなくてはなりません。どこで変化し、どのような意味を持つのかを、全て把握するのは大変です。この変数はここから先で使わないから、再利用しようと変数を初期化したものの、後で前の結果が必要になることもあります。そのコードを書く頃には、変数を初期化したなんて忘れててバグった.........、なんてもうよくありがちですね。ローカル変数の再利用は、変数を定義するのが面倒だったのかも知れません。後々、もっと大きな面倒を運んできてしまいます。面倒だったのではなく、メモリの使用量の最適化だったのかも知れませんが、それは早すぎる最適化です。ローカル変数の値は一度決定したら、書き換えないことは徹底しましょう。a){//実はここのtempはtemp=0されてることを忘れてる...}まとめ数値には名前を付けましょう。ビット単位で区切るとなお良しコメントをちゃんと書きましょう。明日には分からなくなりますコメントを書いてはいけません。明日には腐ります関数で小さく意味の単位に分けましょうマクロを使って処理をまとめましょうマクロは地雷踏む可能性高いので使うのは止めましょう状態が変わらないほどバグりにくいです。ローカル変数だけでも変化しないようにしましょう最適化は重要だけど、最後の手段。早すぎる最適化は駄目です綺麗なコードを書いて苦しい組み込みライフを楽しんでください。17:52関連記事2019-06-03組み込み屋こそC++を使うべきなのですやーやーやー。CDTの言語パーサー作った2011-04-20パッケージ外では実装できないインターフェースがあったらなぁインターフェースが無修飾関数を宣言できない点はJAVAのいけて...2011-02-21いつかこうなったらいいなぁ...コメントを残してきて、ふと思ったのでメモ。»プロフィールJavaで画像AI屋だったハズが、気がついたら制御論理やってて、Eclipse開発してて、組み込み屋で、CortexM4周りの開発してて、VerilogでRTL書いてて、STAしてて、色んな小さいインフラ管理してる、何でも屋。働きたくないでござる。(14)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。