ルネサスRx231へのファームウエア移行開発の状況(Toolchain依存の課題)
Rxマイクロコントローラ(MCU)へのファームウエア移行開発のご依頼を頂き、H8/300Hシリーズ向けに開発されたユーザアプリケーションをRx231へ移行する作業を進めています。ツールチェイン(コンパイラ)としてGNU for Renesas Rx(14.2.0)を用いた場合、既存ファームウエアに使用したツールチェイン(GNUH8 v12.02)では処理されていた、printf や vsprintf といった関数を用いて単精度浮動小数を文字列に変換する処理(例えば、vsprintf(sendchar, %+.*f, digit, hoge);)においてプログラムが止って大変困りました。解決の手順についてご説明します。
【単精度浮動小数の文字列表示が出来ないときの対処法】
- 整数部と小数部をそれぞれ4バイト整数型として宣言する。(小数点第3位まで表示する場合、2バイトの整数型(short int)ではオーバーフローしたので、余裕をみてlong int型としています。)
- 小数点第2位までの表示するとき、元の値 (float)C に対して、整数部と小数部を算出するため定数(A、B)を以下の様に算出する。
- A = (long) (C * 100) ← 整数部を計算するため
- B = abs(A) ← 少数部を計算するため
- 整数部と小数部を計算して合体する。例えば、vsprint (sendchar, %d.%02d, A / 100, B % 100)
- 小数点第1位まで表示するときは10倍、小数点第3位まで表示するときは1000倍とする。
同様の内容が、Renesas Electronics HPのナレッジベースFAQ(GCCプロジェクトでsprintf等のfloat出力値が正しくならない)の中に掲載されていますので参考にしてください。データが少ないためか、生成AIに質問してもなかなか解決にたどり着けず、かなり苦労しました。

