Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 1 month 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ファイルは、パソコンで正常に表示できています。
何か、ヒントはないでしょうか。よろしくお願い致します。
1 Answer
9 years, 1 month ago.
SDカードが認識されるまで少し時間がかかるので、認識前にリードしてしまっているのではないでしょうか。P7_8のレベルがLowになっていれば、SDカードへのアクセスが可能です。
こちらの下部にある、SDFileSystem_GR_PEACHを使うと、USBHostMSDと同じようなIFでSDの接続を確認できます。(trueが返るまでconnect()関数を実行)
また、SDFileSystem_GR_PEACHを使用すると転送時のクロックも1MHzから20MHzにアップするため、アクセス速度も向上します。
レス、有難うご座います。SDFileSystem_GR_PEACHへ変更して、下記URLの304行目で、connected()で待つようにしました。結果、いつまでたっても、ここから抜けてこないようです。GR-PEACHが壊れてるのでしょうか?
posted by 14 Sep 2016connected()ではなく、connect()で待ってみてください。
    while( !sd.connect() ) {
         Thread::wait(500);
    }
レス、有難うご座います。sd.connect() へ変えたところ、戻ってくるようになりましたが、症状は変わらなかったです。
メッセージログは、下記です。
File read start /sd/img_0001.jpg v=2, i=7 len = 42045 File read done File decode start Error:JCU decode error
コードを拝見しました。キャッシュ制御が必要になると思います。
以下のように★の行を追加するといかがでしょうか。
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;
            }
 
                            
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