ルネサス H8、SH2用デバッガーのサイトがわかりにくい! [HEW & HTERM]
SH2用
https://www.renesas.com/ja-jp/support/training/seminar/independent/sample-program/sample-sh.html
H8用
https://www.renesas.com/ja-jp/support/training/seminar/independent/sample-program/sample-h83.html
HTERM
https://www.renesas.com/ja-jp/media/support/training/seminar/sample-program/htermmdi.exe
H8マイコンにデバックモニタを入れる。HTERMでデバックをする 2。 [HEW & HTERM]
HEWを起動して、新たにワークスペースを作成しても良いのですが、関連と言う事で前に作成したsampleワークスペースの中に新たにプロジェクトを作成して、そこにアプリケーションを構築しましょう。
では、sampleワークスペースを開いてください。
次にファイルメニューの「プロジェクト(P)」→「プロジェクトの挿入(I)」でウイザードを起動し、「新規プロジェクト」を選択して先に進みます。ここから先は最初にワークスペースを生成した手順と同じになりますので、差分だけ以下に紹介します。
という訳で実にお手軽なマイコンによるHello Worldでした。
もうご存知かと思いますが、ユーザーアプリケーションの転送はRAMに行われますので、一度電源を落としてしまうと再ロードが必要です。逆にFLASH ROMを使わないので幾らでも書き換えが可能です。
逆にRAMの容量の上限がユーザープログラムで作成できるサイズの上限でもあります。H8/TinyのRAM容量ではかなり苦しいですね。
普通、マイコンの開発では標準入出力がありません。なのでstdioの中の標準入出力を利用する関数を実際に動くようにするには、ユーザー側でそれを実現してやる必要があります。
しかしデバックモニタ上で動かす場合、既にデバックモニタが入出力のインタフェースとしてSCIを利用しているので、ここを標準入出力として使いましょう!と言うのが「組み込み型モニタのカスタマイズ」htmファイルの趣旨なのです。
デバック完了してオリジナルのアプリケーションをROM化する時は、自分で標準入出力を実現する必要があります。詳細はC/C++コンパイラマニュアルに書かれていますので、ご一読ください。
H8マイコンにデバックモニタを入れる。HTERMでデバックをする。 [HEW & HTERM]
まず手順の説明を開始する前に、HTERMでのデバックの概要について簡単に書いておきます。
H8/300Hマイコンの内、後発のH8/Tinyシリーズについては設計段階からオンチップデバック機能を搭載しており、E8エミュレーターを使ってデバックが出来る事は前に紹介しました。
しかしその前からあるH8/300Hマイコン、一般的なのはH8/3048F、H8/3052F、H8/3069Fにはチップ内部にオンチップデバック機構を持ちません。
つまりこれらマイコンにはハードウエア的なデバック機能が無いので、ルネサスのセミナー講師であるKさんがソフトウエアによるデバック機能を実現しました。
インタフェースにはSCIを使用します。(複数SCIがある時はブートモードで使用するSCIがデフォルトで選ばれている。)
確か1995年位ではなかったでしょうか、当時の日立、現在のルネサスの半導体セミナー(無償セミナーの方)でデバックモニタの実現方法に付いて講習を行っていました。当時インターネットはまだ十分に普及しておらず、サポート用にniftyのメールアドレスをもらっています。
当初はデバックモニタのみのリリースでしたが、後にこのデバックモニタの機能を使いこなすべく、GUIで操作できるHTERMを当を本人が開発され、現在ではデバックモニタ、HTERM共に上記写真のページ(ルネサスの半導体セミナーのページからサンプルプログラムに進む)で提供されています。
なお、デバックモニタにしろ、HTERMにしろ、GCCで作成したモジュールを扱う事もできますが、特にHTERMの機能を十分に使いこなせないので、開発はルネサス純正のツールチェインを使った方が良いでしょう。
以上、概要は終了
では上記写真のページに辿り着いたら
「HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H用 モニタプログラム」または「HEW3,HEW4(C/C++ Compiler Ver. 6.0)対応版 H8/300H Tiny用 モニタプログラム」と、
「モニタプログラム専用通信ソフト Hterm」をダウンロードしてください。
※300hhew3.exe、300thew3.exeは実行形式のファイルなので、場合によってはセキュリティソフトに文句を言われるかもしれませんね。
ダウンロード後、適当なフォルダで自動解凍を行います。
すると、Opera上に自動的に「組み込みモニタのカスタマイズ方法」と言うページが開きました。なーんだ、解説要らないジャン。
※下手な解説読むより、作った本人の解説があれば、そっちを読んだ方が良いのは言うまでもないですよね。それでも判らない事が有ればコメント欄へどうぞ。
と言う訳でまずは展開されたreadme.htmを読んでください。同じ事を解説しても無駄ですから。
あとmonitor.htmの方も読んでおくと良いでしょう。
※できれば「printf関数、scanf関数のサポート」を読んで、これら機能を一緒に組み込んで置くとお得です。
ダブった事は書いてもしょうがないので、マイコンに依存する所のみ紹介して置きます。
※特にROM容量をケチる必要も無いので、「組み込み型モニタの機能選択」は行わず、フル機能で構築しています。
※ボーレートの設定値ですが、使用するマイコンのデータシートのSCIのBRRの項目に、親切にも計算済みの値が書いてありますので、それを使ってください。但し記述は16進です。
例1.H8/3069Fマイコンの場合。秋月の3069FLANボードを想定。CPUクロック20MHz、DRAM16Mbit、ボーレート38400bps、printf、scanfの実現有り。
monitor.src
;************************************************************************ ;* H8/300H Monitor Program (Advanced Mode) Ver. 3.0A * ;* Copyright (C) 2003 Renesas Technology Corp. * ;************************************************************************ .PROGRAM INITIALIZE ; Program Name .CPU 300HA ; CPU is H8/300H Advanced .SECTION ROM,CODE,ALIGN=2 ; ROM Area Section ;************************************************************************ ;* Export Define * ;************************************************************************ .EXPORT _INITIALIZE ; User Initialize Module ;************************************************************************ ;* User Initialize Module * ;* Input ER5 <-- Return Address * ;* Output Nothing * ;* Used Stack Area --> 0(0) Byte * ;************************************************************************ _INITIALIZE: ;DRAM空間はCS2に取られている。16Mbit、8bitバス、60nsのDRAMが実装済み ;PORT1、2、5を初期化しアドレスを出力モードにする P1DDR .equ h'fee000 P2DDR .equ h'fee001 P5DDR .equ h'fee004 P8DDR .equ h'fee007 ASTCR .equ h'fee021 ;アクセスステートコントロールレジスタ WCRH .equ h'fee022 ;WAITコントロールレジスタ WCRL .equ h'fee023 ;WAITコントロールレジスタ DRCRA .equ h'fee026 ;DRAMコントロールレジスタA DRCRB .equ h'fee027 ;DRAMコントロールレジスタB RTMCSR .equ h'fee028 ;リフレッシュコントロール/ステータスレジスタ RTCNT .equ h'fee029 ;リフレッシュタイマカウンター RTCOR .equ h'fee02A ;リフレッシュタイムコンスタンとレジスタ ;コメントを付けると内蔵メモリだけの利用となる mov.b #h'ff,r0l mov.b r0l,@P1DDR ;PORT1 アドレス出力 mov.b #h'07,r0l ;A10まで有効とする mov.b r0l,@P2DDR ;PORT2 アドレス出力 mov.b #h'e8,r0l ;松川様の連絡により判明 mov.b r0l,@P8DDR ;PORT2 アドレス出力 mov.b #155,r0l ;155で約64KHzのリフレッシュ ; mov.b #99,r0l ;99で約100KHzのリフレッシュ mov.b r0l,@RTCOR ; mov.b #h'0F,r0l ;b'0000 1111 mov.b r0l,@RTMCSR ;Φ2 mov.b #h'98,r0l ;b'1001 1000 mov.b r0l,@DRCRB ;カラムアドレス10bit ; mov.b #h'3c,r0l ;b'0011 1100 fast page のバーストモード用 ; mov.b #h'34,r0l ;b'0011 0100 フルアクセス用 mov.b #h'38,r0l ;b'0011 1000 峰松さんお勧め、FAST PAGE、EDOドンと来い設定。バースト有りのRASアップモード用 mov.b r0l,@DRCRA ;エリア2をDRAM空間に設定、FPモード、RASダウンモード ;8リフレッシュサイクル分のwaitを入れる(リフレッシュサイクル100KHz時) wait80u .equ 80*100/64 mov.l #wait80u,er0 ;ループ数の設定 refresh_loop: ;1ループ1μs(20MHz時) nop ;nopは2ステート消費 nop ;nopは2ステート消費 nop ;nopは2ステート消費 nop ;nopは2ステート消費 nop ;nopは2ステート消費 nop ;nopは2ステート消費 dec.l #1,er0 ;dec.lは2ステート消費 bne refresh_loop ;bneは6ステート消費 ; JMP @ER5 ; Goto Monitor Program .END ;
monitor.sub
INPUT ADVANCED,MONITOR,LOWER LIST MON3068R20.MAP SHOW SYMBOL OUTPUT MON3068R20.MOT FORM STYPE NOOPTIMIZE LIBRARY ADVANCED,3068 LIBRARY MONITOR DEFINE $BRR=0F DEFINE $STACK=0FFFF20 START VECTOR/0,ROM,C/100,RAM/0FFBF20,USER/0FFBFF4,SCI/0FFFFB8
例2.H8/3048Fマイコンの場合。CPUクロック16MHz、外部メモリ無し、ボーレート38400bps、printf、scanfの実現有り。
※INITIALIZEには特に書く事が無いので、subファイルのみ紹介。
※3048Fに付いては、いま動かせる基板が無いので動作未確認。
INPUT ADVANCED,MONITOR,LOWER LIST MON3048N16.MAP SHOW SYMBOL OUTPUT MON3048N16.MOT FORM STYPE NOOPTIMIZE LIBRARY ADVANCED,3048 LIBRARY MONITOR DEFINE $BRR=0C DEFINE $STACK=FFFF10 START VECTOR/0,ROM,C/100,RAM/0FFEF10,USER/0FFF030,SCI/0FFFFB8
例3.H8/3694F Tinyマイコンの場合。CPUクロック20MHz、ボーレート38400bps、printf、scanfの実現有り。
※INITIALIZEには特に書く事が無いので、subファイルのみ紹介。
INPUT NORMAL,MONITOR,LOWER LIST MON3694N20.MAP SHOW SYMBOL OUTPUT MON3694N20.MOT FORM STYPE NOOPTIMIZE LIBRARY NORMAL,3694 LIBRARY MONITOR DEFINE $BRR=0F DEFINE $STACK=FF00 START VECTOR/0,ROM,C/100,RAM/F780,USER/F880,SCI/FFA8
※以下のSUBファイルの記述は修正が入っています。
START VECTOR/0,ROM,C/100,RAM/F780,USER/F880,SCI/FFA8
USER/F840→USER/F880
MOTファイルが出来上がったらFDTでターゲットに書き込みます。
※HTERM自体にも書き込み機能が有るのですが、H8/3069F以外は自前で書き込みモジュールを用意する必要があります。書き込みモジュールの作り方も何処かにドキュメントが有った筈なんだけれど。
書き込みが完了したらFDTとターゲットとの接続を解除し、HTERMを立ち上げて(COMポート番号とボーレートには注意して)コンソールを開きます。
ターゲットの動作モードをブートモードから通常の動作モードに切り替えて、電源の再投入かリセットを実行します。
以下の画面が表示されればデバックモニタの構築は完了です。
H8でLEDチカチカ、、、まずはここからですね。 [HEW & HTERM]
次に出来上がったsample.motをH8マイコンに書き込む為、FDTを起動してください。
※H8マイコンとはUSB/シリアルで接続しています。今回はCOM9になっています。
実際に使用するCOMポート番号は事前にデバイスマネージャー等で調べておきます。
「C言語でH8マイコンを使いこなす」は是非ご一読頂きたい本です。目から鱗です。
H8開発環境HEWのウイザードを使ってプロジェクトを作成する。& 構成ファイルを眺めてみる。 [HEW & HTERM]
ウイザードが作成したファイルの内、重要なファイルに付いて簡単に解説しておきます。
dbsct.c | データセクションの初期化を行う時の参照情報が納められています。 |
intprg.c |
割り込みベクターアドレス及び、割り込みサービスルーチンのエントリー関数が納められています。
ウイザード中に「ベクターテーブル定義」にチェックが入っていた場合に生成されます。 |
resetprg.c |
リセット直後に実行されるプログラム(通常CRTと呼ばれる)処理が書かれています。 最終的にはここから関数mainが呼ばれます。 |
sample.c | 関数mainが納められています。ユーザーはこのファイルを編集する事になります。なお、ファイル名はプロジェクト名が付けられています。 |
sbrk.c | ウイザード中にHEAPを使う様に設定した場合に、HEAP領域の管理を行う処理が書かれています。 |
sbrk.h | ウイザード中にHEAPを使う様に設定した場合の、HEAPサイズが定義されています。 |
iodefine.h |
使用するマイコンのIOレジスタを、アクセスし易い様に構造体定義したファイルです。
ウイザード中に「IOレジスタ定義ファイル」にチェックが入っていた場合に生成されます。 |
stacksct.h | ウイザード中に設定したスタックサイズが定義されています。 |
通常はワークフローで「自前で用意する必要があるファイル」と紹介したファイルも、ウイザードを使うと黙っていてもここまで作成してくれちゃいます。
昔HEWがリリースされた頃、こう言った便利な機能に「おっ!」って思った物ですが、最近色々なIDEを使っていますが、もう当然の機能となっていますね。
某Aと言う開発環境が、「割り込みベクターやCRTを書かなくてもマイコンが使えるから便利だ!」と紹介されているのを見たりしますが、IDEを使用した一般的なマイコンの開発現場ではもう何年も前からあたり前になっているの事なので、一体どんな環境と比較して優位だと言っているのかな?。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
HEWの簡単プロジェクトコピー大作戦 [HEW & HTERM]
いや、多分簡単にプロジェクトを追加できる機能をHEWは持っているんだろうけれど、このやり方に慣れてしまっているので、その方法を披露します。
なお、画像はブラウザ画面上で右クリック等して、別の窓かタブでブラウジングすると、大きく見る事が出来ます。
まずコピー元のプロジェクトが入ったフォルダをエクスプローラで参照します。 プロジェクトファイルは何とか.hwpです。 | |
このフォルダーをそのまま右クリックでコピーし、そのフォルダの上位のフォルダ、多分ワークスペースファイル(なんとか.hwsの有る所)に、やはり右クリックで貼り付けを行います。そうすると、貼り付けしたフォルダーに、「コピー ~ なんとか」と言うフォルダーが作成されます。 | |
コピーしたフォルダーのプロパティで、フォルダー名を適当な名前に変更して置きます。 また、このフォルダーの下にフォルダーが出来ていますが(H8やSHならDEBUGとかRELEASE、R8Cならobj_r8c1と言うのが有る)、このフォルダの中身はobjやlst等のファイルなので、中身を丸ごと削除しても構いません。ビルドすれば再び作成されるだけですから。 | |
コピーで新しく追加したフォルダーの何とか.hwpファイルをエディターで開きます。いやその前に、後々混乱が無い様に、追加したフォルダーのプロジェクト名やファイル名は変更して置いた方が良いでしょう。 あと、何とか.navと何とか.tpsも名前の部分をプロジェクト名に合わせて置きます。 | |
[HIMDBVersion] 2.0 [DATABASE_VERSION] "2.8" [PROJECT_DETAILS] "step5" "E:\smalight\ner8c25\step5" "E:\smalight\ner8c25\step5\step5.hwp" [INFORMATION] "No project information available" [TOOL_CHAIN] "Renesas M16C Standard Toolchain" "5.43.00" |
|
何とか.hwpファイルをエディターで開くと、上の様な内容のテキストファイルである事が判ります。 つまり、この内容を適当にいじれば、プロジェクトの設定等は維持したまま、新たにプロジェクトを追加できる事が判るかと思います。 具体的には、フォルダー名や、ファイル名等も変更したらそれらの記述をエディタで編集する事となります。この時エディタの置換機能を使えば、一発ですね。 | |
次に、多分今居るフォルダの上の階層のワークスペースのフォルダの中の、何とか.hwsファイルを、やはりエディタで編集します。 | |
[PROJECTS] "step3" "E:\smalight\ner8c25\step3" "E:\smalight\ner8c25\step3\step3.hwp" 0 "step4" "E:\smalight\ner8c25\step4" "E:\smalight\ner8c25\step4\step4.hwp" 0 "step5" "E:\smalight\ner8c25\step5" "E:\smalight\ner8c25\step5\step5.hwp" 0 "u-ap" "E:\smalight\ner8c25\smalight" "E:\smalight\ner8c25\smalight\u-ap.hwp" 0 |
|
ワークスペースファイルの編集は更に簡単で、[PROJECTS]の中身にプロジェクトを追加するだけです。例えばこんな感じですね。
"step6" "E:\smalight\ner8c25\step6" "E:\smalight\ner8c25\step6\step6.hwp" 0 これでこのワークスペースファイルをHEWから読み込めば、登録プロジェクトリストの中に追加プロジェクトが見えますので、後は煮るなり焼くなり。 |
|
STK-7125のデバックモニタ(SH2/7125) 2BUG目 [HEW & HTERM]
そんな訳でデバックモニタ上で開発した、LCDが動いた時の定番メッセージを表示してみました。
STK-7125のデバックモニタ(SH2/7125) [HEW & HTERM]
今朝出かけ前に急いで(そんな必要有るのか?)アップしたので、デバックモニタの詳細について書いておりませんでした。そこで、これからデバックモニタを構築しようと思っている方の為に、稚拙ながら構築の為の情報を書きます。
まず、当然の事なのですがデバックモニタを構築する為にはSHCが必要となります。SHCのバージョンはver.8かver.9が有れば楽ですが、ver.7でも可能です。SHCは評価版がルネサスから入手できますので、SHCを持っていない方はこれを機に手に入れましょう。3ヵ月後の制限が掛かっても、SH/Tinyに関しては事実上制限無しですし。
次にルネサスの半導体セミナーのサンプルプログラムからデバックモニタを手に入れます。この時、SH2、HEW3(SHC ver.8、ver.9)の物をダウンロードします。SHC ver.7の中身には、まだSH2/Tinyのデバックモニタが入っていません。
HTERMからSH2/Tinyの書き込みを行う為には、HTERMのver.8.3(かそれ以上)が必要です。もし手持ちのHTERMのバージョンが8.2以前ならば、新しいHTERMも手に入れて置きます。勿論FDTでも書き込みは可能です。
さて、デバックモニタを手に入れたら、STK-7125用の改造が必要となります。改造するファイルは以下の2つです。
- monitor.c
- monitor.sub
void INITIALIZE(void) { CPG.FRQCR.WORD = 0x16db; /*Iφ=48MHz、Bφ=24MHz、Pφ=24MHz、MPφ=24MHz*/ PFC.PACRL2.BIT.PA4MD = 1; /* PA4 is TxD1*/ PFC.PACRL1.BIT.PA3MD = 1; /* PA3 is RxD1*/ } /* Goto Monitor Program */monitor.subの改造
INPUT SUPERH,MONITOR,LOWER LIST MONITOR.MAP SHOW SYMBOL OUTPUT MONITOR.MOT FORM STYPE NOOPTIMIZE LIBRARY SUPERH,7125 LIBRARY MONITOR DEFINE $BRR=13 DEFINE $STACK=FFFFC000 START VECTOR/0,ROM,P,C/400,RAM/FFFFA000,USER/FFFFA160,SCI/FFFFC080あ、LOWERはお好みで!。
STK-7125固有の処理の解説
SH2/7125のSCI1で使用するPINは初期状態では固定されておらず、その為デバックモニタの起動時にユーザーがこのPINを何処に割り付けるかを決める必要が有ります。それがmonitor.cで行っている処理で、STK-7125の場合はPA3とPA4を使用する事となります。あと、ボーレートの設定はmonitor.subで行っています。「$BRR=13」の記述がそれですね。この場合は38400bpsとなります。
これと、SH2/7125のRAMの開始アドレス、デバックモニタで使用するSCIの開始アドレスをリンカーに渡す必要が有ります。「VECTOR/0,ROM,P,C/400,RAM/FFFFA000,USER/FFFFA160,SCI/FFFFC080」 の記述がそれですね。
追記!RAMの底を指定するのを忘れていました。 「DEFINE $STACK=FFFFC000」です。
HTERMでの書き込み
デバックモニタをHTERMの書き込み機能で書き込むのですが、設定について書いて置きます。その前にターゲットの電源を落として、FWEを1、MD1端子を0にして置きます。SH2/7125はH8/3069Fと同じ様に書き込みプログラムをマイコン内部に持っているタイプなので、いきなりフラッシュ(R)→ブートモード(B)と進みます。
ここでターゲットの電源を投入しますと、品名を聞いて来ますので「R5F7125」を選択します。
逓倍比の選択ではCPU、周辺機能共に×2を選択します。
次に進んで、動作周波数では「12MHz」を、書き込みマットでは「ユーザーマット」まで進めば、ダウンロードするファイルをどれにするのか聞いて来ますので、今回はデバックモニタを選択しました。
フラッシュROMへの書き込み完了後、FWEは0、MD1は1とし、電源を再投入します。HTERMにクレジットが表示されれば完了です。 以上! では皆さん頑張ってデバックモニタを作ってみて下さい。
スタック解析ツール(Call Walker) [HEW & HTERM]
H8-MLで教えてもらったのですが、ツールがソースコードから関数の依存関係を解決できないところは、ユーザーがドラッグ&ドロップで解決できるなんてのは、始めて知りました。以前はある程度Call Walkerで解析して、その後手計算をしていましたが、これで随分楽になります。
図のlcd_rootの下のバツ印が元々ツールの自動解析で解決できなかった依存関係で、バツの下にドラッグ&ドロップで持ってきた関数のスタックが表示されています。
まだまだ知らない事が沢山有るなあ。
H8用コンパイラのバグ情報 [HEW & HTERM]
メールマガジンからの転載(転載禁止とは書いていなかったので)
1.非数をオペランドに持つ式の注意事項
変数と非数との比較式および、非数との加減式で間違った値になる場合がありま
す。
2.構造体のメンバへの代入式の注意事項
構造体サイズが4バイト以下である構造体型変数を関数内で宣言したとき、その
構造体メンバへの代入式が実行されない場合があります。
3.配列要素への代入式の注意事項
if文の前とthen節内で、同じ配列への代入文が存在するとき、その配列の値が正
しく代入されない場合があります。
4.__asm内のユーザラベル記述の注意事項
__asm{}使用時、シンボル(関数、変数およびラベル)数が256個以上あるときに、
値を参照する領域が間違っている場合があります。
5.アセンブラソースファイル出力時のデータ幅出力の注意事項
-code=asmcodeオプションを選択、アセンブラ埋め込みがあり、かつBRA/BC,
BRA/BS命令のアドレッシングモードが絶対アドレスの場合に、ビット幅(@aa:nの
n)が出力されない場合があります。
6.レジスタ値の上書きの注意事項
全レジスタ(ER0~ER7)を使用している関数で、レジスタに値を割り付けるとき、
そのレジスタにある値を上書きする場合があります。
注意:本問題が発生するのは V.6.01 Release 00 のみです。
7.アセンブラファイル出力時のラベル出力位置の注意事項
遅延分岐命令を含むプログラムをアセンブラファイル出力するとき、ラベルを
間違った位置に出力する場合があります。
8.変数の奇数番地割り付きの注意事項
構造体型変数で、境界調整数が2バイトのメンバを奇数番地に配置する場合があ
ります。
詳細、解決方法は
http://www.hitachi-ul.co.jp/MYICE/XSOFT/index.html
の「製品情報」から。
300Hには関係無いけれど、やばいのでは?。