WebShop>書籍・雑誌総合案内>Tech Iシリーズ>信頼性&再利用性を高めるC言語プログラミング
|
WebShop内検索(googleで本サイトを検索:別ウィンドウ)
TECH I シリーズあいまいな仕様,環境依存……つまずきやすい場所を徹底解説信頼性&再利用性を高めるC言語プログラミング
C言語は50年以上の歴史があり,組み込み機器を開発する上では現在でも主力のプログラミング言語です.バグの許されない分野でも多く使われることから,作成したプログラムに対して高い信頼性が要求されます.
そんなC言語ですが,移植性が低いという問題があります.誕生当初は移植性が高いとの触れ込みでしたが,その利用用途が拡大するにつれ,疑問の声が聞かれるようになりました.これはC言語のあいまいな言語仕様によるものです. C言語のあいまいな言語仕様の一例を以下に示します. char a; a = 200; if( a == 200 ) char型の変数に200を代入していますが,このプログラムを実行すると,マイコンや処理系(コンパイラ)によって結果が真になったり偽になったりします.詳しくは本書で解説しますが,この原因はchar型の符号の有無が言語仕様で決まっていないためです.このプログラムは,今の環境でたまたま真になっていても,移植したら偽になって正常に動作しなくなる可能性があります. そこで本書では,C言語文法の何があいまいであり,それを使用するとどのような問題が発生するのか,それをちゃんと理解していただくことを目的とし,文法のあいまいな部分を通りながら,さまざまなマイコン処理系で移植性の高いソフトウェアが開発できることを目指します. 本書の内容を理解すると,C言語の文法理解度,組み込みにおける移植性と効率向上に対する知識はプロの域に達します. それではビックリするようなC言語文法のあいまいさを思う存分,お楽しみください. 目次
あいまいな仕様,環境依存……つまずきやすい場所を徹底解説 信頼性&再利用性を高めるC言語プログラミング 第1章 整数型 1.値の範囲 整数型の値の範囲は曖昧である 2.負の値の表現形式 整数型の負の値は表現形式が規定されていない 3.代入規則 代入の規則は代入先の型で変わる 4.符号反転 符号なし整数型を符号反転すると結果は必ず最大値+1の剰余になる 5.整数の格上げ char型やshort型を使っても「整数の格上げ」でint型に拡張されてしまう 6.算術変換規則 int型の精度によって結果が変わる整数型の算術変換規則 7.整数定数 整数定数の型の割り当てと接尾子 第2章 浮動小数点型 8.内部表現 浮動小数点型には内部表現の規定がない 9.誤差 誤差により値を正確に表現できない場合がある 10.性能 浮動小数点型を高速・高効率に演算する方法はマイコンごとに異なる 11.精度 適切な精度で演算しないと性能が悪くなる 第3章 派生型 12.typedef 難しい配列やポインタはtypedefで分かりやすくなる 13.構造体 マイコンで構造体を使うときの作法とテクニック 14.共用体 共用体は適正に利用すればメモリ量の削減に効果を発揮する 15.ビット・フィールド 文法も曖昧だが…周辺機能の制御に向く 第4章 演算子 16.演算子の小括弧 演算順を決めるものとは別物!演算子の小括弧は「関数呼び出し」に使う 17.添字演算子と間接演算子 添字演算子[ ]と間接演算子*…実は全く同じ意味 18.後置インクリメント(デクリメント) 優先順位と演算タイミングを別々に考えるべし 19.キャスト演算子 実はそれほど必要ではない 20.汎用ポインタ 便利なポインタ型だが… 21.乗法演算子と加法演算子 整数型だと数学の交換法則は成り立たない 22.乗除算の仕様 C言語とマイコンとでは異なる 23.加法演算子による演算 ポインタ型と整数型の演算に使うと,演算結果はポインタ型になる 24.シフト演算子 制約とダイナミック・シフト命令の有無に注意 25.関係演算子 比較結果を利用して条件分岐を効率よく実行できる場合もある 26.等値演算子 ゼロとの比較をする場合は注意が必要 27.ビットごとの論理演算子 意外と優先順位が低い 28.論理演算子 副作用を伴う式は使用禁止 29.条件演算子 if文と使い方が異なることに注意 30.カンマ演算子 プログラムを効率的に記述できる 第5章 最適化 31.実行速度と使用メモリ量 トレードオフの関係…事前に処理系の設定も確認しよう 32.最適化 処理系が最適化で行うこと 33.最適化の抑止(1)…アクセス・サイズ アクセス・サイズを厳守する方法 34.最適化の抑止(2)…周辺機能レジスタ 周辺機能レジスタへの書き込み/読み込み処理 35.変数に対する最適化の抑止(1)…局所変数 局所変数は積極的に最適化を実施する 36.変数に対する最適化の抑止(2)…デバッグ時 変数の値が参照できないときは一時的に指定する 37.変数に対する最適化の抑止(3)…大域変数 割り込みとの絡みで指定する・しないを決定する 第6章 静的変数領域の削減 38.static記憶クラス staticには隠蔽と静的の2つの意味がある 39.大域変数に指定するstatic記憶クラス 大域変数に対して使うstatic記憶クラスは変数の破損を防ぐ隠蔽の意味を持つ 40.局所変数に指定するstatic記憶クラス 局所変数に対して使うstatic記憶クラスは静的の意味で使う 41.動的変数と静的変数の違い 番地,初期値の設定タイミング,初期状態をプログラムで見てみる 42.初期値の有無 静的変数の取り扱いは初期値の有無で変わる 43.削減方法(1)…初期値がゼロの場合 初期値がゼロなら記述しない 44.削減方法(2)…初期値がある場合 初期値が必要なら記述する 45.削減方法(3)…初期値を変更しない場合 const型修飾子を指定する 第7章 スタック・サイズの算出 46.スタック領域の確保 処理系によって適当に確保される 47.スタック領域の使われ方 関数呼び出し時にどのように使われるのか見てみる 48.スタック・サイズの計算方法 まずは手動で計算する 49.ツールでスタック・サイズを計算する ツールの機能で自動的に計算する 第8章 動的スタック領域の削減 50.スタック領域の減らし方 ネスト・レベルを減らすのが最優先 51.関数の引数の個数 汎用レジスタに格納できる個数に抑えよう 52.局所変数の削減 全ての処理系に共通の内容はない 53.CPU内部レジスタの退避領域 退避領域を削減する 付録A リファレンス 付録B 文法理解度クイズ 本書は月刊『Interface』誌2021年1月号〜2024年6月号に掲載された, 連載「マイコンC言語転ばぬ先のつえ」の内容を加筆,再編集したものです. |
書籍・雑誌総合案内