8 years, 3 months ago.

ftellがゼロしか返してこなくなった

https://developer.mbed.org/users/digiponta/code/GR-PEACH_NTSC_in_2ch_MOD_try/file/2bea25cf1883/main.cpp の437行目のftellが、fopenが成功後、ゼロしか返ってこない症状がでて、なやんでいます。 コーディウング上は、問題なさそうなのですが、何か競合してるんでしょうか?

あと、freadに変えて、JPEGファイルの読み出しが正常終了するが、464行目のJEPGデコードでエラーがでます。正しくデータが読み出されいいない可能性も高いです。やはり、どこかメモリが競合してるとか?

なお、SDメモリ内に保存されているJPEGファイルは、パソコンで正常に表示できています。

何か、ヒントはないでしょうか。よろしくお願い致します。

dkato様

レス、誠に、有難うご座います。正常に画像の表示がされるようになりました。

https://developer.mbed.org/users/digiponta/code/GR-PEACH_NTSC_in_2ch_MOD_try/file/0f9a45e34220/main.cpp

それにしても、キャッシュ周りの解説がないと、理解が難しいですね。

posted by Hirofumi Inomata 15 Sep 2016

1 Answer

8 years, 3 months ago.

SDカードが認識されるまで少し時間がかかるので、認識前にリードしてしまっているのではないでしょうか。P7_8のレベルがLowになっていれば、SDカードへのアクセスが可能です。
こちらの下部にある、SDFileSystem_GR_PEACHを使うと、USBHostMSDと同じようなIFでSDの接続を確認できます。(trueが返るまでconnect()関数を実行)
また、SDFileSystem_GR_PEACHを使用すると転送時のクロックも1MHzから20MHzにアップするため、アクセス速度も向上します。

Accepted Answer

レス、有難うご座います。SDFileSystem_GR_PEACHへ変更して、下記URLの304行目で、connected()で待つようにしました。結果、いつまでたっても、ここから抜けてこないようです。GR-PEACHが壊れてるのでしょうか?

https://developer.mbed.org/users/digiponta/code/GR-PEACH_NTSC_in_2ch_MOD_try/file/3cb7758c3f17/main.cpp

posted by Hirofumi Inomata 14 Sep 2016

connected()ではなく、connect()で待ってみてください。

    while( !sd.connect() ) {
         Thread::wait(500);
    }
posted by Daiki Kato 14 Sep 2016

レス、有難うご座います。sd.connect() へ変えたところ、戻ってくるようになりましたが、症状は変わらなかったです。

https://developer.mbed.org/users/digiponta/code/GR-PEACH_NTSC_in_2ch_MOD_try/file/2fb4359e5ea6/main.cpp

メッセージログは、下記です。

File read start /sd/img_0001.jpg v=2, i=7
len = 42045
File read done
File decode start
Error:JCU decode error
posted by Hirofumi Inomata 14 Sep 2016

コードを拝見しました。キャッシュ制御が必要になると思います。
以下のように★の行を追加するといかがでしょうか。

main.cpp 460行目付近

#if 0
・・・省略・・・
#else
            size_t len = fread(user_frame_buffer1, sizeof(char), sizeof(user_frame_buffer1), rd_fp);  
            pc.printf( "len = %d\n", len );
#endif 
            fclose(rd_fp);
★          dcache_clean(user_frame_buffer1, len); //キャッシュクリーンを追加
            pc.printf("File read done\n");
 
 
             //YCbCr setting
            aBitmapData.width           = LCD_PIXEL_WIDTH;
            aBitmapData.height          = LCD_PIXEL_HEIGHT;
            aBitmapData.format          = JPEG_Converter::WR_RD_YCbCr422;   //YCbCr[0] & ARGB8888[1] is 4byte, not RGB565[2] is 2byte
            aBitmapData.buffer_address  = (void *)user_frame_buffer0;
            pc.printf("File decode start\n");
            // JPEG_Converter
★          dcache_invalid(user_frame_buffer0, sizeof(user_frame_buffer0));  //キャッシュインバリデートを追加
            if (decoder.decode((void *)user_frame_buffer1, &aBitmapData) == JPEG_Converter::JPEG_CONV_OK) {
                pc.printf("File decode done %dbyte\n", (LCD_PIXEL_WIDTH * LCD_PIXEL_HEIGHT * 4));
                led1 = 0;
            } else {
                pc.printf("Error:JCU decode error\n");
                led1 = 0;
            }
posted by Daiki Kato 15 Sep 2016