「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私はソフテックに入社して約20年経ちます。主に組み込みソフトウェア開発に携わっています。
組み込みソフトウェア開発では、CPUや周辺ICの生産中止に伴い、新しくCPUや周辺ICを選定してハードウェア(基板)を作り直し、そのハードウェアで元のプログラムが動くようにソフトウェア移植する仕事をお客様からいただくことがあります。
2016〜2017年にかけて、17年前に弊社で開発したソフトウェアを新しいハードウェアに移植する作業を行いました。CPUだけではなく、CPU周辺のRTCやEEPROMも変更となりました。
ソフトウェア移植作業を通して得たノウハウや、注意すべきポイントなどいくつかありましたので、そのことについて書きたいと思います。
ソフトウェア移植したシステムのシステム構成概要は図 1の通りです。複数の種類の基板A〜Dで構成されたシステムです。
本システムで基板故障が起こった場合、基板Aのみ交換、基板Bのみ交換するということもあり、どのような基板組み合わせでも既存と同じ仕様で動作する必要があります。
基板Aと基板Bのソフトウェア移植作業を行いました。基板Cと基板Dのハードウェアも新しくなりましたが、こちらはボリュームが小さいこともあり、プログラムは新規作成しています。
図1. システム構成概要
基板Aのソフトウェア移植前後のCPUおよび周辺ICの相違の一部を表1に示します。基板BのCPUも基板Aと同じですが、周辺ICの構成や移植前のシステムクロックが異なります。基板Bについては省略します。
項目 | 移植前ハードウェア | 移植後ハードウェア |
---|---|---|
CPU | 東芝 TLCS-900Lシリーズ 16ビットCPU |
ルネサスエレクトロニクス RX210グループ 32ビットCPU |
システムクロック | 19.6608MHz | 29.4912MHz |
EEPROM (周辺IC) |
パラレルインターフェイス方式 (端子:A0〜16、D0〜7、CSB#、RD#、WR#) |
SPI BUSインターフェース方式 (端子:SCK、SMISO、SMOSI、CS#、WP#) |
RTC (周辺IC) |
パラレルインターフェイス方式 (端子:A0〜3、D0〜3、CSC#、RD#、WR#) |
シリアルインターフェイス方式 (端子:CLK、CE、WR、DATA) |
表1. 基板Aのソフトウェア移植前後のCPUおよび周辺ICの相違一覧
ソフトウェア移植作業を行って得たノウハウや注意ポイントなどを以下に説明します。
ソフトウェア移植の際に必ず注意しなければならないのはint型のサイズの違いです。ソフテックだより第31号の「3.intの弊害」でも紹介させていただきました。
int型変数は、16ビットCPUの場合は16ビットの領域が確保され、32ビットCPUの場合は32ビットの領域が確保されます。
基板Aおよび基板Bは16ビットCPUから32ビットCPUに変更となりましたが、使用したコンパイラ(CS+ for CC V4)には図 2の赤枠の設定があり、この設定を有効(「はい」を選択)とすることで、プログラムを変更しなくても、int型の変数をshort型(16ビット)として動作させることができました。
図2. コンパイル設定
基板Aおよび基板Bのソフトウェア移植では、この設定を有効とすることで、特にint型のサイズの違いに困ることなく移植することができました。
この設定がない場合は、1つ1つ移植前のint型変数と同じサイズの型に置換していくことになりますが、int型はよく使われる型であるため置換作業も大変です。
コンパイラによっては、ソフトウェア移植を考慮したコンパイル設定が設けられている場合がありますので、コンパイル設定には一通り目を通した方が良いと考えます。
変数の型には、負の値を扱える符号付きのsigned型変数と、正の値のみを扱う符号なしのunsigned型があります。
この開発では、signed型とunsigned型の比較文で、移植前の動作と異なってしまう動きがありました。
図3のソース1への引数が-1(0xFFFF)の場合ですが、if文で0xFFFFと比較したとき移植前CPUではif文の真条件に入りましたが、移植後CPUではif文の真条件に入りませんでした。
アセンブラレベルで確認したところ、32bitCPUなのでshort int numの-1(0xFFFF)は符号拡張されて0xFFFFFFFFとなり、0x0000FFFF(unsigned型)と比較していることで偽条件となっていました。
この場合はソース2のように明示的に-1と比較しないと、変数の中の値が0xFFFFだとしても正しく処理されません。
/* ソース1 */
/* 例:引数numが-1の場合 */
void sample(short int num)
{
if(num == 0xFFFF)
{
/* ここに入らない */
return;
}
}
/* ソース2 */
/* 例:引数numが-1の場合 */
void sample(short int num)
{
if(num == -1)
{
/* ここに入る */
return;
}
}
図3. signed型変数とunsigned型変数による動作の違い
例はshort型で説明しましたが、signed/unsignedの型があるchar型/int型/long型などでも同じです。また、固定値との比較だけではなく、signed型とunsigned型の変数比較でも同じです。
この開発ではsigned型変数を使用しているすべてのコードをチェックし、問題がないことを確認しました
。signed型とunsigned型の変数比較箇所はエディターの検索機能で簡単には見つけられないので、1つ1つチェックしていく必要があり大変でした。
CS+ for CC V4ではこのような動きになりましたが、コンパイラによってはソース1でも真条件と判断され、問題ないこともあります。
コンパイラによって動きが変わるので、事前に確認が必要な部分です。
タイマやシリアル通信など同じような機能でも、CPUによっては動作タイミングが異なることがあるので注意が必要です。
シリアル通信の送信割り込みを例に説明します。
基板A−基板B間は9600BPSのシリアル通信を行っています。
表2の通り、移植前CPUの送信割り込みは1種類ですが、移植後CPUの送信割り込みは2種類あります。
移植前CPU(東芝CPU) | 移植後CPU(ルネサスCPU) |
---|---|
送信割り込み ⇒ストップビットの送出の直前に割り込み発生 |
送信データエンプティ割り込み ⇒送信データレジスタから送信シフトレジスタへの転送完了後に割り込み発生 |
送信終了割り込み ⇒ストップビットの送出の後に割り込み発生 |
表2. 送信割り込みの相違
移植後CPUの送信割り込みを、送信終了割り込みの1種類で対応しようとすると、移植前CPUの割り込みタイミングは「ストップビットの送出の直前」であったのに対し、移植後CPUの割り込みタイミングは「ストップビットの送出の後」となります。この割り込み発生タイミングの違いによりシリアル通信の1バイト−1バイト間に空きが出てしまい、通信の動作に違いが出る結果となります。
本開発の送信割り込みは送信データエンプティと送信終了割り込みの両方を使用する設計とし、移植前と通信動作の違いが出ないようにしました。
3.4 処理速度の違いによる問題
ハードウェアとのI/F部分の移植に問題がなくても、システム全体で動作させると問題が発生することがあります。
本開発でも、処理速度が速くなったことで基板A−基板B間の伝送タイミングが変わり、通信異常が発生するということがありました。
影響の少ない対策方法を検討し、通信タイムアウト時間を調整することで対応しました。ソフトウェア移植前後の基板組み合わせで問題のない通信タイムアウト時間としなければならないため、お客様とも連絡をとりながら慎重に通信タイムアウト時間を検討しました。
このように、本開発ではソフトウェア移植前後の基板の組み合わせによる問題がないかにも注意して確認しました。
また、ソフトウェア移植前のシステムと1つ1つ動作比較を行いながら試験を実施し、移植前のシステムと動作の相違がないことを確認しました。
3.5 修正を行う前にお客さまへ確認
本開発のデバッグや試験中に仕様書と異なる動き(不適合)が見つかることがありました。調査したところ、ソフトウェア移植前からある問題でした。
不適合なのでこの機会に仕様通りの動作に修正するのが適切と考えがちですが、既存の動きから変えてはいけないこともあるので注意が必要です。
本開発の場合は基板A〜Dの接続の組み合わせがあるため、1つの基板の動きを変えることで他の基板の動きへ影響するということも考えられます。また、基板交換後に動作が変わってしまうとユーザーが困惑することになります。
本開発では、不適合が発生する条件、修正した場合の影響範囲などを見極め、どのように対応するのかお客様と詰めました。
仕様書と比較すると動きが違うが、運用上は問題にならない内容であるため、お客様と相談してソフト修正ではなく仕様書修正で対応した内容もありました。
よかれと思ってソフト修正しても、その修正がシステムへ影響を与えることがありますので、お客様と認識をあわせながら対応する必要があると考えます。
ソフトウェア移植作業はハードウェアとのI/F部分をさっと置き換えて完了!とできれば良いのですが、コンパイラを変えることの影響や処理速度が変わることの影響など、注意しなければならないことが多くありました。
移植前後の動きが異なる場合、移植前のデバッグ環境も立ち上げ、同じソースコードなのになぜ動きに違いが出るのかを調査し、その調査結果を元にお客様と相談し、どの基板組み合わせでも影響がないように対策を検討するのは大変でした。
思っていたより大変な開発でしたが、弊社が開発したソフトウェアを新しいハードウェアに移植し、継続して使っていただけるということは大変ありがたいことだと思います。
引き続き、末永く使っていただけるソフトウェアを目指して開発していきたいと思います。
(M.A.)
関連ページへのリンク
関連するソフテックだより