Repo

kjana00@gmail.com

older <-

2012-01-07 01:53:03

今朝は晴れ。朝ごはんはパンとサラダとソーセージ。ちょっとあったかいような気分。ちょっとだし、気分だけかも、ではあるけど。

とりあえず昨日の続きをと思ったら今日は全然再現しなくて困ったり。うーん、あんまりレース起こりそうな気がしないコードではあるし、そんなものなのかなと、とりあえず別口で気になってたところの直しを入れてみたりしてたら打ち合わせに呼ばれて、現状こんな感じで「わたしいなくなる代わりに誰か来るかも」とか今更な感じなことを言われてみたり。

で、戻って作業の続き。何かまともっぽく動いてるログを見るとやっぱり通信線を引っこ抜いてエラーを発生させてみた時に、外部機器のデータが異常値になるのを見て余計なエラーを検出してる。このエラーは外部機器がとあるエラーを出してる状態でデータがしきい値を越えたらっていうのだからこれじゃ駄目だよね、と検出関数を直してみたり。

エラーを検出時のリアクションの一部に LED を点滅させるなんていうのがあって、一部のエラーは回復することもあるからそれを取り消す必要もあって……というのをちょっと付け足し。点滅させるの自体をどうするのかは置いておいて、とりあえずリアクションの時の関数を用意するのと、同じ LED をいじるエラーが検出されてなかったらエラー回復のリアクションでどうにかするっていうのの枠組みを作っておくのと。とりあえずこんなものでいいはず、か。まあ、エラー処理そのものと一緒で、動かしてないコードにはしょうもないバグが残っていることだろうけど。

……という辺りでログ取りがバグり出す。何か 1byte 多いなっていう感じ。そのせいでデータ末尾と本来のデータの先頭バイトとを先頭バイトとサイズとして読んじゃってスクリプトが落ちる。何が増えてるんだと眺めてみると、何か \003 とかだったりしてファイルモードの問題じゃなさそう。Cygwin 上なんだからあたりまえって言えばあたりまえか。

しばらくああでもない、こうでもないと悩んでみてもらちがあかなかったけど、何かの拍子にふと何のレースか見えた。UART の TX バッファにデータをセットする処理が UART TX 割り込みとタイマ割り込みで動いてる定期処理の二箇所にある。で、タイマ割り込みの方が優先度が上。UART TX 割り込み中でアプリケーションレベルのバッファからデータを取り出して読み出しポインタを更新する直前にタイマ割り込みが入ると、タイマ割り込み中で UART TX をキックするために同じ処理をするんで同じデータを読み出してセットする可能性がある。で、UART TX 割り込みに戻って読み出しポインタを書き込むから同じデータが二つ出力された上に、その分余分にポインタが進んだりはしないということになる。

ということで UART TX 割り込みの方で割り込み禁止にしてみたら解消したっぽい。少なくとも五分保たずに落ちてたのが三十分とかの単位で動き続けてくれるようになった。昨日のもこれかな。元々が微妙なタイミング問題だから露見し難かったけど、非同期な出力とかタイマ割り込み中の処理の増加とかで引っ掛かり易くなったっていう。まあ、そっちももっと様子見ないと、なわけだけど。

そんなことしてるところに来週ぐらいにデモに使ったり先のデモに出したりするプログラムについて相談される。今、入力切り替わると外部機器の状態によっては正しく停止するよねっていう。正しくはあるんだけど、納得してもらい難い仕様。これをもうちょっと納得し易いようにするためにはっていう話。状態遷移条件をちょっといじるっていうか、止める時、始める時の条件を二系統の入力でほぼ同じにしてるのを別個にするだけでそうなりますねという返答をして、そうすることに。

その前に、デモに出すんだと前の基板での LED 出力がちゃんと動くか確認しておきたかったんでそっち。なりは小さくなったけどまだ結構重いんだ、と運んでプログラム書いて、スイッチ入れたらすぐには動かない状態だったんで負荷かけてみたりして……で、動き出したら、点くはずの LED が点かない。おや? 別の LED は点いてるのにねぇ。

で、ポートの割り当ての間違いを疑ってみたりしたんだけど前のデモプログラムと一緒だし、としばらく悩んでわからないから直接 LED 状態を指定してる変数に値を設定してみた。ら、点いた。ふん? で、LED の enum からポートを見つける関数を疑ったけどこれは間違いようもなさそうな関数でまた悩んで、結局この関数はこの LED 指定した時に何返してるんだろうというのを確認してみる。……正しいポート番号返してるな。それじゃあとその番号で LED 状態変数をいじってみる。……ちゃんと点くな。

そこまで見てようやくポート番号が見つからなかった場合っていうつもりの条件判定が間違ってるのに気付く。これだと LED の enum の最大値以上のポート番号を弾いちゃうじゃないか。実際点かなくて悩んでたのは九つの LED の中でポート番号が 9 以上のやつ。対応するポートが見つからなかった場合に返す値を適当に 0xffff とかにしてやって、それが返ってきたら無視するようにして決着。

それから遷移条件をいじってちょっと試したところで今日はおしまい。まあちょっと試した時点で動くのはわかったし。何か致命的な相互作用が起こらないことを確認しなきゃいけないとか、実動作見ないとねとかが残ってる。その辺見たら、当面のデモ用にはそれを出すようにしつつ、エラー処理を詰めたり出荷前検査用の動作モードをどうにかしたりっていうことになるか。サブマイコンと本当に通信するようになる、っていうのもあるな……

とりあえず帰って晩ごはんに野菜スープと餃子。ちょっと焼売っぽい蒸し餃子がおいしい。野菜スープは久しぶりに焦がしたんでちょっと焦げ臭い。そしてちょっとお湯湧かしたら少しは焦げが取れるかなと水を入れて放置しておいたら余計に鍋を焦がした……危ないってば。こんなことで火事でも起こしたら情無さ過ぎる。

後は WWW 見たりゲームしたりと。さっくり手も無く負けるといっそ清々しい、なんていうことはないね……いい加減ただうろうろするのが辛くなって、スティング回収と塔のクエストを片付けてみたり。忍者の超隠密が大変役立ってスティングの回収はえらく簡単に済んだ、けど、あれって永遠光源なんで装備すると超隠密状態になれなくなるのよね……そして塔ではそもそも何も得られなかったという。これはあんまりだと山に行ってみたら、アーティファクト拾ったけどオルクリストじゃブロードソードな上に永遠光源でスティングよりどうにもならない。ぐぅ。

older <-

goto

hint can be:

Tags

old

2007-05 -- 2006-12

ゲーム関係の古い記録

before 2005-12