2013年7月2日火曜日

PIC C18 メモ(ファイル分割してみた)

-----------------------------
ずらずらと書いてあったプログラムを分割してみた
-----------------------------

段々と規模が大きくなった時、見やすくするためにCファイルを分け、必要なところでインクルードして使っていたプログラムを教科書通りの「ファイル分割」してみた。

上位層をコメントアウトしておき、少しずつ開きながらつぶしていく手順だ。ソースの中身は触らないで関数のファイル間移動、宣言や定義の部分の修正のみの、ほぼ力仕事。勉強しながらの二日がかりだったが、考えていたよりも易かった。多分、元のファイルがうまく分割できていて、相互依存が薄かったためではなかろうか。

コンパイルとリンク後のオブジェクトサイズはほぼ同じになったが、MAPや、HEXファイルを比較すると関数や、変数のレイアウトが大きく違った
  • 開始前:ROM:11248, RAM426
  • 終了後:ROM:11247, RAM427
-----------------------------
>出てきた問題などの整理
-----------------------------
Q1. 構造体のデータを別のモジュールでも使いたい
  • 別のモジュール側のヘッダで extern で宣言して使う
  • ヘッダで typedef で型宣言して構造体を作る
  • 初期化や、変数の定義は、ソースで行うこと
Q2. rom char を別のモジュールでも使いたい
  • extern 通常のデータと同様に宣言
Q3. RAMデータをヘッダで定義すると二重定義になってしまう
  • RAM変数はソースの方で定義する
  • ソースがヘッダを読み込んで循環するため
Q4. ビット指定
  • 標準のdef.hがあるのでそれに書かれた型を使えばいい
Q5. 二次元配列の extern 宣言のエラー
  • extern 宣言だけでなく、低位の配列数の省略は不可
    int exsample[];    //OK
    int exsample[][3]; //OK
    int exsample[2][]; //NG
    int exsample[][];  //NG
Q6. const rom char でデータを定義してあるが、#defineでよくないか
  • LCDカーソル位置などの値を、ただし混乱を招くかも
Q7. 始めから二次元配列の構造体より、typedef した構造体をさらに配列定義した方が
  • Q1であるように、一次元の構造体で typedef しておけば、 一時的なバッファを作りたいときなど同じ宣言をする必要がない
Q8. extern 宣言したのに未定義のエラー
  • 宣言されたヘッダーファイルを読み込んでいないミス
  • ヘッダーファイルの読み込みの順番が影響する
-----------------------------
まとめ
-----------------------------
まとめは、「PIC C18 メモ(ファイル分割/hファイル)」に。
2010.02 - 2013.07.03