JPEG展開ルーチンはすんなり移植できたのですが、時計表示モードにフォトフレーム機能を追加するにはいくつか作業が必要だっとので、ちょっと時間を要しました。
まず考えなくてはいけないのは、画像の伸長/表示をどのタスクで処理させるかです。現在 main_taskで時計表示をおこなっていますが、このタスクに画像の伸長/表示処理を追加したのでは、その処理時間が問題となります。VGAサイズでも500msとかかかるので、その間 時計表示の更新ができないと時計の秒表示の進み方が不自然になってしまいます。そこで、伸長/表示はplayer_taskで処理させることにし、main_taskはplayer_taskに対して定期的に次の画像を表示する指示を発行することとしました。
次の問題は、表示の排他処理です。画像の展開/表示に時間がかかるので、その途中に時計表示の更新の要求が入ります。main_taskとplayer_taskの2つのタスクがLCDに対しての書き込みをおこなうことになりますが、表示処理の途中でタスク切替えが発生したのでは、表示がおかしくなってしまいます。そこでLCDへの描画処理の入り口と出口にセマフォの獲得/解放を追加することで、描画の途中で別のタスクがLCDにアクセスすることのないように排他処理をおこなうことにしました。JPEG画像の展開/表示は1ラスタ単位で処理されるので、この単位でLCDに対してのアクセスを占有しています。
他にもスタックサイズを調整したり、不要なルーチンをけずったりしてなんとか動くようになりました。
ポートレートの画像は、↓のように表示します。
動画で示した方がいいのですが、アルバム画像の表示までJPEG対応してから動画を撮影してみようかと思います。
まず考えなくてはいけないのは、画像の伸長/表示をどのタスクで処理させるかです。現在 main_taskで時計表示をおこなっていますが、このタスクに画像の伸長/表示処理を追加したのでは、その処理時間が問題となります。VGAサイズでも500msとかかかるので、その間 時計表示の更新ができないと時計の秒表示の進み方が不自然になってしまいます。そこで、伸長/表示はplayer_taskで処理させることにし、main_taskはplayer_taskに対して定期的に次の画像を表示する指示を発行することとしました。
次の問題は、表示の排他処理です。画像の展開/表示に時間がかかるので、その途中に時計表示の更新の要求が入ります。main_taskとplayer_taskの2つのタスクがLCDに対しての書き込みをおこなうことになりますが、表示処理の途中でタスク切替えが発生したのでは、表示がおかしくなってしまいます。そこでLCDへの描画処理の入り口と出口にセマフォの獲得/解放を追加することで、描画の途中で別のタスクがLCDにアクセスすることのないように排他処理をおこなうことにしました。JPEG画像の展開/表示は1ラスタ単位で処理されるので、この単位でLCDに対してのアクセスを占有しています。
他にもスタックサイズを調整したり、不要なルーチンをけずったりしてなんとか動くようになりました。
ポートレートの画像は、↓のように表示します。
動画で示した方がいいのですが、アルバム画像の表示までJPEG対応してから動画を撮影してみようかと思います。