■先日から作り始めた新しいセンサプラットフォームはI2Cデバイス群やPWM出力ポート、外部スイッチングポート、アナログ入力ポートがおおよそ組みあがった。あとは湿度センサ(アナログ)とXBee(UART)を取り付けるだけなんだけど、とりあえずこの状態でファームウェアの整理に手をつけた。
過去にターミナルソフトは幾つも作ってきたので、何をどうすればというのはおおよそ解っているし、手を抜こうと思えば流用しても構わない。ただ、改善点があることも解っていて、特にUART入力の割込み処理をうまく処理する必要があった。デバイス側で何かやっている間にコマンドが飛び込んでも、コマンドを捨てずにバッファリングできるようにしたい。サーバー側がコマンドの応答を待ってしまうので。
バッファという考え方そのもに難しいところはないのだけど、問題は今回使うATMegaだと使えるワークメモリのサイズが小さいので、簡単に溢れてしまうし、バッファを大きくするとプログラムに制約が出てきてしまうことだった。
今回I2CのEEPROMを載せているので、ワークメモリだけならこれで十分なサイズがある。ただ、EEPROMにはクセがあって、書き込みが遅い。
EEPROMは書き込みを確定させるために時間がかかる。なのでUARTの受信割込みの中でEEPRONに書き込みすると処理が追いつかなくなってしまう。そんなことがあれこれ実験して解った。今考えている方式はコマンド待機のループの中で、UARTの受信バッファの中身をせっせとEEPROMに吐き出して、コマンド終了と同時に実行系に引き渡す。コマンド実行中の受信データは割込み処理のバッファリングに任せる、という感じを考えている。コマンド全量をATmegaのワークメモリに載せなくても良いのであまりバッファは大きくせずに済むのではないかと思っている。思っているのだけど、どうだろうなあ。単純に受信待ちのバッファと実行対象文字列格納のバッファの2面を持つだけのことになるのかなあ。