• ベストアンサー

h8 モニタプログラムの改良について

はじめまして、H8初心者です. 現在実務訓練でH8/3048Fを使用して、測定機器を作成しているところです。そこで、モニタプログラムをROMに書き込むまでできているのですが、Htermを利用してRAMに書き込むプログラムの容量が足りないということで、ROMの余っている部分に関数を書き込みRAMの要領を出来るだけ確保しようと考えています。しかし、いろいろなHPで調べているのですが初心者にはよくわからないことが多く、質問させていただきました。 一応使っているコンパイラ、アセンブラ、リンカは付属CDの秋月製のものです。いろいろと試して、ライブラリ関数を宣言してオブジェクトファイル形式にしようとしているのですが作成されたMAPファイルを見てみても関数が含まれておらず、よくわかりません。 方法としてWatoson8さんという方がその方法について解説しているホームページを参考にさせていただこうと思いましたが、その方法が深く理解できないため、足踏みしている状態です。 そのホームページの内容を秋月製のコンパイラなどを使用して作成する方法でも、その他の方法でも何か知っていることがあったら教えていただきたいです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.8

--just-symbols についてもう少し説明します。 昔、intel8086向けの純正の環境で publicsonly というリンカーの 命令を使っていました。たぶん同じものだと思います。 通常のオブジェクト同様にシンボルで解決しますから、ヘッダファイルは 分ける必要はないはずです。リンカーは、リンクするファイルの前から順番にシンボルを 解決しますので、ライブラリよりも前に--just-symbolsを書いてやれば ライブラリ側がリンクされないはずです。 リンカー、ロケータの解説 リンカーの動作は、各publicシンボルをつなぎながらコンパイルしたオブジェクト をくっつける動作をします。さらにロケート(番地)が指定されていればロケート を実施します。 リンカーで、--just-symbolsとするとロケート済みオブジェクトからシンボルのアドレス のみ解決します。monitor.coffはリンカーにはオブジェクトは追加されません。 つまり 例)(アドレスは大雑把なので実際にはそうならないと思いますが) ROMの中に 110H番地 に printf() 関数 がある ライブラリに printf()がある。 sprintf()がある ユーザープログラムは 8000H番地からロケートされる モジュール test.c の80行目にprintf()が使われている 場合 8120H番地に JSR 110H ; printf() みたいにリンクでシンボルが解決されます。 sprintfは、 ユーザープログラムの後ろの 8230Hあたりにロケートされます。

参考URL:
http://wolverine.caltech.edu/tools/link86.htm

その他の回答 (7)

  • R32C
  • ベストアンサー率39% (115/290)
回答No.7

GDLは、シングルソース限定の環境だそうで、今回の「実務訓練」ではそれを 使わずにすることが必要になるように思います。 ここで他に参考に案内されたURLはたぶんどこもGDLでROMモニタをビルドしていない はずです。 ルネサス標準のものはたぶんバッチになっていたと思うのでバッチファイル とリンカーのリンクファイルを修正(追加)すれば可能かと思います。 ただ、ちょっと感じたのは、多くのいい回答がされていますが、 理解できていないように思います。 2点ほど確認しますが、 1)今お使いのROMモニタが自分でコンパイルビルドしてフラッシュに書いたのですか? 2)ROMモニタのビルドの環境が   ・バッチファイル   ・GDLなどの統合環境   ・make のいずれですか? またその設定ファイルの内容は確認していますか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

#2のzwiですが追記です。 こんなページがありますね。 http://www.wakayama-u.ac.jp/~miw/linux/pukiwiki/pukiwiki.php?SuperRom%A4%CE%BA%EE%A4%EA%CA%FD ただし、「3048用は動作不良のため、削除しました。」とありますので自力で解決する必要があります。たぶん、gccのコンパイラとリンカの仕組みに詳しくないと手出しが難しいと思いますが参考にして挑戦する価値はあるでしょう。 これでは、標準ライブラリのprintfとsscanfをROM化してますが私が難しいといった理由は、標準ライブラリヘッダとROM化した関数のヘッダの衝突を自力で回避できるなら挑戦しても良いと思います。気をつけることはヘッダの順番です。

utaibito33
質問者

お礼

ありがとうございます。 以前からこのページとはにらめっこしてますが(笑)初心者にはむずかしいですね>< ヘッダとの衝突とかも考えなくてはいけないのが難しいですね・・・

  • R32C
  • ベストアンサー率39% (115/290)
回答No.5

自作の関数ではなく、ライブラリ(ファイル)をROMにおきたいという ことなのですか? であれば、ダミーのモジュールを追加して必要関数をダミーモジュール から呼び出すようにすればリンクしてくれると思いますが? これはROMを作るときの話です。 URLの「ユーザープログラムのリンク」を参照ください。 これは、RAMのプログラムがROMのライブラリを使うときのリンク方法です。 まずROM側が優先してリンクされ残りがライブラリからリンクされる そうです。ライブラリを分離しなくていけそうな感じです。

参考URL:
http://www.kikaiken.org/lib/program/h8monitor/doc/linking.html
utaibito33
質問者

お礼

ありがとうございます。 先週からGDLに環境をうつすことになったので、それでやってみたのですが、一応vsprintf vfprintf関数(とても容量を必要とする)においては、コンパイルに成功しました。あとはどう、モニタと一緒にするかということです。 しかし、モニタと一緒に書き込む場合に、GDLでもう一度モニタをつくるようにしてから、リンクで二つを一緒にしようと考えるのですが、ルネサスさんのモニタをGDLの環境でアセンブル、コンパイル出来なくて、どこをどのように修正したらいいのか悩んでいます(^^; これがわかれば、モニタプログラムを作れる段階にしてあとはリンクだけなのですが・・・

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

#2のzwiです。 >実際にライブラリ関数などをROMに書き込む方法としてはどのようにしたらよいでしょうか。 って事は、C言語の標準ライブラリ(memcpy等)をROMに書き込みたいって事ですか? RAM側のプログラムが参照するC言語の標準ライブラリをROM側に置くのは、色々とややこしい事になるのでお勧めできません(出来ないわけではないです)。 「測定機器プログラム」の一部の関数だけをROMに移すだけなら簡単なので、そちらをお勧めします。 >でも、実際にその関数だけを抜き出す方法をどうするのかがわからなかったりします。 抜き出す方法は、ROMに移す関数のソースコードを分離する必要があります。ROMにリンクする関数を専用ソースコードに移して、モニタと一緒にコンパイル・リンクします。 「測定機器プログラム」のソースコードから、ROMに移した関数たちは削除します。 >その方法がわかれば、モニタとうまく重ならないようにリンクさせMAPファイルからアドレスを探してやろうと思うのですが・・・ 何か勘違いしているような? リンカがアドレスを解決してくれますので、「モニタとうまく重ならないようにリンク」は考えなくて良いです。

utaibito33
質問者

お礼

勘違いしていました。リンクでアドレスの配置はやってくれるんですね。現在は、出来るだけ、RAMにおかれるものなどの削減を行うために、関数をかけるかどうか確かめてるので、それで出来たらいいって感じでやってます。 回答ありがとうございます。

  • yphkz4063
  • ベストアンサー率23% (34/144)
回答No.3

質問内容がよくわからないので、まんま#1様や#2様の回答の延長になるとおもいますが・・・。 経験的に開発環境というものは、たいがいは何かが足りないものなのです。 不足する開発ツールは自前でつくります。 例えば通称mapperといわれるアドレスとシンボルを管理するツールとかです。 よくやるのが一度リンクしたmapファイルからシンボルなど必要な情報を取り出して、リンクに必要なデータを再構築してもう一度リンクし直すなどです。 二回リンクする・・・ひょっとしたらこれが回答だったりするかも知れません。 実際はこれを手でなくツールでやります。 場合によってはincludeファイルを自動的に作り直して、もう一度コンパイルからやり直すとか。 一見バカみたいなやり方ですが、特に組み込み型の開発の場合はこれをやらないと開発できないこともあります。 その他makefileをつくるためのmakefileとか、現場ではとても原始的なことをやってます。 開発工程の何分の一かがツールの開発であるようなことはよくありますよ。 学習のためなら一時的に手動開発(?)も勉強にはなると思います。

utaibito33
質問者

お礼

ありがとうございます。参考になります。しかし、まだ、H8を始めて3週間の私にとっては、再構築してもう一度リンクしなおすという方法も良くわかりません。 一気に上級な方法をやりすぎなのでしょうか。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

H8は使ったことが無いのですが、どのマイコンでも使えそうな一般的な方法を書かせてもらいます。 ROMに書き込むモニタに「測定機器プログラム」の一部の関数をリンクする事でROM側に関数を移して使用するRAM容量を減らしたいという理解でよろしいですね。 次のような手順で作業するのがひとつの方法です。 (1)モニタのオブジェクトファイルに「測定機器プログラム」から抜き出した関数だけのソースをコンパイルしたオブジェクトファイルをリンクする。これをモニタとしてROMに書き込む。 (2)モニタにリンクした関数のアドレスをモニタのmapファイルから自動か手動で取得して関数ヘッダを生成する。 #1のR32Cさんが書かれている2)の方法です。 (3)関数ヘッダを「測定機器プログラム」にインクルードして利用する。 変更の少ない関数をROM側に移動させないとROM書き換えが多く効率的ではありませんので注意してください。

utaibito33
質問者

お礼

なるほど、そうすれば、RAMに書き込んだプログラムからROMの関数を使用したいときに場所がわかるようになっているということでしょうか。 現在は、この方法で、サンプルプログラムが動くかどうかテストしたいと考えてるので、変更の少ない関数意外も移動させてしまうかもしれません。 でも、実際にその関数だけを抜き出す方法をどうするのかがわからなかったりします。その方法がわかれば、モニタとうまく重ならないようにリンクさせMAPファイルからアドレスを探してやろうと思うのですが・・・

  • R32C
  • ベストアンサー率39% (115/290)
回答No.1

やり方は複数あるみたいですね。 一般的にROMにあるシンボルをどのようにリンクするかですが、 1)リンク時にROMのファイルからシンボルのみ参照する方法 --just-symbols=../../monitor-1.2-3069/monitor.coff 2)MAPを見て絶対アドレス #define OUT_STRING (( char * (*)(const char * ))0x00xxxxxx) xをマップをみて埋めるようです。 がネットに掲載されていました。 たぶん後者を参照されているのでしょうか。 さて、 >一応使っているコンパイラ、アセンブラ、リンカは付属CDの秋月製のものです。 >いろいろと試して、ライブラリ関数を宣言してオブジェクトファイル形式にしよう >としているのですが作成されたMAPファイルを見てみても関数が含まれておらず、 >よくわかりません。 これはROMに自作の関数をライブラリとしてリンクしたのでしょうか? それであれば、ROMの他のルーチンから呼び出されていないので、なにも取り込まれなかった だけかもしれませんね。

utaibito33
質問者

お礼

ありがとうございます。その方法をイメージしてました、参考になります. ROMに関数を書き込もうとしたときに、ただ、アセンブリ言語でライブラリ関数を宣言しただけのオブジェクトファイルをリンクしただけなので、失敗したのでしょうか。 実際にライブラリ関数などをROMに書き込む方法としてはどのようにしたらよいでしょうか。

関連するQ&A

  • GDLの環境でH8モニタプログラムの作成について

    先日、GDLのコンパイル方法についてたずねて一つ一つ行うことが可能になりました!ありがとうございます。 また質問になってしまいますが、H8のフラッシュROMにGCCのライブラリとモニタを同時に書き込むために、現在GDLの環境でルネサスさんからダウンロードしたモニタプログラムをコンパイルしようとしています。 モニタプログラムは秋月製のコンパイラを使用しした場合、参考ホームページもたくさんあり、うまく出来たのですが、GDLで行うとなると、環境が違うのか 例として AAA.src というファイルがアセンブラ言語で書かれていた場合、アセンブルを行うとエラーが発生してしまいます。 やはり、環境が違うため書き方が違うみたいです。 プログラムの内容は全く初心者で、そのファイルの内容をどのように変えればうまくコンパイルできるかわかりません。何でもいいので参考になるようなものがあれば、教えていただきたいです。 また、GDL環境でモニタプログラムを作成しているようなページがあれば教えていただきたいです。 聞いてばかりで申し訳ないですが、よろしくおねがいします。

  • H8 3052Fのモニタープログラムが動きません

    H8の3052F(秋月)のモニタープログラムについて教えて下さい。 以下のURLの[準備編へ] [設定編へ] [作成編へ] [実行編へ] [HTerm編へ]を参考に行いました。(MONITOR.MOTはH8WriteTurboソフトでROM書きしました。) http://uhiro.fc2web.com/software/monitor01/index.html 次にHEWのC言語で作成したプログラムをビルドすると、Debugフォルダーの中にMOTファイルができたので、これをHtermでロードしたところ下のようなメッセージが表示されます。 : L Top Address=00000 End Address=008AD : 正常な場合は、Top Address=FE000になると思うのですが、 上記のアドレスになってしまいます。 (G 00000やG FE000としても実行されません。) HEWのビルドを行う前には何も設定をしていないのですが 何か行う必要があるのでしょうか? 初心者のためプログラム自体に問題があるのかもしれません。 よろしくお願い致します。

  • GDL(GCC DEVELOPER LITE)のコンパイルについて

    H8/3048Fマイコンのプログラミングをやりはじめた初心者です. これから、秋月製のコンパイラ、アセンブラ、リンカではなくGDLを使用しようと思って、今日から使用し始めたのですが、GDLはリンクまでを一気に行ってしまうのですね。 例えば、A.c,B.c,C.cの三つのC言語ソースファイルをコンパイルして3つをリンクさせようとする場合はどのようにしたらよいでしょうか? 一つ一つコンパイルしてオブジェクトファイルを作成する方法がよくわかりません(マニュアルやヘルプの説明が短い・・・)。 3048Fマイコンを買ったときについてきたサンプルプログラムをコンパイル、リンクしようと考えてるのですが、そこでつまづいています. 3つのC言語ソースファイルを1つにしてやったらできましたが、.MOT形式の出力ファイルがもともと存在していたファイルとサイズがぜんぜん違っているので、何かおかしいのではないかと考えています. 何かわかることがありましたら、何でも良いので教えてください.

  • アドレスを指定して関数を呼び出す方法は有りますか

     マイコンのROMに書いてある関数を呼び出すのに、次のような方法を使っています。  1000番地のsub1と言う関数を呼ぶのにアセンブラで次のように書き、リンカで結合しています。 sub1: EQU 1000  これをアセンブラを介せずC言語だけで行う方法は無いでしょうか。 イメージ的には次のような感じで1000番地のプログラムを呼びたいのです。  この方法では上手く行かないのは分かっていますが、それを何とかしたいと思っています。 #define sub1 1000 sub1() ;  宜しくお願いします。

  • H8(マイコン)のプログラムサイズ

    マイコンの勉強ということでH8/3694F(ROM:32KB、RAM:2KB)を 購入しました。 開発環境はルネサスのHEWを使い、プログラムは同社のFDTを使って 拡張子motファイルをROMに書き込んでいるのですが、そのmotファイル が59KBであることに気付きました。 59KBだとCPUのROMサイズ(32KB)を超えているのですが、これは32KB分 までしか書き込まれていないということになるのでしょうか? プログラム実行中は問題なく動作しているように見えるのですが・・・ また、プログラムサイズを簡単に確認する方法、見積もる方法など 参考になるサイトをご存知でしたら教えて下さい。 よろしくお願いいたします。

  • モニタプログラムとの通信ソフトHtermのソースレベルデバッグについて

    自分は現在実務訓練において、h8/3048Fマイコンを使用して、光センサを用いた測定機器を作成しようとしている学生です。 その中でルネサス様のサイトで公開しているHtermというマイコンのROMに書かれたモニタプログラムとの通信ソフトウェアのソースレベルデバッグについて質問があります。 ソースレベルデバッグを行うにはコンパイルしたプログラムの出力形式がデバッグ情報をつけたELF/DWALF2形式ではいけないみたいです。 例えば同じくルネサス様のコンパイル、ビルドの総合開発環境のHEWだと、出力形式がELF形式にできるみたいなのですが、他にもcygwinを用いてgccのコンパイル環境を自分で構築すれば可能であるとインターネットで調べているうちに発見しました。 実際にそのコンパイラ環境 binutlis version 2.16 gcc version gcc-core-3.4.3 newlib version 1.13.0 (target=h8300-elf) で構築を行いました。そして、LCDに文字を出力するサンプルプログラムをデバッグ情報をつけるコマンド(-g)をオプションにつけてコンパイルし、Htermを使ってマイコンのRAMに書き込みましたが、 その後に「ソースプログラムを表示しますか」というコメントが表示されるのはいいのですが、「Ok]をクリックすると 「CPUないし動作モードが正しくありません」 と表示されてしまいます。これでは、ソースレベルのデバッグを行うことができません。 動作モードはそれぞれ一通りのモードで同じ事をやってみましたが、上記のエラーが表示されてしまいます。h8用のコードを作成するために-mhというコマンドもつけてコンパイルしています。 このエラーに対してなにか知っている人がいましたら、回答のほうよろしくおねがいします。

  • H8 3052 のプログラムで、少数のべき乗計算

    H8 3052 のプログラムで、少数のべき乗計算がしたいです。 y=4610.6x^(-1.156) という計算を入れたいです。 H8 3052 ヘッダファイル 3052f.h stdio.h math.h メイン関数で 1 x2=ad1_val; 2 y2=4610.6*pow(x2,-1.156); 3 if(y2>20){s2_flag = CW;} 4 if(y2<20){s2_flag = CCW;} このプログラムだと動作しません。 1 x2=ad1_val; 2 y2=x2/2; 3 if(y2>150){s2_flag = CW;} 4 if(y2<150){s2_flag = CCW;} このプログラムだと動作しました。 2行目のpowの式のせいで動作エラーするみたいなんですけど、 pow関数はH8 3052 では使えないのですか? それとも他に書き足すことがあるのですか? pow関数が使えないのなら他に方法はないですか? コンパイラは CC38H.exe です。 お願いします。

  • 秋月のH8/3052Fがプログラム書替え不能になったことを知るには?

    秋月のH8/3052Fボードを使っています。 H8Write-TurboでROM上に書き込んでデバックしています。 H8Write-Turboとしては書込みできるのですが プログラムを変えても、以前のプログラムが動作しています。 (プログラムが未完成のときはこのことに気が付くまでに大変、 時間を浪費してしまいました。) H8/3052Fのプログラム書替え限界に達したようです? H8Write-Turboとしては書替え限界に達したとき 何かメッセージをだすのでしょうか? (出さないと困るのですが) 書替え回数は100回ぐらいと聞いたような気がしますが、 実力的な回数の経験をお持ちの方、教えてください。

  • H8マイコンについて教えてください。

    僕はPICをやっていますが最近H8マイコンの高機能さに魅力を感じ はじめてみたいと思うようになりました。 そこで以下のことについて教えてほしいです。 質問1 PICは石単体で買ってきてそれにプログラムを書き込み 水晶やらその他の部品を取り付けて作っていくのでH8も 石単体で買ってくるものだと思ってました。 でも調べてみると秋月のマイコンボードみたいに 基盤に水晶やら抵抗やら色々半田付けされてて それにプログラムを書き込んで作るようなのが沢山ありました。 H8は石単体で買ってくる物ではないんですか? (もしくは足のピッチを2.54に変換したもの) 画像検索で調べるとDIPタイプのH8もあるようですが・・・ 質問2 H8へのプログラムの書き込みですがPICでは "PIC ライター"とかで検索するとライターの作り方とか 自作ライターのページが沢山出てきますがH8に関しては ぜんぜんヒットしません。 僕のイメージとしてはゼロプレッシャーのついたライターを作って それにH8をセットしプログラムを書き込むものだとばかり 思ってたんですがH8はどうやってプログラムを書き込むんですか? 質問3 部品の配置やブレップボードで自由度が高いので できれば表面実装ではなくDIPやPLCCみたいな石で ライターに刺して作れるといいんですが・・・ 表面実装以外はあまり一般的ではないんでしょうか? 質問4 使用する言語についてですがPICではアセンブラでは アセンブラを使っています。 でもH8はC言語も結構やってる人が多いみたいでC言語自体も 興味があるのでそっちでやろうかと思っています。 でも部分的にアセンブラ(インラインアセンブラ?) が必要なってくる部分があると思うんですが やっぱり全部アセンブラのほうがやりやすいんでしょうか? 以上、よろしくお願いします。

  • AKI-H8から16進2桁のH'00をコマンド送信したいのですが

    はじめまして、どなた様かご教示お願い致します。 AKI-H8/3048FのBASICコンパイラを用い16進2桁のコマンドをシリアル ポートから送信するプログラムを作っています。 CHR$(&H01), CHR$(&H02)はそれぞれ"01"、"02"として送信されている ことをRS232Cラインモニターの16進数表示で確認しました。 ところがCHR$(&H00)を同様に送信してもNUL扱いされてしまい何も実行 されません。ラインモニターでも無視されていることを確認しました。 どうしてもコマンドとして16進2桁の"00"を送信する必要があります。 自分なりに他の関数やアセンブラでもトライしましたが初心者ゆえ 行き詰まりました。宜しくお願い致します。 確認用のプログラムは以下です。 SERIALSET 1, 9600, 8, 1, 0 :!START PRINT #-1, CHR$(&H02) WAIT 1500 PRINT #-1, CHR$(&H01) WAIT 1500 PRINT #-1, CHR$(&H00) WAIT 1500 GOTO !START

専門家に質問してみよう