皆様こんにちは。
sprintf関数の振る舞いで、プログラムを動作しているとバグ?が発生し
質問させて頂きました。現在の環境は以下の通りとなります。
開発環境:HEW4
コンパイラ:RXファミリ用C/C++コンパイラ
使用している言語:C/C++
使用しているマイコン:AP-RX63N-0A
用途としましては、char型配列に(1024byte)に半角文字列(数値もありますので書式付フォーマット使用)を挿入して
データを送信する仕様であります。
動作していくとある回数(不定)でchar型配列に["ABC:%4d volt"]のように配列が入り、数値が入らず書式付フォーマットの%dが
そのまま配列に入るようになりました。マイコンをリセットしないとバグは解決しませんでした。
バッファは十分余裕があり、オーバーランはしていないようです。
原因が分からなかったため、質問させて頂きました。
以上宜しくお願い致します。
> 用途としましては、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 に変更したところ、動作は正常化しました。