Renesas Synergy™

FAQ 1007326 : V850/SB1でROMコレクションを使おうとしているのですが、よくわかりません。 詳しく説明してください。

既にマイコン内のROMに焼きこまれたプログラムにパッチを当ててプログラムを修正する手段としてROMコレクション機能があります。
この機能は既にあるプログラムを修正できると言う便利な機能ですが、 いつでも無条件で使用できるものではありません。

この機能を使用するには前もって、そのための処理の一部をプログラム中に埋め込んでおく必要がありますし、 代わりに実行させるプログラムを読み込むための外部メモリも必要になります。

ROMコレクションの動作やそのために必要なこと等について以下に説明します。

[1] ROMコレクションの基本的な動作

ROMコレクションでは CPU (ハードウエア) が自動的に実行する部分と、アプリケーション側で対応すべき部分とが混在しているので、これらを区別して考える必要があります。
既に、必要な設定が行われた状態でROMコレクションの動きを以下に示します。


V850/SでのROMコレクション処理の動きの概略
(1) プログラム実行中、CPUが命令をフェッチする際にそのフェッチ・アドレスと、 CORADnレジスタに設定されているROMコレクション・アドレスとの比較を行い、 アドレスが一致した場合にはフェッチした命令を分岐命令 (JMP r0命令) に置き換え、
(2) 置き換えられた分岐命令の実行によりそれまでの処理を中断して0番地に分岐します。
このとき、どのコレクション・アドレスでの一致が発生したかを CORRQレジスタの対応するビット (CORRQ0~3) にセットします。

 

ここまでが、ROMコレクションのハードウエアで処理される内容で、 これ以降はアプリケーション・プログラムで処理する内容です。

 

(3) JMP r0命令により分岐してきますので、 通常のリセット時のエントリからプログラムを実行することになります。
このため、最初にリセットなのかROMコレクションなのかを CORRQレジスタにより判定し、 リセットならば初期化処理を行います。
(4) ROMコレクションの場合、通常は複数箇所に設定ができるので、 どのアドレスでの一致による処理かを CORRQ0~3ビットで判断して、 対応したプログラム (パッチ処理) を実行します。
(5) パッチ処理が完了したら、元のプログラムに分岐します。

 

以上のように、ROMコレクション用のハードウエアと、アプリケーション・プログラムに 前もって組み込んである処理プログラムとを用いて修正用プログラムを実行させることで パッチ処理を行えるようになっています。



[2] ROMコレクションを行うために準備するハードウエア

ROMコレクションを行うには、修正プログラムを読み込むためのハードウエアが必要になります。
比較的大きなシステムで、バスを使用して外部に拡張用のフラッシュ・メモリ等を接続するようになっていれば、 そこに修正プログラムを格納します。
この場合にはプログラムそのものを外部に拡張したメモリ上で実行させることができます。

バスによる拡張を行っていない比較的小さなシステムの場合には、 シリアル・インタフェースで制御するEEPROMを接続し、その中に修正用プログラムを書き込んでおきます。
この場合には、初期化処理のなかで、そのプログラムをシリアル・インタフェースを介して読み出し、 内蔵RAMに書き込んで置く必要があります。



[3] 初期化プログラムでの対応

ROMコレクションを使用するためには上で説明したハードウエアを準備し、 初期化プログラムにおいて必要な設定を行っておく必要があります。

また、ROMコレクションが発生すると、リセット・エントリからプログラムが起動しますので、 初期化処理の前にROMコレクションが発生したか否かを CORRQレジスタの内容で判定する処理が必要になります (上の概略フローの (3))。

通常のリセットによる起動では CORRQレジスタはクリアされており、 ROMコレクションが発生した場合には CORRQレジスタの該当するビット (CORRQ0~3) がセットされていますので、 CORRQレジスタが 0であれば、初期化処理を行うようにします。



ROMコレクションのための初期化処理

ROMコレクションを使用するためには、初期化処理で上記フローの処理を行う必要があります。
以下、このフローに沿って説明します。

なお、外部に接続したメモリを使用できるように、 最初にシリアル・インタフェースやバス・インタフェースの初期化を行っておいてください。

(1) ROMコレクションを使用するかどうかの判定処理
外部に接続したメモリの特定のアドレスにROMコレクションを使う必要があるかどうかのフラグを準備しておき、 それを確認することで処理を行います。
ROMコレクションを使用する必要がない場合には (2)(4) の処理は飛ばして、 次の処理に移ります。
(2) パラメータの設定
ROMコレクションで必要なパラメータ (コレクション・アドレス) を外部に接続したメモリから読み込んで、 CORADレジスタへセットします。
(3) 修正プログラムの読み込み
ROMコレクションで、代わりに実行させたいプログラムを外部に接続したメモリから読み込んで、 実際にプログラムを実行させる内蔵RAMへ書き込みます。
なお、バスを使用して外部メモリを接続し、 外部メモリのプログラムを直接実行可能な場合には内蔵RAMへ書き込む必要はありません。
内蔵RAMまたは外部メモリの修正プログラムのアドレスは固定し、 下記の例のように先頭部分に分岐命令を並べておくとROMコレクション処理が簡単になります。


(4) CORENの設定
CORENレジスタの COREN0~3ビットをセットすることで、 対応した CORAD0~3でのROMコレクション処理が有効になります。



[4] ROMコレクションの前処理

アドレスが一致して、修正したい命令の代わりにJMP r0命令がフェッチされ、 その実行によりリセット・エントリへ分岐します。
そこでは上記の[3]で説明したように、通常のリセットかROMコレクション処理かの判定を行います。
ROMコレクションの場合には、引き続き以下のような処理を行います。
(1) どのアドレス (どのチャネル) での ROMコレクションが発生したかを CORRQレジスタの CORRQ0~3ビットで判定し、 対応処理への分岐命令に分岐します。
各チャネルの ROMコレクション対応処理では関連した CORRQ0~3ビットを必ずクリアしてください。



[5] ROMコレクションの競合について

通常はROMコレクションが同時に複数発生することはありません。
しかしながら、割り込み処理にも ROMコレクションを設定した場合には、 ROMコレクション処理中に割り込みが発生し、 割り込み処理の中で別のROMコレクションが発生することが考えられます。

このような場合には、ROMコレクション対象プログラムの優先度の高いチャネルの CORRQ0~3ビットから順に確認を行うことで、 ROMコレクションのチャネルに優先度を設定できます。
このように処理に優先度をつけることで割り込みにもROMコレクション処理を行うことができます。
 
 
適用製品
V850/SB1, V850/SB2
他にご質問がございましたら、リクエストを送信してください