OS自作入門 4日目
ソースを補足していくコーナー。
この本はC言語の入門書ではないので、Cのソースについては本当に動いた物勝ち
で、説明もおおざっぱだ。将来の組み込みプログラマの為に、気になった点を
補足していこう。
(1)VRAMへのアクセス
この本では、VRAMへ1バイトのアクセスをするのに char *pを使っているが、
普通はこう書く。
volatile unsigned char *p;
volatileは最適化の対象外にするという意味。
unsignedは、最上位が符号bitでないから、余計なバグを防ぐためにもつける。
こちらも参考に。
http://www.kumikomi.net/article/explanation/2003/10kumi/13.html
(2)ポインターと配列
pをポインタで宣言したときに、
*(p + i) = i;
みたいな書き方はするが、
p[i] = i;
のような書き方は僕はしない。もちろん文法的には同じだけど、ポインターとして宣言
したものはポインターとしてアクセス、配列として宣言した物は配列としてアクセス
が行儀の良い書き方。
*(p+i)とp[i]は、同じ意味だが、char *pと、char p[] = "xxxx"では意味が違う。
(代入できるかどうかや、sizeofが返す値など)
ポインタは配列としてアクセスでき、配列はポインタを使ってアクセスできるが、
2つは違う物です。
その辺りに転がっていれば、C言語を256倍使うための本を参考に。
(3)符号について
char には、signedとunsigned の二つしかない。省略した場合は処理系に応じて
どちらかになるが正しい。「特に指定のない型」などは存在しない。
また、intやshortに関しては、省略したときはデフォでsignedになる。
charのみが、既存の処理系との整合性をとるために、曖昧になっている。
(4)関数内のstatic宣言について
パレットのテーブルをstaticで宣言しているが、これはグローバルに持って行った
方がよい。なんと言っても、デバッガで簡単に値が確認できる。
関数の内部でstaticをつけるのは、その変数をグローバルで宣言して、ラベルを
出さないのと同じ事。普通は、ファイルを分けて変数名を隠蔽し、アクセスする関数
だけをHファイルで公開する。(中途半端だけどカプセル化)
関数の内部でstatic宣言する方法は、他に方法が無いか良く検討した方がよい。
変な癖がつくとマルチスレッド化したときにはまるぞ。
とりあえず4日目までは動いたもん勝ちみたいなソースで、それはそれで楽しい。
The comments to this entry are closed.


Comments