マイコン工作実験日記

Microcontroller を用いての工作、実験記録

タスク構成 -- その2

2024-04-14 15:23:02 | DoomPlayer

前回の記事でタスク構成について書きましたが、その際にはCMSIS_OS2のAPIを使ってタスク情報を取得していました。DoomPlayerでは自分で書いたアプリ部分ではCMSIS_OS2のAPIを使っているので、自分が作成したタスク情報はこれで全て取得できているのですが、使用しているライブラリ部分でタスクが生成されていると、その情報は取得できていませんでした。

そこで、改めてFreeRTOSレベルのAPIを使ってタスク情報を取得するように変更しました。具体的にはuxTaskGetSystemState()を使用しています。また、タスク名に続いてそのタスクの優先度も表示することにしました。スタックサイズについては、ワード単位で表示されています。

この変更によりFreeRTOS内部で作成されているIDLEタスクとタイマー処理用の Tmr Svcタスクが表示されるようになりました。lv_conf.h において ''#define LV_USE_OS LV_OS_FREERTOS'' を指定するとlvglDrawという描画処理用のタスクも生成されるのですが、不必要に大きなスタックが消費される上に、タスクの優先度が高く設定されてしまい、他のタスクとの連携の観点で問題が生じするため、LV_OS_NONEを指定して使っています。この問題は、現在のlvglのgithub masterでは修正が加わっているようなので、次のリリースに期待したいところです。


CR1220とタスク構成

2024-03-20 12:16:46 | DoomPlayer

画面キャプチャ機能でSDカードに画像を保存できるようになったので、そのタイムスタンプとファイル名生成のためにRTCバックアップ用の電池としてCR1220を追加実装しました。Nucleo-U575ZIでは、ディフォルトでMCUのVBAT端子はVDDにジャンパされているのでSB50の0Ωを取り外してから、電池を装着してやります。これで、ようやくと計画していた全ての部品を実装したことになります。

RTCのカレンダー機能を使うので、日付と時刻の設定機能も必要となります。LVGLを使ってGUIとして実現するのがベストなのでしょうが、使用頻度が低い機能にわざわざGUIを用意するのも面倒です。そこでNT-Shellを導入してCLIのコマンドでdate, timeコマンドを用意しました。

せっかくNT-shellを入れたので、タスク状態を表示するpsコマンドとQSPIフラッシュ上に書き込まれているファイル情報を表示するflashコマンドも用意しました。

psコマンドで表示されている数字は、残りスタックサイズを示しています。各タスクの大まかな役割は次のとおりです。

 

タスク名 役割
defaultTask 起動時のSD, QSPI faslhの確認、スクリーンキャプチャ、タッチパネル処理を担当
guitask LVGLと画面更新処理
btstacktask BTstackとHIDホスト処理
shelltask NT-shellとコマンド処理
flacreader FLAC音楽データの読み出しと展開処理
mixplayer 音楽と効果音の合成とFFT処理

上記のコマンド実行例は、起動直後の状態を示しています。この後、Bluetoothでコントローラを接続して音楽を再生したりしているとスタックが消費され、DOOMのゲームを開始すると新たにdoomTaskが開始されます。


STM32H7R/S

2024-03-12 22:45:48 | Weblog

来週の発表になるのかもしれませんが、STM32H7R/Sシリーズが新たに出るようです。正式発表の前ですがYouTubeにDiscovery kitが紹介されています。

STのサイトで検索してみるとこんな資料が見つかりました。内蔵メモリを抑えて価格を抑えているようです。


画面キャプチャ

2024-03-06 20:13:47 | DoomPlayer

作業中のNucleo0U575ZI版のDoomPlayerにもようやくと画面のキャプチャ機能を用意しました。青いUSERスイッチを押すことで、SDカード上に画面キャプチャを保存します。今回は、16ビットのパラレル接続LCDを使っていますので、画面情報はLCDのコントローラであるILI9488が持つGRAMから読み出すことにしました。

書き込みの際にはMomory Writeコマンドを使ってRGB565形式の画素データを16ビットで書き込むことができますが、Memory Readコマンドを使っての読み出しの際には常にRGB888形式になるんですね。知らなかった。そのため、画面データ量は480x320x3 = 460,800バイトとなります。STM32H7B3を使っていた時は、JPEGエンコーダを使って圧縮した画像データをSDカードに保存していましたが、STM32U575ZIにはJPEGエンコーダは備わっていません。LibJPEGを使ってソフトで圧縮しようかとも思いましたが、作業領域のSRAMも必要になるので、今回はRGB888形式のままで保存することにしました。ちょっと手間ではありますが、PC側でImageMagickのconvertをつかてJPEG/PNGに変換しています。

画面データの読み出しは、LVGLの画面更新やDOOMの画面更新作業と競合しないように配慮しています。また、SDカードへの書き込み動作は、音楽再生のための読み出し動作とSDカードアクセスが競合するので、一時的に音楽再生を止めてから読み出しを行うことにしています。

DualShock4やDualSense, 8bitdo Zero2をつなげた時には、480x320に拡大して画面表示をしますが、コントローラが接続されていない場合には、320x200で表示することにしてみました。

LVGLを使って作成した画面上のボタンを押すことで操作可能になってはいますが、画面タッチでの操作はかなりキツイ。画面表示も小さくてみづらいし、実用的ではありませんでした。


LED追加実装

2024-02-17 10:59:02 | DoomPlayer

ボードの右端に長らくと未実装だったLEDを追加実装。音楽プレーヤで再生時に、曲に合わせて点滅します。元々のlvgl音楽プレーヤーが 4つの帯域に分割したスペクトル表示をする仕組みになっているので、その強さに応じて4色のLEDの明るさをPWMで変化させています。PWM制御にはちょうど4チャンネルのPWM出力ができるTIM2を使用。PWM出力に割り当てた端子に抵抗を介してLEDを直結しているだけの簡単な仕組みです。

それなりに明滅してくれますが、緑が暗めで青が明るめに表示されている印象。電流制限抵抗を調節するとか、PWMのデューティ比を各チャンネル毎に調節するとかした方がいいのでしょうが、試行錯誤するのも大変そうなのでこれで我慢。

LEDには秋月で購入した1608サイズのロームのチップLEDを使用しました。このサイズなら手半田作業できるのですが、ピンセットで掴み損ねて弾いてしまって赤色をひとつ紛失。カーペットの上に落としてしまうと、もう発見不可能です。

袋の張られた品番シールに色付けされているのが、とっても助かる。こういう気配りが嬉しいですね。