[3] 実際のプログラムの構造
CW Decoderでは、信号処理とデコード処理に加えて、ディスプレイ表示、タッチパネル操作対応を実装しています。ここでは、画面表示機能とデコード処理の関係を詳しく説明します。
(本機はリアルタイム性能を確保するためグラフィック画面制御を含めて全てオリジナルのコード(ソフトウェア)となっています。)
今回使用したMCU(RP2350)は内部にコアが2個あります。CW Decoderでは、それぞれのコアに、メインループ処理と割込み処理を割り当てています。(*1)
-
Core1の割り込み処理: 信号入力
ADC Timer割り込み処理を実行し、ADCデータをバッファに蓄積- Core1のメインループ: 信号のシェーピング部
シェーピング部{メインループ}は、割込み処理側でADCデータ準備完了フラグを立てるのを待って、シェーピング処理を開始します。そして4msec毎のKey On/Offデータをリングバッファに書き出します。また、グラフ表示用のデータバッファにデータを書き込みます。
-
Core0のメインループ: モールス信号のデコード部
リングバッファからKey On/Offデータを読み出し、モールス符号の解析処理をします。解析結果(出力文字)は、ディスプレイ用のストリームバッファに書き込みます。- Core0の割込み処理: 液晶画面の描画部 (文字、グラフ)
Core1からの定期的な割り込み(*2)を受けて、ストリームバッファとグラフデータからディスプレイの更新、およびタッチパネル操作対応をします。[一般的な外部割込み処理とは異なり、優先度の高いタスクとしての定期的な実行]
各処理モジュール間にバッファを置いている理由については、次回の説明をご覧ください。
(*1) RP2350(Raspberry Pi Pico2)のソフト基盤としてRTOSは有るが、今回はリアルタイムでの確実な制御を重視して、Arduino環境(OSなし)で構成した。
(*2) ArduinoでのCore間のFIFO通信(割込み)が見つからなかったので、GPIOを2ポート使用したGPIO割込みを使用している。
コメント
コメントを投稿