ファイルの入出力プログラムについて

13 Apr 2012

以下のファイルオープン・クローズを繰り返すプログラムを実行すると、 146回ループ後にプログラムのリセットが発生するのですが、 なぜでしょうか? (ちなみに使用しているMBEDはLPC11U24です。)

#include "mbed.h"

LocalFileSystem SeqFile("Local"); 

int main() {
    FILE *fp;
       printf("START\n");
    wait(0.1);
    int i = 1;

    while(1){
    fp = fopen("/Local/TEST.csv", "r"); 
       printf("%d\n",i);
    wait(0.1);
    fclose(fp);
    i++;
    }
}

14 Apr 2012

リセットの発生は恐らくfcloseの引数にNULLを与えた結果ではないでしょうか。 そもそもfopenが毎回失敗しfpがNULLとなり、たまたま146回目でリセットに至ったように思えます。

LPC1768で次のようなコードを試してみましたが、リセットは発生しませんでした。

#include "mbed.h"

LocalFileSystem SeqFile("Local"); 

int main() {
    FILE *fp;
       printf("START\n");
    wait(0.1);
    int i = 1;

    while(1){
        fp = fopen("/Local/TEST.csv", "r"); 
        if(!fp){
            printf("error %d",i);
            exit(1);
        }else{
            printf("%d\n",i);
            fclose(fp);
        }
        wait(0.1);
        i++;
    }
}

TEST.csvというファイルはプログラム(binファイル)と同一のディレクトリにありますか? 次のようにエラー処理を加えた場合はどうなりますか?

16 Apr 2012

Hosogaya様

教えていただきましたとおりのエラー処理を加えたプログラムを実行してみましたが、 エラーにはならず、同様に146回ループ後にリセットがかかりました。 fopenで失敗はしていないようです。

LPC11U24のみで起こる現象でしょうか?

17 Apr 2012

M0で全く同じ現象が発生することを確認しました.M3では起こりません.

ここに掲載いただいているプログラムを少し変更しfopenが返すポインタの値を見ると,M0ではオープンするたびにその値が増加してるようです.fcloseの中で何か不具合があるなどの可能性が考えられるため「Bugs & Suggestions」のフォーラムに投稿しておきました.(早い対応が取られますように! http://mbed.org/forum/bugs-suggestions/topic/3447/ )

17 Apr 2012

OKANO様

「Bugs & Suggestions」への投稿ありがとうございます! M0のみで起こる現象なのですね。 ファイルポインタがfcloseでメモリ開放されないのでしょうか?

何にせよ早く対応いただけると助かります。

03 Oct 2013

inouemaと申します。

CQ出版のMARY基板(LPC1114/301)で、SDカードへのGPSロガープログラムを書いてましたところ、同様な症状で困っておりました。 こちらのフォーラムを拝見させていただき、ようやくM0のみの現象だということが分かりました。

現時点でも、本バグは修正されていないようです。

LPC1114FN28 もプラットフォーラム入りしたことですし、修正されると非常に嬉しいです。

04 Oct 2013

私もLPC1114FN28のオンラインコンパイラで同様の現象を確認しました。
fclose(fp)を逆アセンブルしてみたところ、やはりfpは開放してないようです。

fclose(FILE* fp):
00001178 B510     PUSH {R4,LR} ; r0 = fp
0000117A 6800     LDR  R0,[R0,#0] ; r0 = fp->fh
0000117C F000F9B0 BL   000014E0 ; retarget.cpp _sys_close(FILEHANDLE fh)
00001180 BD10     POP  {R4,PC} ; return

fclose(fp);free(fp); でヒープを使い尽くすのは回避しました。

microLIBの標準入出力はバッファリングしないので、FileHandleクラスを直接使ったほうがいいのかもしれません。

04 Oct 2013

こんにちは。 本件は、ARMコンパイラのサポートチームに問い合わせ中です。

Okamotoさんのご指摘されているように、microlibでのfopen/fcloseはstandardlibと異なっており、 その部分で不具合があるようです。詳細が分かりましたら、ご連絡します。

LPC11U24の場合は、exportしたオフライン環境ではstandardlibを使いますので、不具合は発生しないと思います。 LPC1114の場合は、exportしたプロジェクトは現状ビルドできませんので、有効な回避策はありません。

fclose()を呼び出した後のfree()が、適切な回避策になるかも含めて問い合わせ中です。

07 Oct 2013

コンパイラサポートチームから回答がありました。

本件、microlib ライブラリの fclose() 関数の不具合であると言うことです。 回避策としては、以下のように fclose() の直後に free() を呼び出すことによって、メモリを正常に解放可能です。

#include "mbed.h"
 
LocalFileSystem SeqFile("Local");
 
int main() {
    FILE    *fp;
    int     i   = 1;
 
    printf( "\r\nSTART\r\n" );
    wait( 0.1 );
 
    while ( 1 ) {
        fp = fopen( "/Local/TEST.csv", "r" );
        if (!fp) {
            printf( "error %d\r\n", i );
            exit( 1 );
        } else {
            printf( "%d (%p)\r\n", i, fp );
            fclose( fp );
#if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
            free(fp);
#endif
        }
        wait( 0.1 );
        i++;
    }
}


Quote:

M0で全く同じ現象が発生することを確認しました.M3では起こりません.

本不具合はプロセッサコア依存では無く、micro library を使用した場合の不具合になります。 別のコアを使用しても、micro libraryを使用した設定であれば、この不具合が発生する可能性があります。

以上、宜しくお願いします。

11 Oct 2013

firmwareのrev違いによるlocal file systemの挙動について

このページの問題とは違いますが、local file system 関連として、投稿します。

概要

LPC1768で、mbedの最新ファームウエア(rev 141212)
http://mbed.org/media/uploads/samux/mbedmicrontroller_141212.if
(http://mbed.org/handbook/Firmware-LPC1768-LPC11U24)
を使用するとlocal file systemが使えなくなります。

1つ前のファームウエア(rev21164)では問題なく使用できます。 http://mbed.org/media/downloads/firmware/mbedMicrocontroller_21164.if

この問題と思われる投稿が1件あります。 http://mbed.org/forum/helloworld/topic/3825/
131011追記 リンクが間違っていました。正しくは次のアドレスです。
http://mbed.org/questions/1775/Firmware-141212-does-not-release-local-f/

確認事項

http://mbed.org/users/chris/code/LocalFileSystem/
こちらのサンプルプログラムを使用して、
rev141212では動作しないことを確認した上で、rev21164に書き換えた後では、動作することを確認しました。

また、こちらのページ
http://mbed.org/forum/ja/topic/3431/?page=1#comment-22723 のToyomasa Wataraiさんのサンプルプログラムを、少し改造したプログラムでも同様の現象を確認しました。

#include "mbed.h"
 
LocalFileSystem SeqFile("Local");
 
 Serial pc(USBTX, USBRX);
 
int main() {
    FILE    *fp;
    int     i   = 1;
 
    pc.printf( "\r\nSTART\r\n" );
    wait( 0.1 );
 
    while ( 1 ) {
        fp = fopen( "/Local/TEST.txt", "a" );
        if (!fp) {
            pc.printf( "error %d\r\n", i );
            exit( 1 );
        } else {
            fprintf(fp, "%d (%p)\r\n", i, fp);
            pc.printf( "%d (%p)\r\n", i, fp );
            fclose( fp );
#if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
            free(fp);
#endif
        }
        wait( 0.1 );
        i++;
    }
}

サンプルプログラムはこちら
http://mbed.org/users/suupen/code/localFileTest/
からダウンロードできます。

11 Oct 2013

suu pen wrote:

LPC1768で、mbedの最新ファームウエア(rev 141212) http://mbed.org/media/uploads/samux/mbedmicrontroller_141212.if (http://mbed.org/handbook/Firmware-LPC1768-LPC11U24) を使用するとlocal file systemが使えなくなります。

1つ前のファームウエア(rev21164)では問題なく使用できます。

確認しました。確かに新しいファームウェアでは、実行時の挙動が異なっていました。 調べてみますので、少々お待ち下さい。

suu pen wrote:

この問題と思われる投稿が1件あります。 http://mbed.org/forum/helloworld/topic/3825/

こちらの方は、ファームウェアのファイルのリンクが切れていたという件のようです。 直接この現象とは関連していないと思われます。

11 Oct 2013

済みません。リンクを間違えていました。
正しくはこちらです。
http://mbed.org/questions/1775/Firmware-141212-does-not-release-local-f/

20 Oct 2013

最新ファームウェアでLocal FileSystemを使用した場合の問題ですが、 ファームウェア側の不具合であると言うことです。 現状、有効な回避策は見つかっていませんので、この事象が問題となる 場合は大変お手数ですが、旧ファームウェアに戻してご使用下さい。

http://mbed.org/media/uploads/simon/mbedmicrocontroller_21164.if

26 Oct 2013

Toyomasaさん
確認ありがとうございました。

過去のfirmwareのダウンロードですが、
http://mbed.org/handbook/Firmware-LPC1768-LPC11U24
のページの"Firmware changelog"の項から、それぞれダウンロードできると便利だと思います。
検討していただけないでしょうか。
よろしくお願いいたします。