chakokuのブログ(rev4)

日々のごった煮ブログです

「組み込みOS自作入門」その後,Threadを実装(forSH2)

久しぶりにシビレタ技術ネタ・・・組み込みOSをフルスクラッチで自作してしまう、「組み込みOS自作入門」ですが、、SH2用のGCCをビルドして、スレッド風の実行ができるまで見よう見まねでサンプル実装した。美しいとか、強固さ(ロバストネス)とか程遠い、ボロカスの実装だけど、まぁコンテキストを切り替えながら、2つのスレッド(タスク?)が順々に動くまでにはなった。。左のキャプチャ画面は、2つのタスクが切り替わりながら動いているところ。。

現状ではスレッド(タスク?)が交互に動くとこまでしかできていないので、今後はOSとユーザプログラムをきれいに分離したり、タスクの優先度やら、一連のシステムコールやメモリ管理機能を実装しないといけない。。左はあれこれ悩んで考えていたメモ。。無い頭でうなっていた。。でもこのところ、ずっとこればっかりやってて*1頭おかしくなりそうなのでちょっと休憩。なんせ、本を読んでも自分で作ってみないことにはやっぱり分かりきらないので。。ちゃんと読んでいませんが本ではもっと美しく実装されていると思われる。。

以下テストプログラム。func0とfunc1がそれぞれ別のスタックフレームで動作します。タスク切り替え関数(ctx_sw)で切り替えられる。


//タスクの生成
i= create_task(func0,1);
j= create_task(func1,1);
//タスクの切り替え(メイン側で使えるのありかどうか不明)
ctx_sw(j);

void func0(void){
int i=0;
myprintf("thi s is func0\n");
while(1){
wait(10);
myputc('.');i++;
if(i%20==0){
ctx_sw(1);
}
}
}
void func1(void){
int i=0;
myprintf("thi s is func1\n");
while(1){
wait(10);
myputc('!'); i++;
if(i%20==0){
ctx_sw(0);
}
}
}

ちなみに、スレッド実装は「組み込みOS自作入門」の8章にあたります。ですが、、マイコンアーキが少し違うのでこの本の通りには作っておらず、要所〃を参考にしながら自分で好き勝手に実装しています。この3日間、根詰めすぎたのか、少し気分が悪い。。それになんか、耳がポコポコと鳴っている。。 とりあえず、このバージョンでsvnタグ打って当分休み。。kozosレベルまでシステムコールが揃ったらご参考にどこかにアップしたいですが、、スレッド切り替えしかできないサンプル実装のソースですが見たい人っていますかね。。?(ボソ) 

■関連記事
茶国::シビレタ本;「組み込みOS自作入門」
http://d.hatena.ne.jp/chakoku/20101027

*1:特にコンテキストをどうやって保存・切り替えするのか??