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

皆様こんにちは。

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

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

開発環境:HEW4

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

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

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

 

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

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

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

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

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

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

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

Parents
  • fujita nozomuさん
    回答ありがとうございます。
    デバッガーを使用して、当該関数の前後をステップ実行してみると
    sprintf関数実行後の命令後char型配列に%dが出力されるバグが
    発生致しました。
    プログラムは少しでも変更するたびに、プロジェクト本体毎に
    バックアップを取り続けております。

    わわいさん
    いつも丁寧なご回答ありがとうございます。
    sprintf関数の実行場所になりますが、タイマ割込み中に実行しています

    void Excep_CMT1_CMI1(void)
    {
    sprintf(disp_buff, "C1:%1.02fV C2:%1.02fV C3:%1.02fV", m_AdVolt[CH1], AdVolt[CH2], AdVolt[CH3]);
    send(disp_buff);
    }
    上記のように関数を実行しており、最初の1~2回目はバグは無いんですが
    3回目以降などに%dが直接出力されました。
    以降はリセットしないと解決しません。

    事象発生時send関数(RS232C通信送信)実行時にブレイクポイントを置くと
    disp_buffのchar型配列に確かに%dが入っていました。


    スタックの調べ方はちょっと分からないですが教えてもらうことは可能でしょうか

    sprintf関数は便利ですが、そういう問題点もあるんですね・・・
    どうにかして自分のコードでその文字列を生成するようにした
    ソースを組み込んで見ます。
Reply
  • fujita nozomuさん
    回答ありがとうございます。
    デバッガーを使用して、当該関数の前後をステップ実行してみると
    sprintf関数実行後の命令後char型配列に%dが出力されるバグが
    発生致しました。
    プログラムは少しでも変更するたびに、プロジェクト本体毎に
    バックアップを取り続けております。

    わわいさん
    いつも丁寧なご回答ありがとうございます。
    sprintf関数の実行場所になりますが、タイマ割込み中に実行しています

    void Excep_CMT1_CMI1(void)
    {
    sprintf(disp_buff, "C1:%1.02fV C2:%1.02fV C3:%1.02fV", m_AdVolt[CH1], AdVolt[CH2], AdVolt[CH3]);
    send(disp_buff);
    }
    上記のように関数を実行しており、最初の1~2回目はバグは無いんですが
    3回目以降などに%dが直接出力されました。
    以降はリセットしないと解決しません。

    事象発生時send関数(RS232C通信送信)実行時にブレイクポイントを置くと
    disp_buffのchar型配列に確かに%dが入っていました。


    スタックの調べ方はちょっと分からないですが教えてもらうことは可能でしょうか

    sprintf関数は便利ですが、そういう問題点もあるんですね・・・
    どうにかして自分のコードでその文字列を生成するようにした
    ソースを組み込んで見ます。
Children
  • > char型配列に["ABC:%4d volt"]のように配列が入り、数値が入らず書式付フォーマットの%dがそのまま配列に入るようになりました。



    > sprintf(disp_buff, "C1:%1.02fV C2:%1.02fV C3:%1.02fV", m_AdVolt[CH1], AdVolt[CH2], AdVolt[CH3]);

    > 3回目以降などに%dが直接出力されました。

    で書式が異なっていますが、相談されてる問題の現象は正確なものですか?

  • そうですね 最初に記載した書き方が誤った書き方です。
    後半に記載した項目が本来出力している書き方になります