1.大きな画像を表示するぞ!まずは構造設計だ!!コア間通信だ!!!
第二部 画像表示編 始めます
bitbank2/JPEGDECには画面サイズを超えた画像を表示するためのサポート機能がいくつかある。
・1/8,1/4,1/2 の縮小機能 picocalcのLCDは320x320 だから2560x2560の画像まではイケる
・画像の特定領域をデコードするcrop機能 画像の中央部だけをLCDに表示するとかもできそう
ただ第一部でも書いたけど、picoのRAM容量の制限で、画像ファイル全体を一度に読み込むのが難しい。
JPEGDECは分割したファイルを読み込むための機能がある。ただ、これはコールバック関数として実現している。
一方、ファイルを読み込むためには micropython の関数を呼び出す必要がある。
全部がpythonの関数で作ってあるなら、何も考えずに呼び出せるのだが、Cで書いたモジュールからmicropython側を呼び出せるのか?
ドキュメントを探せば方法は存在するかもしれないけど、まずは思いついたやり方でやってみる。
シンプルに micropython の関数を呼び出すのはcore0 が担当し、core1がJPEGDECの処理を担当する。(ここまで実装済み)
core0はcore1 のJPEGDECを起動する。
JPEGDECでファイル読み込みが必要になったら、ファイルポインタ(ファイルの先頭から何バイト目か?)を core0 に通知する。
core0 は通知を検出したらファイルを読みこんで、データのバッファアドレスを core1 に通知する。
いままでは core0 では core1 の処理終了をポーリングしながら待っていたので、そこに通知の確認処理を追加する簡単なお仕事。
この際だから、ちゃんとしたコア間通信を使おうと思って余計な遠回りをやらかした。
picoのドキュメントを見ると、コア間通信用にFIFOがマイコンに内蔵されているようだ。(multicore_fifo_popとかmulticore_fifo_push とか)最初からこれを使っておけば、コンパイラの最適化で通信ができないとかのトラブルはなかったんだよな。
と思いつつ組み込んでみたがサッパリうごかない。core1がFIFOに書き込んだつもりがcore0で読み込めない。何か特別な初期化が要るのか、micropython 環境では動かないように設定されてるのか。
この辺で詰まってるよりさっさと画像を出したいんで、動いている処理をそのまま流用した。動いているものは変更するなというのは大事。
てなもんで640x480の画像を準備して、分割読み込みと1/2サイズ表示をテスト。おお!ちゃんと表示されるぞ。割と簡単じゃん?
と思ってSDにファイルを置いて動かしたら妙に遅い。100kBぐらいのファイルに1秒かかる。あれ?SDのボーレートが1Mbps固定の対策をしたはずだよな?
もしかして第一部完!で github に登録したファイルがミスってる?
慌ててボーレートを500kbpsに落としたら今度は2秒かかる。ちゃんと変更に対応してる。じゃぁなんでこんなに遅くなった??
相変わらず挙動不審だなぁ。まずこいつを片づけないと。




