久しぶりのCプログラミング

久しぶりにマイコンでCプログラミングをしている。
あまりにもブランクが長すぎて(3年ほど)基本的なところを忘れていたりする。これじゃ完全に初心者だよ…すこし切なくなった…
C#はいけるんだけどね。C#に慣れすぎて、構造化プログラミングで書くのが違和感があって大変。
マイコンだから、変数の扱いもすこしデリケート。volatileとかstaticとかconst辺りの使い方を復習中。

■volatile
ある関数の中で初期化した変数で、その関数の中では辺りが変更されずに割り込み関数で値が変更されるような場合、コンパイラが勝手に
最適化をして変数を固定値に変えてしまったりすることを防ぐときに使う。

int a;
void main(){
a = 0;
while(a == 0){} // コンパイラが勝手にwhile(1){}にしてしまうこともある
}

void interrupt(){
a = 1; // ここでa=1と代入しているのに
}

■static
関数外に書くのと関数内に書くのとで微妙に挙動が異なる。

―変数(関数外)
 関数外で変数を宣言すると、そのモジュール(.cファイル)の中からしか参照できない。
 グローバルは全てのモジュールから参照できてしまうので、それよりスコープが狭い。

[src1.c]
 static a = 0;

void func(){
a = 1; // これは出来る
}

[src2.c]
void func2(){
a = 1; // これは出来ない
}

―変数(関数内)
 その関数内でしか使えないが、関数終了後も値が破棄されずに、次回関数実行時までも保持される。

―関数
 そのモジュール内でしか呼べない関数になる。
 通常はheaderにプロトタイプ宣言があれば他のファイルからもその関数を呼べるが、これは呼べない。(プロトタイプ宣言も出来ない)

■const
ROMに固定値として割り当ててRAMにコピーさせない

通常グローバル変数を定義すると、初期値をROMに書き込むほかに、プログラム実行中に値を書き換えることもあるので
RAMにもコピーされる。書き換えが不要な変数の場合これは無駄なので、constを付けることでROMだけに書くことができる。
書き換えは不可。




C#に慣れた身としてはstaticとファイル分割を使って積極的にモジュール化したいところだが、マイコンというROMもRAMも限られているうえに
関数呼び出しのコスト(オーバーヘッド)が気になるので、多少コードが読みにくくてもグローバル変数で扱った方が良いこともありそう。
メリットデメリット考えて良い良い方を選べばいいんだけど…
何がどういう仕組み動いているのかマイコンの動作をもっと深く理解する必要がありそう。

参考サイト
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/023.html
http://www.cqpub.co.jp/interface/sample/200807/I0807103.pdf