わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

組込み現場のCプログラミング

組込みC言語本は,組込みソフトウェア開発向けコーディング作法ガイド[C言語版] (SEC BOOKS)以来です.
全体として良書だと思います.当学科の学生にも,Cの文法を終えより高度なプログラミングを学んでいく2年生,ハードウェア絡みのプログラムを作る3年生,研究室でCに限らず人(先生・先輩など)と連携してプログラムを作っていくことになる4年生・院生のいずれにも,勧められる本です.授業では課題に沿ってプログラムを作るだけで手一杯かもしれませんが,こういう本を読んで,「今どこに力を入れれば,後で無駄な力を入れずに済むか」のヒントが得られるといいですね.
本書の様々なシーンで,プログラミングは人の問題であることを確認させられます.とはいえ技術的にも,volatileやポーリングといった,(入門の)授業では教えない技法も出てきて,参考になりました.
とはいえアラ探しもしておきます.初版で,サポートページもなさそうなので.
まずp.89で,end of stringの略として用いられている「EOS」は,通常使われないでしょう.「ナル文字」です.
p.82の「符号付き整数では,右シフトで空いた符号ビットにつねに1が補充されます」は間違い.処理系定義の有名な例です(ここを読めば一発ですし,こちらにはもう少し興味深い情報もあります).
p.89にもう一つ,気になるものがありました.strcpyです.この関数の使用がまずいというわけではないのですが,全体を見て,ライブラリ関数使用の是非に関する情報がありません*1.そこで,もし標準的なライブラリを使用していいとなると,p.255で,long intのポインタ変数とループを組み合わせて,バッファの初期化resetをしていますが,ここでmemset関数を使えないか,検討しておきたいです*2
最後に,mixiで教わった情報を,手短に紹介しておきます.p.271で,tb0flagの値を変更する文が2箇所ありますが,プログラムの応用次第,そして割り込みの入り方次第で,不具合が起こり得ます.こういうときは,フラグを立てる代わりにそのグローバル変数の値を1増やすことにし,もう一方は参照のみを行い「値が変わったか*3」を検査するのが定石とのこと.

*1:ライブラリ関数を使わないプログラム例や,プログラミングでやっていいこと・悪いことは,C言語を256倍使うための本で学んだものでした.

*2:ただし,memsetANSIでは載っていない関数なのですね….

*3:前の値を保存する変数を別途用意しておきます.