May 27, 2004

H8モニタで浮動小数点を

導入したH8モニタには、printfの機能が内蔵されていましたが、H8本体の内蔵メモリで実行できるようなサイズにおさえるために、文字列のみの表示が可能のようです。
つまり内蔵モニタのprintfにとっては、%fなどの浮動小数点の表示はもってのほか、ということなのでしょう。

しかし、なんとかして浮動小数点演算の結果を表示したい。強引ですが、やってみました。秋月の3069にある増設RAMの2Mbyteという大量のワークエリアをもってすれば、それが可能なのです。
単純な話で、内蔵モニタのprintfをする前にライブラリのsprintfで文字列に変換し、それを内蔵モニタのprintfで表示させればOKです。

FloatH8.jpg
できましたっ!!

ソースは続きをどうぞ。

#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

これはリンカスクリプトの中に_endという領域が定義されていないためにおきるエラーで、_endはプログラム領域の最後(普通はbssセクションの最終アドレス)をさすようにすれば解消されます。ヒープからメモリを使用するときに参照されているようです。

開発環境についてはこちら、あとリンカスクリプトスタートアップルーチンMakefileを公開中です。

19:46 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/267
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。