Renesas Synergy™

FAQ 1007175 : ブート・スワップ機能はどんな機能なのか。どんなときに使うのか。

78K0では、リセットから起動すると、内蔵フラッシュメモリの0番地から始まるメモリ領域(ブート領域)から実行するプログラムのアドレス(ベクタ)を読み出して、そのアドレスから命令の実行を開始(ブート)します。通常は、この領域のフラッシュメモリの内容はライタで書き込んだら、内容を書き換えることはあまりないはずです。しかし、プログラムで内蔵フラッシュメモリに書き込む(セルフ・プログラミング)際に、このブート領域を含めて書き換えを行いたい場合があります。その場合には一旦、対象のブロックの内容を消去してから、新しいプログラムを書き込む必要があります。ところが、消去後でプログラムを書き込む前に、電源の瞬断などでマイコンにリセットがかかってしまった場合には、ブート領域の内容が消去されているので、正常に起動できません(リセット・ベクタはFFFFHとなっており、FFFFH番地は内蔵周辺機能(SFR)領域であり、ここからは命令フェッチできないので、不定なコードを命令として読み込み、以降の動作は不定となります。つまり、リセットによる起動ができなくなります。この問題に対応したのが、ブート・スワップ機能です。

ブート・スワップ機能は、物理的なメモリ領域を入れ替える機能です。物理的なメモリ領域としてブート・クラスタ0およびブート・クラスタ1があり、内蔵フラッシュメモリが消去された状態ではブート・クラスタ0がフラッシュメモリの先頭4KB(0000-0FFFH:ブロック0~3)に割り当てられ、ブート・クラスタ1が続く4KB(1000H-1FFFH:ブロック4~7)に割り当てられています。

ここから、ブート・フラグを設定すると、次にリセットがかかったときにブート領域として使用される領域はブート・クラスタ1となります(図中に赤い三角で示す)。この段階(ブート・フラグを設定し、リセットが発生する前)ではメモリ・マップはまだ変わりません(図のブート・フラグ設定)。次に、ブート・フラグが設定された状態でリセットがかかると、0~0FFFHの領域にブート・クラスタ1が、1000H~1FFFHの領域にブート・クラスタ0が配置されます(図のさらにブート後)。つまり、CPUからみた0番地はブート・クラスタ1となり、リセット解除後にはブート・クラスタ1から起動することになります(CPUとしては0番地から起動することに変わりはありません)。ブート・クラスタ1にブートに必要なプログラムをコピーしておけば、ブート・クラスタ0が消去された状態でも正常に起動できます。こ のように、リセットで起動するクラスタを切り替えるのがブート・スワップ機能です



このように、0~0FFFH番地からのブート領域をセルフ・プログラミングにより書き換える場合にだけ使用する機能です。従って、ブート領域を書き換えない場合には使用する必要はありません。

また、単にブート・フラグを操作するだけでは、次のブート位置が変わるだけで、メモリの実際の配置が切り替わるわけではありません。リセットがかかって初めてメモリの配置が切り替わるために、ライタで書き換えを行う場合には以下の点に注意が必要です。
ブート・フラグがセットされた状態のマイコンをライタで消去すると、ブート・フラグはクリアされてしまいます。ところが、この状態ではメモリの配置は変わらないので、そのまま書き込みを行うと、0番地の内容がブート・クラスタ1に書かれることになります。その後、動作させようとすると、ブート・フラグはクリアされているので、ブート・クラスタ0が使用され、0番地のつもりで書き込んだブート・クラスタ1は1000H番地となってしまいます。
このようなトラブルを避けるには、フラッシュを消去した後に、一旦リセットし、メモリの配置をブート・フラグと整合させてから書き込みます(具体的には、EPVコマンドではなく、単独でのイレース・コマンドを実行し、その後に書き込みを行います)。
または、ブート・スワップ機能を使用するのであれば、最初から2つのブート・クラスタに同じ内容を書き込んでおけば、どちらでもブート可能になり、1回のEPVコマンドで書き込みが可能です。

適用製品

RL78 ファミリ
78K0/Kx2
78K0R/Fx
78K0R/Hx
78K0R/Ix
78K0R/Kx
78K0R/Lx
他にご質問がございましたら、リクエストを送信してください