(日々の記録)デジタルオシロを買った。忘年会のシーズンがやってきた。お昼より夜のスケジュール調整が忙しい。電子工作を始めてからは回数を減らすようにしている。酒は嫌いではないが、飲んだ後は何もやる気がなくなって、何か人生を僅かづつでも無駄にしているような気持ちになるからだ。フライトシミュレーター(勿論PCでの)という、どれもマイナーで脈絡のない趣味を共通に持つ友人との、先日の忘年会は実に楽しかった。電子工作に関する話題もほぼ通じる。同じでなく少しづつ分野がずれているのだが、その方がお互いの情報交換になって盛り上がるようだ。そんなこともあって、リニアPCMプレーヤーの第三版(3号機)の開発は余り進んでいないが、日を空けると忘れそうになるので、この10日間の経過を紹介しておこう。プレーヤーのソフトに画期的改善が可能か(12/15/09)これまでリニアPCMプレーヤーのソフトは、液晶モジュール(LCD)を小さいものに取り替えて動くようにしただけで、本体の構造は全く変わっていない。LCDの2行のわずかなスペースに曲名リストを表示し、演奏ボタンで演奏を始めると、1行目にWAVファイル名、2行目にそのWAVフォーマット(サンプリング周波数など)を表示するだけで演奏が終わるまで何も変わらないというのは同じだ。PCや市販のポータブルプレーヤーのように、演奏時間や、プログレスバーのようなものが出ると恰好良いのだが、OSのない8ビットのマイコンでは無理だと諦めていた。3号機のハードの設計にこれだけ苦労しているのに、ソフトを何も改善しないのは芸がない。何か変えるものはないかと思案しているうち、ふと思いついた。ビットのデータをDACに送り、かたわらSDカードからせっせとデータを読み込んでバッファーに途切れなく書き込む処理のシビアな時間的制約である。悠長にLCDにデータを表示している間はない。ここはミリセカンドのオーダーである。Mega328にはDMAなどという洒落た機構はついていない。バッファーもこれ以上大きくするわけには行かない。OSが入らなければこんな同時処理は無理である。このあいだのロジアナのデータアクセスのタイミングチャートを見ていて気がついた。SDカードのアクセス単位は1セクターで、512バイト、バッファーはこの大きさで2つあり、DACはこれを連続的に読み出し、SDカードの読み込みルーチンは、DACが次のバッファーを処理し始めるまで待って、空いたところのバッファーに書き出す。512バイトのバッファーを読み切る時間は決まっている。サンプリング44.1kHz、16ビットステレオでおよそ2.9msである。クロック20MhzでのFatFSの読み込み時間は、実測で1.3msで、残りの1.6msはバッファーが空くのをひたすらループで待っているだけである。ここにSysTickのようなインタバルタイマーで割り込みをかけ、バッファーが空いていない時はすぐバックグラウンド処理に戻り、バッファーが空いていたら、この割込みルーチンでファイル読み込みをすれば、OSを使わなくても、経過時間やプログレスバーのようなものが表示できるのではないか。タスク構造は3段になるけれど、常に3段である必要はない。ディスクアクセスの時だけでよい。うーむ、何かうまく行くような気がする。問題があるのはわかっている。問題は、DACのサンプリング割込みが、このインタバルタイマー(というよりこれはSysTickそのものだが)割り込みによって影響を受けないかということである。割込みの割込み、いわゆる多重割込みは確かAVRでも出来たはずだ。Webに助けを求める。