H8モニタで浮動小数点を
導入したH8モニタには、printfの機能が内蔵されていましたが、H8本体の内蔵メモリで実行できるようなサイズにおさえるために、文字列のみの表示が可能のようです。
つまり内蔵モニタのprintfにとっては、%fなどの浮動小数点の表示はもってのほか、ということなのでしょう。
しかし、なんとかして浮動小数点演算の結果を表示したい。強引ですが、やってみました。秋月の3069にある増設RAMの2Mbyteという大量のワークエリアをもってすれば、それが可能なのです。
単純な話で、内蔵モニタのprintfをする前にライブラリのsprintfで文字列に変換し、それを内蔵モニタのprintfで表示させればOKです。
ソースは続きをどうぞ。
#include <stdio.h>
#define printf ((int (*)(const char *,...))0x00002bb0)
#define scanf ((int (*)(const char *,...))0x00002c02)
int main(){
char c[256];
double d = 123.3;
d *= 2.3;
sprintf(c, "%f\n", d);
printf("%s\n", c);
return 0;
}
注意点を2つほど。
ライブラリのprintf系の関数は非常に大きいです。従ってサイズが飛躍的に増えます。十分なメモリ領域を確保してください。
あと、stdio.hをいれるとld(リンカ)から次のような文句をいわれることがあります。
/usr/local/h8300-elf/lib/h8300h/libc.a(sbrk.o)(.text+0x1a): In function `_sbrk':
../../../../../../../newlib/libc/sys/h8300hms/sbrk.c:17: undefined reference to `_end'
collect2: ld returned 1 exit status
../../../../../../../newlib/libc/sys/h8300hms/sbrk.c:17: undefined reference to `_end'
collect2: ld returned 1 exit status
これはリンカスクリプトの中に_endという領域が定義されていないためにおきるエラーで、_endはプログラム領域の最後(普通はbssセクションの最終アドレス)をさすようにすれば解消されます。ヒープからメモリを使用するときに参照されているようです。
開発環境についてはこちら、あとリンカスクリプトやスタートアップルーチン、Makefileを公開中です。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。