■ファームウェアって何?
組込ソフトに従事している人は、「ソフト書いてます」とは言うかもしれませんが、「アプリ書いてます」とは言わないですよね(私も)。もっと言うと、「ファームウェアを書いています」って言いたいですよね。相手が理解してくれれば。
そう。またまた大問題の「相手が理解してくれるか」【ファームウェア】編です。
ファーム(Firm)ですから、辞書で確認すると「固い」ですね。この反対側にあるのは「ソフト」(柔らかい)なんでしょうね。これ、疑いもないと思います。つまり、「ソフト」じゃないという意味?
あれ?先ほど「ソフト書いてます」とは言うよね?っという話をしました。でも、ソフトじゃないファームを書いているとは??
やっぱり混乱を生む言葉「ファーム」ですね。。。
固いとは?と、これまたググると、
「原則として変更を行わない事からハードに近いからFirm」だそうです。原則として変更を行わない????
「中の人」から見ても、今となっては変更を行わない、は無いよね、、という事になると思います。
更に、その「ファーム」に対しての比較が、「ソフト」だという点。「ファーム」の反対だとすると、書き換えが容易で非ROM搭載だと「ソフト」???
また、一般の人を混乱させてしまう言葉になりかけていますよね。
そもそも、「ファーム」と(一般に言われる)「ソフト」との違いは何だろうか?っと考えてみましょう。
一般に「ソフト」と言われると「アプリ」ですかね。正確には「アプリ」も「ファーム」も含んでソフトウェアだと思うんですが、一般の方から見ると、「ソフト」はネットからダウンロードして買えたり、ちょっと昔ならCDが入った「パッケージソフト」として量販店などに並んでいて買うもの。最近はスマホの「アプリ」と言われている感覚でしょうか。
ではこれら「ソフト」と「ファーム」の根本的な違いは???
最初に答えを言っちゃうと、「ソフト」はWindowsやLinux、MacやiOS、AndroidなどのリッチなOS環境で、かつデスクトップ的な画面が存在する様なコンピュータシステム上で動くことを想定された、「アプリケーションのみのプログラム」が「ソフト」であり「アプリ」です。OS環境が無いと動かない、OS環境を前提としたプログラムとも言えると思います。
「ファーム」は、OSから(前回 https://qiita.com/Cente_mw/items/3cec7a3e76f7cdac3d7e にて説明した)ミドルウェアやアプリケーションをすべて同梱して、CPUがこの「ファーム」を読み込みながらOSを起動してミドルウェアを動かしてアプリケーション動作をする、、、全ての機能が1つのソフトになっているのが「ファーム」だと思います。
組込の場合、開発環境は多くの場合Windows上のIDE(Integrated Development Environment:統合開発環境)の中でコードを書き、クロスコンパイルして、組込CPU向けのプログラムコードを吐き出します。(https://qiita.com/Cente_mw/items/ae2fb536d881d8ce17cf 参照)
このプログラムコードは、組込CPUがコールドスタート(電源ONして起動する)したときに、最初に読み込まれて機能します。ミドルウェア編(https://qiita.com/Cente_mw/items/3cec7a3e76f7cdac3d7e )でお話ししたように、必要最低限の機能をレゴブロックの様に組み合わせたプログラムをすべて読み込んでCPUが動くのです。この段階で初めてOSが立ち上がり、ミドルウェアを起動して、アプリケーションが起動する、、、という事です。
一般のWindowsで、VisualStudioなどで「ソフト」を開発して****.exe(例)を生成したとしましょう。このexeファイルにはOSが入っていませんよね?既にOSが起動している状態で、その上で起動されることを期待したexeファイルなのです。
このように「ファームウェア」は、Firm(固い)という意味合いではなく、コンピュータ(CPU)をゼロから起動するソフトウェアすべてを含んでいるプログラムです。ですから、「ファームウェア」開発では、CPUの起動やデバイスの制御、OSの起動、ミドルウェアの導入、という、アプリケーション層を書くまでのハードウェア由来の技術要素をしっかり理解していないと開発できないのです。
「アプリ」書きの様に、例えば、Windows環境での「アプリ」の書き方を知っていれば良いのではなく、CPUの起動からすべてスコープに入ってくるのが「ファームウェア」なのです。だから難しい。。
https://www.cente.jp/about/cente-introduction の表現で言うと、「Linuxの場合」にある「アプリケーション」が「ソフト」「アプリ」であり、右側の「Centeの場合」にある RTOS、ミドルウェア、アプリケーションを結合したもの。。これが「ファーム」です。
ですから、「ファーム」は原則として変更を行わない事からハードに近いから、、、というよりは、ROMに格納されるから?が一番近い回答な気がします。OSなども同梱した組込CPU用ソフトウェア(プログラム)、という事になると思います。
■ファームウェアとアプリの違いの「結論」
結局、ぎゅっとすると、、、 ファームウェア ... 組込CPU上で動作するOS自身を含むプログラムのこと
アプリケーション ... OS上で動くことを想定したプログラムのこと
ですね。言いたかったのは、この「違い」について理解していますか?っという点。理解したうえで、スキルを磨きましょうね!っという事を言いたかった。それぞれ要求されるスキルは異なる訳で、単に「言語」を操作できるから「ソフト」が書けるわけじゃなくて、どんな環境で、どんな機能を実現するのか、、をよく考えて開発スキルを積みましょうね!っという感覚です。
■今日の閑話
何でこんな話を今更書いたのか?っというと。Windows環境で「ソフト」を書いた実績のあるエンジニアは、組込の領域に移籍しても「ソフト」は書けるんだろうか?経験者として開発にどの程度順応できるんだろうか?っと問われたこと。経験のある「ソフト」の立ち位置をちゃんと理解してさえいれば、他の環境で何を追加で勉強するのか、逆に環境に頼って開発できるのか、などが理解出来ると思います。
最近、Phython書けます、Ruby書けます、C++書いてました、、という履歴書を読みます。さて、どんな環境でプログラミングをしていて、そのプログラムはどう動いているのか?そこを意識できているか、説明できるか、がエンジニアとしては問われると思います。
Cente:
https://www.cente.jp/
お問合せはこちら:
https://www.cente.jp/otoiawase/