とりあえずPCで動くものを作ってからマイコンに移植する手法は珍しいのかも?

高木です。こんばんは。

最近は社員が増えたこともあってか、このブログでの私の出番はかなり減りました。
同じ人物ばかりが書いても面白くないので、いい感じになってきたと喜んでいます。

今回のタイトルはちょっと長いですが、読んで字のごとくです。

私がマイコンのプログラミングを行う際には、まずPC上で動くものを作ります。
プラットフォームに依存しないロジックなどはそこで作り込み、動作確認も行います。
ペリフェラルに依存する場合にはその部分をエミュレートするコードも自分で書きます。

かなりの部分までPC上で作り込んでから、実機に移植を行います。
実機に移植することははじめから分かっていますから、コンパイラやOSなど、環境に依存する部分はうまく分離できるように初めから設計します。
この段階での移植に手こずった経験は、覚えている限り、これまでにはありません。

かれこれ四半世紀ぐらい、このような手法で開発を行っています。
もちろん、状況によってはこうした手法がとれないこともありますし、ごくシンプルなものであれば最初から実機向けに実装したほうが手っ取り早いこともあります。
しかし、ある程度以上複雑なものになると、やはりこうした手法をとることになるのです。

私にとっては、こうした手法は当たり前のことなのですが、世間的にはどうもそうではないようです。
この手の手法で開発することを宣言したとしても、なかなかどういうことなのか理解してもらえないことも少なくありません。
おそらく、世間的にはこのようなやり方は邪道なのかもしれません。
邪道とまでいかなくても、少なくとも少数派ですし、そうした手法があること自体知らない技術者も多いのでしょう。

あらためて考えてみると、こうした手法でスムーズに開発するためには、いくつかの条件を満たさなければなりません。

一つ目は、PC向けのプログラミングができることです。
PC上で動かすのですから当たり前のことです。
マイコン向けのプログラム開発の経験は豊富にあっても、PC向けのプログラミングがまったくできない技術者は決して少なくありません。

二つ目は、移植性に配慮したプログラミングができることです。
マイコンなので主にC言語になりますが、どのような記述が移植性があり、どのような記述が移植性がないのかを正確に把握しておく必要があります。
そのためには、C言語の標準規格についても、ある程度以上の知識を持っておかなければなりません。

また、初めて使うコンパイラに遭遇した場合には、事前にコンパイラの癖を的確に把握しておく必要があります。
マイコンのコンパイラの場合、標準準拠度が低いことは当たり前にあります。
#pragma指令をはじめ、コンパイルオプションなど、処理系特有の事情についても一通り把握しておく必要があります。
低水準のコードを書く必要がある場合には、コーリングコンベンションその他についても調査しておく必要があるでしょう。

三つ目は、PC上で動かした場合と実機で動かした場合の差についての経験が必要です。
実行時間やタイミングなど、時間に関わることが主ですが、それ以外にも注意しなければならないことがいろいろあります。
そうした経験が乏しいと、PCでは動いたのに実機では動かないなど、スムーズに移植が行えない事態が発生してしまいます。

このように、やったことがない技術者にとっては、少々ハードルが高いのかもしれませんね。
ただ、そのハードルを越えてでもやるだけの価値はあると思います。

複数の処理系でコンパイルでき、また動作を確認できたなら、そのコードはかなり健全なものであると考えられます。
特定の処理系にベッタリ依存したコードというのは不健全なものです。

組込みの開発ではハードウェアとソフトウェアを並行して開発するケースが多々あります。
なかなかハードウェアができてこないために、ソフトウェアの実装がなかなか進まないということはよくあります。
しかし、まずはPCで動くものを開発するようにすれば、ハードウェアがなくても開発を進めることは可能になります。

また、仮にハードウェアができてきても、まだ開発中のものなので、それがまともに動くかどうかはわかりません。
そんな不確かな環境でいきなり開発するよりも、確実に動くプラットフォームである程度まで作り込むほうが得策なのです。

さらに、PC向けの開発環境は、マイコン向けの開発環境に比べて、機能も豊富でずっと使いやすくなっています。
そうした便利な開発環境を使ってある程度まで開発を進める方が、ずっと効率がよくなります。

これまでやったことがないという方は、是非一度挑戦してみてください。