KOZOSの書き込みに使うkz_h8writeをNetBSDで動作させる
2012/03/18(日) 19:50 未分類 はてブ情報 はてブに登録 はてブ数

昨日、OSC2012 Tokyo springにてkozosのブースで作者の坂井さんとお話させていただきました。

リンカ・ローダ実践開発テクニックを2FのCQ出版社のブースで購入したので、サインをもらったりしました。例の魚の絵を描いてもらってうれしい。

それはそれとして、例のOS自作本を読み進める中でつまづくのは7章、8章と1章なのだそうです。7章、8章は内容的な難しさで1章は物理的なトラブルに起因する難しさだそうです。

つまり、シリアルをつかったボードとの通信ということですね。

坂井さんも秋月のUSBシリアルを貸し出したり、あれこれ工夫されているということですが、いざ自身のUSBシリアルでうまくいかなかったりと、作者すら巻き込んだ状態で困ったチャンということのようです。坂井さんの場合だとボードがヘタっているのかも疑わなければならないそうですから大変です。

このあたりのトラブルに巻き込まれて1章で挫折している人がたくさんいるのではないかとお話されていました。

ということで、例に漏れず、シリアル経由でボードに書き込めないトラブルに遭遇していたので、すこしその辺を記録しておきます。

まず、そもそもNetBSDで動かそうというところからして、想定環境とは違うのですが、まぁ、そこもふくめて楽しむのがホビーというものだろうと思いまして、あえてNetBSDで挑戦です。

自作本ではh8writeを使っていますが、イマドキはWebページも合わせて読み進めるのが常識でして、その辺の情報を見るかぎり、h8writeがだめだったらkz_h8writeを試してみてねという話になっていて、実装の確かさからkz_h8writeでがんばろうとしたようです。

したようです、と書いたのは理由があって、ずいぶん昔にはkz_h8writeでうまくいっていたのですが、長いブランクのあと試してみると、なぜかうまくいかないという事象にぶつかったからなのです。

で、技術がなければ根性で、をモットーにfprintfデバッグをしていたところ、どうやらシリアルポートを開いているところで止まっているみたいだなということがわかったので、man openして、待ってるんだから待たなきゃいいじゃん、ということでO_NONBLOCKを加え、NetBSDでは意味ないよとかかれているO_NOCTTYを削ってみると、うまく書き込みができるようになりました。
--- serial_linux.c.orig	2012-01-02 06:06:36.000000000 +0000
+++ serial_linux.c	2012-03-18 09:21:24.000000000 +0000
@@ -89,7 +89,7 @@
      * ポートを開く.
      */
     strcpy(s->devfile, devfile);
-    s->fd = open(devfile, O_RDWR | O_NOCTTY);
+    s->fd = open(devfile, O_RDWR | O_NONBLOCK);
     if (s->fd < 0) {
         free(s);
         return NULL;
という修正をしたのがkz_h8write 0.0.3です。

で、さっきWebをみるとgitリポジトリが公開されていることを発見しました。いまどきはgitなんですねぇ。

最新のserial_linux.cソースを見るとopenの引数にO_RDWR, O_NOCTTY, O_NDELAYが与えられています。

0.0.3には存在しなかったO_NDELAYがどうやら先ほどのO_NONBLOCKに相当するもののようですね。lxrで検索してちょろっと見るかぎり、x86ではO_NDELAYはO_NONBLOCKはまったく同じ定義、HP-UXでは別物として扱っていて、alphaはO_NONBLOCKしかなくて(なんでだろ)、sparcでも微妙に扱いを変えているみたいです。

ちなみにPOSIX.1-2008のopenをみるとO_NONBLOCKしか見当たらないので、ポータビリティの観点とx86の実装の観点からもO_NONBLOCKのほうが無難かなと思ったりする次第。

NetBSDではO_NOCTTYは無視されてO_NONBLOCKが有効に動くので上のようなパッチもいらないですね。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0781/tb/