マイコンには、タイマやシリアル通信やROM/RAMといった記憶装置など、様々な周辺機能が実装されています。
CPUが変わると、周辺機能の構成も変わるため、ソフトを移植するためには、周辺機能の構成に合わせて修正する必要があります。
ソフテックで開発している組み込みソフトウェアでは、移植性を考慮してアプリケーションとドライバを分離して開発を行っています。
 |
| 図1. ソフトウェアの構造 |
アプリケーションとドライバを分けることで、ハードウェアが変わっても、理論的にはドライバ部分を修正するだけで、ソフトウェアの移植が可能になります。
つまり、以下のようにソフトウェアの移植を行います。
ここで分かりやすく、流用元のシステムをA、新しく開発するシステムをBとします。
システムをB用に、新規にドライバBを作成、あるいはドライバAから修正したドライバBを作成します。
アプリケーションAとドライバBを組み合わせることにより、新たなシステムBを開発することができるのです。
 |
| 図2. ソフトウェアの移植 〜ドライバを新規に作成する〜 |
また、新しく使用するCPUを既に別のシステムで使っている場合もあります。
この場合、別のシステムのドライバを移植することが可能です。
別のシステムをシステムCとすると、アプリケーションAとシステムCを組み合わせてシステムBを開発することになります。
 |
| 図3. ソフトウェアの移植 〜既存のドライバを流用する〜 |
他のシステムのドライバを利用した時の利点としては、以下のものがあります。
<他のシステムのドライバを利用した時の利点>
・ 既に実績のあるソフトウェアであるため、信頼性が高い。
・ ドライバを新規に作成する必要がない。
ただし、他のシステムのドライバをそのまま流用できるとは限りません。
それぞれのシステムで、個々にアプリケーションやドライバを作成していると、以下のようなケースがあります。
(1) 流用元で使用していたドライバの関数名や引数などが異なる。
(2) 似たような機能のドライバであっても、処理内容が微妙に違う。
上記(1)、(2)の問題を解決するため、ラッパー(Wrapper)関数というものを使用することがあります。
ラッパー関数を使用することにより、アプリケーションAとドライバCを変えることなく、システムBを開発することができます。
ラップ(Wrap)とは、包み込むという意味です。
例えば、ある関数を使いたいと思ったときに、そのままではその関数を使えなく、使用するのが面倒な場合があります。そのような時に、簡単に呼び出せるような関数を作ってあげれば楽になります。このように関数を呼び出すときの手続きを省略してくれるような関数のことをラッパー関数といいます。
ここでは、アプリケーションAからドライバCを呼び出せるようなラッパー関数Bを作成します。
つまり、ラッパー関数Bは、ドライバAと同じ関数名・引数を持ち、ドライバCを呼び出すために必要な情報を作成して、ドライバCを呼び出します。また、場合によってはドライバCの処理を、ラッパー関数Bが引き取り、ラッパー関数B内で処理の内容を修正することも可能です。
 |
| 図4. ソフトウェアの移植 〜ラッパー関数を組み込んで既存のドライバを流用する〜 |
例えば、システムAで、以下のC言語による処理があったとします。
 |
| 図5. システムAの処理 |
しかし、システムCではドライバの内容が少し違っていることがあります。
 |
| 図6. システムCのドライバ |
そこで、ラッパーBを作成することによって、アプリケーションAもドライバCも変更することなく、アプリケーションAとドライバCを使用してシステムBを開発することができます。
 |
| 図7. 新規にラッパー関数を作成する |