« SystemCの書籍 | Main | 圧縮プログラムとかstaticとか »

2006.09.20

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日目までは動いたもん勝ちみたいなソースで、それはそれで楽しい。

|

« SystemCの書籍 | Main | 圧縮プログラムとかstaticとか »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/11969093

Listed below are links to weblogs that reference OS自作入門 4日目:

« SystemCの書籍 | Main | 圧縮プログラムとかstaticとか »