RX63Nマイコン sprintf関数の振る舞いがおかしい

皆様こんにちは。

sprintf関数の振る舞いで、プログラムを動作しているとバグ?が発生し

質問させて頂きました。現在の環境は以下の通りとなります。

開発環境:HEW4

コンパイラ:RXファミリ用C/C++コンパイラ

使用している言語:C/C++

使用しているマイコン:AP-RX63N-0A

 

用途としましては、char型配列に(1024byte)に半角文字列(数値もありますので書式付フォーマット使用)を挿入して

データを送信する仕様であります。

動作していくとある回数(不定)でchar型配列に["ABC:%4d volt"]のように配列が入り、数値が入らず書式付フォーマットの%dが

そのまま配列に入るようになりました。マイコンをリセットしないとバグは解決しませんでした。

バッファは十分余裕があり、オーバーランはしていないようです。

原因が分からなかったため、質問させて頂きました。

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

Parents
  • > 用途としましては、char型配列に(1024byte)に半角文字列(数値もありますので書式付フォーマット使用)を挿入して

    その配列をスタック上に取ってないでしょうか?

    HEW で作成する RX 用のプロジェクトは初期値としてスタックのサイズを 0x300(768) バイトしか用意しないようで

    stacksct.h:

    /***********************************************************************/
    /*                                                                     */
    /*  FILE        :stacksct.h                                            */
    /*  DATE        :Thu, Jan 19, 2017                                     */
    /*  DESCRIPTION :Setting of Stack area                                 */
    /*  CPU TYPE    :RX63N                                                 */
    /*                                                                     */
    /*  This file is generated by Renesas Project Generator (Ver.4.53).    */
    /*  NOTE:THIS IS A TYPICAL EXAMPLE.                                    */
    /*                                                                     */
    /***********************************************************************/
    #pragma stacksize si=0x300
    

    ローカル変数を 1024バイトスタック上に取ると、スタックオーバーフローにより即他の領域を破壊することとなります。

    確認として、

    void main(void)
    {
        char disp_buff[1024];
        float c1 = 0.0;
        float c2 = 0.0;
        float c3 = 0.0;
    
        for (;;) {
            sprintf(disp_buff, "C1:%1.02fV C2:%1.02fV C3:%1.02fV", c1, c2, c3);
            c1 += 1.0f;
            c2 += 2.0f;
            c3 += 3.0f;
        }
    }
    

    上記のコードを実行したところ disp_buff[] の内容が

    "C1:%1.02fV C2:%1.02fV C3:%1.02fV"
    

    となり、報告に近い感じです。

    disp_buff[] の要素数を 100 に変更したところ、動作は正常化しました。

  • char型配列は、グローバル変数上で1024バイトとっており、タイマ割込みで実行しており
    配列値を1024から100にしたところ一度も本事象がでていないですね
    いま少しスタックの勉強をしてきます。マイコンのスタックの重要性を
    ありがとうございます
  • グローバル変数で取っているのであれば、スタックオーバーフローには直接影響しないですね。他のところでスタックを大きく使用しているところがあり、そのタイミングでタイマー割り込みで処理が行われるとスタック領域を破壊しているとかではないでしょうか。
    割り込みルーチンに入ったタイミングでスタックポインタの値を確認したり、スタック領域の最も深いところに 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 等書いておいて、プログラム実行でそれが破壊されないか(十分なスタックエリアが確保されているか)等確認されることをお勧めします。
Reply
  • グローバル変数で取っているのであれば、スタックオーバーフローには直接影響しないですね。他のところでスタックを大きく使用しているところがあり、そのタイミングでタイマー割り込みで処理が行われるとスタック領域を破壊しているとかではないでしょうか。
    割り込みルーチンに入ったタイミングでスタックポインタの値を確認したり、スタック領域の最も深いところに 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 等書いておいて、プログラム実行でそれが破壊されないか(十分なスタックエリアが確保されているか)等確認されることをお勧めします。
Children
No Data