本当はESP32-S3に乗り換える予定だったのですが、その前にプロファイリングしておこうと思い、ボトルネックを当たってみました。
空いているGPIOピンを出力ポートにしてロジアナで関数の実行時間などを計測する方法でボトルネックを探したのですが、ここと言って想定以上に時間の掛かっている重い処理はありませんでした。
ただ、たまにオーディオをレンダリングする処理の途中でタスクがプリエンプション(実行権の横取り)をされていて、それが1ミリ秒間という相当に重い処理をしているのを見つけました。本来は450マイクロ秒で処理を完了しなければならないレンダリング処理が1ミリ秒まで遅延していました。
単純にタスクの優先順位を上げれば改善しそうな感じですが、それだとここまでハマってきた時間が報われないので、一体何をしているのか調べてみました。結果…余りちゃんと調べていないのですが、どうやらCore1側は1秒に1回の間隔で割り込みが入ってシステム内部の処理をしているようです。そのタスクよりも優先順位を上げれば良いことになるため、タスクの生成時の引数を変えてみました。
すると、なんとレンダリングの処理時間が1/5まで短縮されました。その結果、FM音源8チャンネル+PSG3チャンネルの再現ができるようになり、おまけにサンプリング周波数を22KHz → 32KHzまで上げても再現できるようになりました。
やったねっ。
ということで、X1のスペースハリアーのメインテーマを演奏してみました。
千円台で手に入るマイコンでここまでできるとは驚きです。ここからどう発展させていくか、妄想に入ろうと思います。
ではまた!
10/9追記:音質を向上する余地があっため、更にチューニングを行いました。