RAMデバッグの方法を解説したいと思います。
更新履歴
2009 8/9ひとまず完成
2009 8/10非公開にした後復活
2010 12/26一部修正
2011 1/18公開場所変更
1.はじめに
ここでは、開発環境としてHEW4を使っていることを前提とします。
私の手元にSTK-7125があるので具体的なことはSTK-7125について書きます。
ルネサスのモニタプログラムとHtermを使ってRAMデバッグ環境を整えていきましょう。
2.なぜRAMデバッグするのか
マイコンのROMというものには実は書き込み回数に制限があります。制限というのは具体的には、書き込み回数100回までしか動作は保証しかねるよ、というようなことです。10万回書き込めるようなマイコンもあります。しかしそうでないマイコンの場合は困ってしまいます。そんなときにRAMにプログラムを書き込むと便利です。RAMは書き込み回数には制限が無いので、安心してプログラムを書き換えられます。
RAMに書き込むといっても、マイコンは普通RAMだけを使って動作することはしません。RAMに書き込んでプログラムを実行させるためには何か他に手助けが要るわけです。その手助けをするものがエミュレーターだったりモニタプログラムだったりします。ここではモニタプログラムを使います。
3.モニタプログラムとは
モニタプログラムとは、マイコンに組み込まれて、ユーザープログラム(あなたが実行したいプログラム)をRAM上で実行できるようにしてくれるプログラムです。
このような組み込み型モニタの利点はマイコンのほかにエミュレータと呼ばれるデバッグを行うための機器を必要としないところです。もちろんエミュレータとは機能的には違うところもあるけど、とりあえず気にしなくていいです。
4.ソフトを揃えよう
必要なものをダウンロードしていきましょう。
ルネサステクノロジに行って、右上の検索BOXから「Hterm」と検索してください。
四つぐらい候補が出てきます。その中から自分のマイコン向けのページを選んでください。
そこで自分のマイコン向けのモニタプログラムとHtermをダウンロードします。自己解凍ファイルなので2つとも実行して好きなとこに解凍してください。解凍先にhtermというフォルダと、sh2というフォルダが出来ています(SHー2シリーズを選んだ場合)。
5.モニタプログラムの設定をしよう
フォルダsh2の中のmonitorという名前のHEWWorkSpaceFileを開いてください。プロジェクトの中にmonitor.cとmonitor.sub、そしてdependenciesには7040s.hというファイルがあります。
まずmonitor.cを編集しましょう
/*********************************************************/
/* SH7600 Monitor Program Ver. 2.0A */
/* Copyright (C) 2003 Renesas Technology Corp. */
/*********************************************************/
#include "7125s.h"//① /* */
/*********************************************************/
/* User Initialize Module */
/* Input PR <– Return Address */
/* Output Nothing */
/* Used Stack Area –> 0(0) Byte */
/*********************************************************/
#pragma noregsave(INITIALIZE) /* Non Register Save */
void INITIALIZE(void) /* */
{ /* */
CPG.FRQCR.BIT.IFC = 1; //②
PFC.PACRL4.BIT.PA15MD = 6; //③
PFC.PACRL4.BIT.PA14MD = 6;
} /* Goto Monitor Program */
赤太字の部分が変更したところです。
//①とかは説明用の番号なので書かなくていいですよ。
①sh7125用のヘッダファイルをインクルードします。
②sh7125はPLLからの分周割合を変更できます。Iφを1/2倍にします。
STK-7125には12Mhzのクロックが付いているから、Iφだけ12×8×1/2=48MHzになります。
③モニタプログラムがパソコンと通信するときのポートを有効にしておきます。
STK-7125EVBの場合、PA14,PA15がUSBで繋がってます。
次にmonitor.subを編集しましょう
INPUT SUPERH,MONITOR,LOWER//①
LIST MONITOR.MAP
SHOW SYMBOL
OUTPUT MONITOR.MOT
FORM STYPE
CHANGE INFORMATION=1320
NOOPTIMIZE
LIBRARY SUPERH,7125//②
LIBRARY MONITOR
DEFINE $BRR=13//③
DEFINE $STACK=FFFFC000//④
START VECTOR,ROM,P,C/0,RAM,USER/FFFFA000,SCI/FFFFC080//⑤
①モニタ上にprintfで文字を出力したり、scanfで入力できるようにするための設定です。
②マイコンの種類別の情報はライブラリファイルとして提供されています。自分のマイコンチップを選択しましょう。ここでは7040となっていたのを7125にしてます。
③SCI のビットレートを設定してます。この値は自分のマイコンチップのデータシートのSCIについての部分で、SCIのビットレートを設定するレジスタについての項を読んで決定します。周辺クロック数を確認し、通信速度を考えてからN(ボーレートジェネレーターのSCBRRの設定値)の値を読んで16進数に直してから書いてください。SH7125の場合Pφ=24MHzに設定されてて(初期値)、38400bpsで通信したいから、データシートP.396をみて、N=19だと分かります。これを16進数に変換した値である13を書き込むのです。
④ユーザースタックの初期位置をRAMの最後尾に設定します。スタック領域はRAMの最後尾から伸びていくものですから。
⑤モニタプログラムをメモリ上にどう配置するか記述されてます。
ベクタ領域はROMの先頭に配置しなければなりません。VECTORセクションを先頭にして連続でROM,P,Cセクションを内蔵ROMに配置します。また、RAM,USERセクションはRAMの先頭から連続で配置します。最後に、使うチャネルのSCIの先頭アドレス(SMRのアドレス)をSCI/のところに書きます。SH7125について言うとSCSMR_1のアドレスを書いてます。
最後に、低水準インターフェースが使えるようにするために必要なファイルをプロジェクトに追加します「プロジェクト(P)」メニューの「ファイルの追加(A)…」でProjectフォルダ「monitor」の中にある「lower.c」を追加してください。
以上設定してきましたが、ビルドすれば完成です。ビルド→すべてをビルドしてください。
6.モニタプログラムをROMに書き込んでから実行してみよう
どんな方法でもかまいません。ROMに書き込んでください。
MONITOR.MOTってやつです。
私はFlashWriterEXforsh7125を使って書き込みました。
この環境が限定的かもしれないので詳しくは書きません。
ルネサスではFDT(Flash Development Toolkit)ってやつを無償配布してるらしいのでそれでも使ってください。その使い方についても解説しませんできませんすいません(汗
書き込みができたら、パソコンにマイコンをつないでから「Hterm」を立ち上げてください。
そこで通信→切断をクリックし、通信を切断してから、ファイル→プロパティで、COMとビットレートを指定してください。(私の場合COM4、ビットレート38400)
OKを押すと勝手に通信接続します。ここでマイコンの電源を入れると
SH7125 Series SuperH RISC engine Monitor Ver. 2.0B
Copyright (C) 2003 Renesas Technology Corp.
このようなメッセージが表示されます。成功です。
次にコマンド→HELPをクリックしてください。
Monitor Vector 00000000 - 0000038F
Monitor ROM 00000390 - 00005641
Monitor RAM FFFFA000 - FFFFA15F
User Vector FFFFA160 - FFFFA4EF
. : Changes contents of SH7600 registers.
B : Sets or displays or clear breakpoint(s).
D : Displays memory contents.
DA : Disassembles memory contents.
F : Fills specified memory range with data.
G : Executes real-time emulation.
L : Loads user program into memory from host system.
M : Changes memory contents.
R : Displays contents of SH7600 registers.
S : Executes single emulation(s) and displays instruction and registers.
SH : Displays contents of SH7125 peripheral registers.
このようなものが表示されます。
これはモニタプログラムの中身がどのアドレスに割り当てられたかということと、モニタプログラムを操作するためのコマンドを表示しています。ひとまずコマンドは気にしなくていいです。
ここで大切なのは
User Vector FFFFA160 - FFFFA4EF
というところです。ユーザープログラムに与えられたベクタ領域を示しています。
ひとまずこれでモニタプログラムに関する作業は終わりです。次にRAM上で実行するユーザープログラムの設定をします。
7.ユーザープログラムのセクション設定
HEWで普通にワークスペースを作成し、何も設定を変更されていない状態では、完成したプログラムはマイコンのROMに書き込まれることが前提になっています。
最終的にロボットに積むときにはもちろんプログラムはROMに書き込まれているべきです。でもデバッグ時はそうではないのです。RAMでプログラムを実行できるようにユーザープログラムの設定を変更しましょう。SH7125について説明します。
HEWのメニューから、
ビルド(B)→SuperH RISC engine Standard toolchainを選んで、
最適化リンカのタブをクリック→カテゴリ:セクション、設定項目:セクションを選択します。
下記のようなセクションがあると思います。
DVECTTBL
DINTTBL
PIntPRG
PResetPRG
P
C
C&BSEC
C&DSEC
D
B
R
S
編集(E)ボタンをクリックしてセクションの割り当てを編集します。
モニタプログラムで見た
User Vector FFFFA160 - FFFFA4EF
の部分を参考にします。
セクションDVECTTBLをアドレスFFFFA160番地から配置します。
FFFFA160~FFFFA4EFをDVECTTBLに割り当てることから、DINTTBL以降はFFFFA4F0番地から割り当てます。(修正→)DINTTBL以降はDVECTTBLと領域が被らないように配置すれば良いです。つまりモニタプログラムのユーザーベクタのところは開始アドレスだけを気にすれば問題ないです。
スタック領域を400byte確保するため、セクションSはFFFFBC00から割り当てます。(補足→)スタックサイズは各自計算して適切な値にしたほうがいいです。プロジェクト→構成の編集→スタックから変更できます。ここではデフォルト値である400で説明しています。
こんな感じになりますね。(補足)上記修正によって、私のプログラムの一例では、DINTTBL以降の先頭アドレスは 0xFFFFA170に設定すれば良くなりました。あるいは、DINTTBL以降を特に意識せずに、DVECTTBLから自動的に連続に配置するようにアドレスの区切りを画像の例とは変えてもいいと思います。
OKを押して設定を終えてからいつものようにビルドしましょう。
☆数学関数も使いたい
参考サイトを挙げておきます
勝手にリンクしてしまっていいのかと思いますが忘れてしまったら困るので。
すばらしい内容です。
標準ライブラリにmath.hを追加するのを忘れないこと!!!
設定の仕方はここの数学関数についてのとこ(追記)リンク切れしました。
8.実行する
「Hterm」を立ち上げ、通信の設定をしてから通信接続してください。
コマンド→LOADを押して、ユーザープログラムのabsファイルを読み込みます。多少時間がかかります。コマンド→GOで実行開始されます。
RAMに配置されているため、もし電源を切るとプログラムが消えます。LOADからやり直しになります。(まぁ仕方がない)
9.さいごに
以上、長々しく書いてきました!!
これでメモリの書き込み回数を気にせずにどんどん開発できるようになります!!
わかりにくい文章でしたが、最後まで読んでいただき有り難うございました。
今後、もう少しわかりやすくするため画像とか説明を補足していくことも考えています。
要望などありましたら是非お知らせください。それにお答えできないことは多々あると思いますが・・・・・・。努力はします。
さらにお願いしたいのですが、この文章に間違いがあったらどうか誰か教えてください。 私はこの分野についてまだ独学を始めたばかりでありますから、実は説明していることの根拠がいまひとつわかっていないところもあるのです。ですから、とんでもない間違いをしているかもしれません。それでも、自分のように悩んでいた人の役に立てたらとこれを書きました。より充実した内容にするため間違いがあったら指摘してくださるとありがたいです。
さて、最後にありきたりな一言。
この文章を参考にしたことによって生じた損害について
私は一切責任を負いませんよー!!