(注意)このブログは本家のほうの文章部分のみの転載です.ソースコードの配布,画像などについては本家のほうを参照してください.文章中のリンク先は面倒なのですべて本家のほうに変換してしまっているのでご注意ください.

連休だ!OS作成日和だ!

今週はいろいろと忙しくてなんだかんだいって移植作業が進んでいなかったので,今日いっきに作業してしまおう.(そして連休は遊ぶのだ)

で,今回なのだけど,とりあえずKOZOS移植の前に準備としてシリアル割り込み処理を実装してみよう.

H8だとシリアル割り込み処理も簡単で,割り込みフラグを立てるだけ.実装したのは以下のような感じ.今回はブートローダーには手は入っていないので,アプリ側の修正のみ.

修正内容は以下のような感じ.まず serial.c の修正.

diff -ruN h8_06/os/serial.c h8_07/os/serial.c
--- h8_06/os/serial.c Tue Sep 15 00:27:07 2009
+++ h8_07/os/serial.c Sat Sep 19 17:24:41 2009
@@ -1,4 +1,5 @@
#include "types.h"
+#include "interrupt.h"
#include "serial.h"

#define H8_3069F_SCI0 ((volatile struct h8_3069f_sci *)0xffffb0)
@@ -42,15 +43,35 @@
#define H8_3069F_SCI_SSR_RDRF (1<<6)
#define H8_3069F_SCI_SSR_TDRE (1<<7)

+void serial_interrupt()
+{
+ volatile struct h8_3069f_sci *sci = H8_3069F_SCI1;
+ int status, c;
+
+ status = sci->ssr;
+
+ c = serial_getc();
+ serial_putc(c);
+
+ sci->ssr = status & ~H8_3069F_SCI_SSR_RDRF;
+
+ return;
+}
+
int serial_init()
{
volatile struct h8_3069f_sci *sci = H8_3069F_SCI1;

+ /* 割り込みハンドラ登録 */
+ interrupt_sethandler(VECTYPE_RXI1, serial_interrupt);
+
sci->scr = 0;
sci->smr = 0;
sci->brr = 64; /* 20MHz 9600bps */
sci->scr = H8_3069F_SCI_SCR_RE | H8_3069F_SCI_SCR_TE;
sci->ssr = 0;
+
+ sci->scr |= H8_3069F_SCI_SCR_RIE; /* 割り込み許可 */

return 0;
}

割り込みハンドラを用意してinterrupt_sethandler()で登録して,あとSCRの割り込みフラグを立てて割り込み有効にしているだけ.ハンドラ内では1文字受信して,そのままエコーバックしている.注意として,1文字読み込みしてから RDRF フラグを落とすこと.(でないと受信できない)

次に main.c の修正.

diff -ruN h8_06/os/main.c h8_07/os/main.c
--- h8_06/os/main.c Tue Sep 15 00:27:07 2009
+++ h8_07/os/main.c Sat Sep 19 17:24:41 2009
@@ -66,6 +66,7 @@
}
#endif

+#if 0
static int gets(char *buf)
{
int i = 0, c = -1;
@@ -78,6 +79,7 @@
}
return i - 1;
}
+#endif

#if 0
static int dump(char *buf, int size)
@@ -105,7 +107,9 @@

int main()
{
+#if 0
char buf[80];
+#endif

init();

@@ -114,10 +118,12 @@
ENABLE_INTR;

while (1) {
+#if 0
puts("os> ");
gets(buf);
puts(buf);
puts("\n");
+#endif
}

return 0;

単に従来のポーリング処理に蓋をしただけ.

では実行してみよう.今回はブートローダーには手は入っていないので,フラッシュROMを書き換える必要は無い.

Hello World!
> load
~CLocal command? lsx hello
Sending hello, 19 blocks: Give your local XMODEM receive command now.
Bytes Sent: 2560 BPS:870

Transfer complete
eceive succeeded.
> run
starting from entry point.boot succeed!
IabIcIABICIIIIIII

問題なくあっさり動いた.H8は楽でいいねー.

これでKOZOS移植の準備はだいたいできた.あとはいよいよOS実装だ!