(H8移植編第7回)シリアル割り込み処理をやってみる

2009/09/19

あなたは 人目のお客様です.

連休だ!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実装だ!


メールは kozos(アットマーク)kozos.jp まで