「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
パソコンなどに代表されるように、現在多くの製品やシステムに「Boot (ブート)」という機能が搭載されています。
最近Boot機能を持ったマイコンシステムの開発を行う機会があり、NEC製のCPU(V850)の特性を利用した二重構造のIPLプログラムの開発を行いましたので、紹介させて頂きたいと思います。
「Boot」とは、「システムを起動する機能、もしくはシステムの電源を投入してから操作可能な状態になるまでの一連の処理」のことです。例えばパソコンの場合、パソコンを起動すると、まずIPL(Initial Program Loader)というプログラムが立ち上がり、記憶装置からOSを読み込んでメモリに展開して起動し、操作可能な状態にします。
今回の開発はマイコンでしたが、基本的なBootの動作はパソコンと同じです。システムの電源を投入するとIPLが立ち上がり、ソフトを読み込んで操作可能な状態にします。ただし、今回の開発の場合IPLが立ち上がるのは「ソフトを書き換えたいとき」だけです。ソフトを書き換える必要が無い場合はIPLを実行せずに元からあるプログラムで起動し、操作可能な状態にします。通常、CPUにソフトを書き込むためには、専用の機器を使用してCPUにダウンロードする必要がありますが、IPLの書き換え機能を使用することで、ソフトさえあればCPUの書き換えを行うことができるようになります。既に出荷している製品を最新のソフトバージョンに更新したい場合でも出荷先で簡単にソフトを更新することができます。
今回の開発では、このIPLの書き換え処理をNEC製のCPU(V850)の特性を利用した、二重構造で実現しました。
NEC製のCPU、V850はFlash ROMを持っていて、Flash ROM内でプログラムを動作させることができます。このFlash ROM内にIPLを組み込んで書き換え処理を行うのですが、もしソフトの書き換え中に停電が発生した場合、ソフトの書き換えが中途半端な状態で止まってしまいます。そうなると、その後システムが起動すると不十分に書き換えられたソフトで起動し、正常に動作しなくなる可能性があります。
そのため、V850ではFlash ROMに二重構造をもっており、ソフトの書き換え状況に応じて、システムをリセットした時に、古いプログラムでも、新しいプログラムでも動かすことができるようになっています。
この機能を利用したのが二重構造のIPLです。
二重構造とは、図1のブロック0とブロック1のように2つの領域を持っていることをいいます。
IPLはまずはブロック0で動作し、ブロック1を新しいソフトを書き換えます。
ブロック1に新しいソフトを書き換え中に、電源瞬断や何らかの理由でシステムを再起動した場合、ブロック1への書き換えは不十分となってしまいます。この場合ブロック1の新しいソフトで動作させると正常に動作しなくなります。そのため、次にシステムが立ち上がった時は古いソフトのまま立ち上げる必要があります。
ブロック1への新しいソフトの書き換えが完了した後に、停電の発生やシステムを再起動する場合、ブロック1は新しいソフトに書き換わっています。この場合はもう新しいソフトで動作させても大丈夫なので、次にシステムが立ち上がった時は新しいソフトのブロック1と古いソフトのブロック0が入れ替わり、新しいソフトをブロック0として立ち上げます。
このように、二重構造の領域でIPLを実行すると、ソフトの書き換え中に電源瞬断が発生した場合でも正常なBootプログラムが必ず存在しているため、安全にソフトを書き換えることができます。
図1. 二重構造のBoot機能
また、プログラムは通常Flash ROM上に格納されますが、全てのプログラムを二重構造にすると、メモリの容量には上限があるため非効率です。そのため、V850ではソフトの書き換えに最低限必要な領域だけを二重構造にすることで、効率よくBoot機能を組み込むことができます。
二重構造で効率よくメモリを使うためには、次のように用途別に分けてメモリを配置する必要があります。
この領域のメモリの配置を間違うと、書き換える必要のある領域全てに書き込めないことや、書き込んではいけない領域に書き込んでしまうことになり、正常に動作しなくなる場合があるため注意が必要です。
ソフトの書き換え処理中は、ソフトの書き換え処理自体をFlash ROM上で動作させることはできません。実行中の処理自体を書き換えてしまう危険性があるためです。
そのため、RAM上や外部ROMにコピーして動作させる必要があります。
今回は図2のようにソフトの書き換え処理を内部RAM上にコピーして動作させました。
図2. RAMへの退避
Boot機能のIPLに問題がある場合、このIPLを使って正しいBootプログラムを書き換えようとしても、正しく書き換えることができない可能性があります。
この場合、最悪二度とこのIPLを使ってソフトを書き換えることができなくなります。もうこうなるとこのBootは役割を果たしません。せっかくBootを搭載しているのに、製品を回収してソフトをダウンロードし直すなどの対応が必要になってきます。このようにBootは常に正しく動作しなければならないのです。
以上をまとめると、V850の特性を利用して二重構造を用いたIPLプログラムを組み込むことによる利点は次のことが考えられます。
尚、以下の 1 と 2 はIPL自体の利点といえます。
以上のようにV850の特性を利用した二重構造のIPLの方法を紹介させていただきました。今回紹介したIPLの方法はほんの一例であり、もちろん普通にプログラムを書き換えるだけで二重構造を必要としないIPLもあります。またBootの機能を実現するために必要なCPUを選定し、そのCPUの特性を生かしてIPLを実現する必要があります。
このようにBootの用途やCPUの機能などに合わせた方法でIPLを実現する必要があり、IPLの方法は数多くありますが、これから二重構造を使用したBoot機能を開発される方に参考にしていただければと思います。
(T.M.)
関連ページへのリンク
関連するソフテックだより