1カ月集中講座
IoTの波に乗るマイコン事情 第1回
~組み込み向けプロセッサとアプリケーションプロセッサの違い
(2015/1/8 06:00)
この原稿を書いている今まさに、米国ラスベガスで2015 International CESが開催されているのはご存知の通りである。開幕に先立って報道関係者向けにプレビューとして行なわれる「CES Unveiled」を取材していたライターの笠原一輝氏が、冗談交じりにFacebookへ投稿した内容によれば「今年のCES、センサー、IoT、以上(笑)」だそうである。
さて、センサーやIoTといったキーワードが出てくる場合、欠かすことができないのはCPU(あるいはMPU)ではなく、MCUである。MPUはMicro Processor Unit、MCUはMicro Controller Unitの略で、前者は通常CPU、後者は通常マイコンと呼ばれる。では何が違うんだという話からまずは始めたいと思う。
MPUとMCUの違いは、いくつかの観点から総合的に見るのが正しいかと思う。というのも、ある1つの視点だけで見た場合、かならず例外があって収束しないためだ。まずはハードウェア的な視点から見てみると、
- MPUもMCUも、命令を解釈してその結果に合わせてデータ処理を行なうのが主な処理であり、大分類で言えばどちらもCPUである。また内部のアーキテクチャも、必ずしも大きな違いがあるとは言いにくい。実際、ハーバードアーキテクチャ(命令とデータを異なるパスで扱う)は昨今のMCUも普通に搭載しているし、キャッシュを持つMCUも少なくない。スーパースケーラ搭載のMCUも存在する(最近だとARMのCortex-M7が挙げられる)。強いて言えば、アウト・オブ・オーダ搭載のMCUはほとんど存在しないし、階層構造のキャッシュを持つMCUもほとんどないが、技術的にはその程度の違いしかない。ただしMCUの中には、DSP(Digital Signal Processing)をベースとしたアーキテクチャも含まれるが、これがMPUで採用されたケースはない。
- MPUは、命令セットはともかくとして内部はほぼRISC的な処理機構を搭載する。対してMCUはRISCとCISCの両方が混在するが、大勢はRISCになってきている。ちなみにx86のようなCISC/RISC変換を行なうものはほとんどない。
- 動作周波数のレンジが概ね1桁違う。MPUは1GHz以上の動作周波数を持つものが非常に多く、特にPC用だと3GHz超えも当たり前である。MPUでもモバイルあるいは組み込み機器向けのアプリケーションプロセッサだともう少し低い動作周波数(下は500MHz位から)になるが、スマートフォン用のハイエンドは2GHzを超える動作周波数も珍しくない。
- 一般にMPUはキャッシュを搭載することはあっても、メモリは外付けとなる。一方MCUは原則としてメモリを内蔵(SRAM)する。また、MPUはサポートするメモリは原則としてDRAMのみであり、ブート用のフラッシュメモリなどは(専用コントローラを持つものもあるが)、フラッシュメモリの内容をいったんDRAMに展開し、それを読み出すという手順になる。対してMCUは直接フラッシュメモリにアクセスし、内容をSRAMに展開することはまずない。またフラッシュメモリ以外にもEEPROMとか各種OTP(One Time Programmable) ROMも内蔵するものもある。
- 特定用途向けMPU(例えばネットワークプロセッサやモバイルプロセッサなど)の中には汎用I/Oを豊富に持つものもあるが、一般にはプロセッサ間リンクや高速I/Oなどに限られ、またアナログ周辺回路を搭載するケースはほとんどない。対してMCUは高速I/Oを持つものはほとんどなく、USB 2.0(480Mbps)が事実上の最高速となる。その分低速I/Oは非常に豊富である。またADC(Analog/Digital Converter)やDAC(Digital/Analog Converter)、Comparator(比較器)、オペアンプ、電圧リファレンス、各種タイマーやPWM(Pulse Width Modulation)モジュールなどのアナログ周辺回路を標準的にサポートする。
- MPUはちょっと古いもので1.8V、最近では1.5Vや1.2Vの低電圧で動作し、これにあわせて入出力電圧も1.2V程度に抑えられている。対してMCUは3.3Vが標準で、古いものは5Vの入出力も可能。
といった項目がとりあえず思いつく。次にソフトウェアの観点から見ると
- MPUは32bitアーキテクチャが最低ラインで、最近は64bitアーキテクチャに移行しつつある。またこの64bitアーキテクチャは、過去の32bitアーキテクチャとの互換性を持つのが一般的である。対してMCUでは4/8/16/32bitアーキテクチャが混在しており、いまだに4/8bitアーキテクチャも根強い需要がある。昨今は16bitが次第に32bitに併合されつつある気配はあるが、なくなるまでにはまだ相当時間がかかる。また異なるアーキテクチャの互換性は原則としてない。
- MPUではまずOSが動き、その上でドライバやランタイムが動作し、さらにその上でアプリケーションが動くことになる。これに対しMCUでは、OSはないか、非常にプリミティブな機能だけを提供するRTOS(RealTime OS)のみが提供され、その上で直接アプリケーションが動作する形となる。
- MPUでは仮想記憶がごく当然であり、32bitまたは64bitの仮想アドレスが提供される。実際のメモリ搭載量の制約をアプリケーションが意識する必要はほとんどない。対してMCUの場合は、物理アドレスを直接アプリケーションで扱うことになる。メモリ量も、書き換え可能なSRAM領域が数百Byte~多くて数百KB。プログラムを格納するFlash/EEPROM領域が数KB~多くて数MB程度しかなく、このメモリ量をアプリケーションは意識して記述する必要がある。メモリ管理ユニットは存在しないか、簡単なMMU(Memory Management Unit)が搭載され、Guard Pageなどの管理ができる程度である。
- MPUにおいては、複数のタスク(WindowsやLinux用語ならプロセス)が同時に実行できるマルチタスク環境が当然であり、OSやミドルウェアなどもプロセスの形で実装される事も珍しくない。対してMCUでは、1つのタスクのみが実行されるシングルタスクが基本である。RTOSや、一部のMCUではISR(Interrupt Service Routine:割り込み処理ルーチン)を介してマルチタスクが可能なものもあるが、MPUにおけるマルチタスクとはやや意味合いや、できることが異なる。
- MPUにおいて、特にOSを利用する環境では一般にハードウェアをアプリケーションから直接アクセスするのは不可能で、デバイスドライバやさらに上層のOSサービス経由でのアクセスとなる。対してMCUでは直接ハードウェアに対してI/Oを実行できる。
- MPU上で動くOS環境では、基本的には搭載しているデバイスや周辺回路用の全てのドライバやミドルウェアがロードされた状態で動作し、これをアプリケーションが適時動的に呼び出す形になる。対してMCUの場合、必要とするデバイス用のミドルウェアをアプリケーション開発者が明示的に選択し、アプリケーションに組み込む形で利用する。
といったところだろうか。一方で、マーケティング的な観点で見ると、
- MPUの値段は最低10ドル~高いもので数千ドル程度。対してMCUは高くても数十ドル(めったにない)。大半のものは数十セント~数ドルで、10セント未満のものも結構ある。
- MPUの消費電力(Active Power)は低いもので数W~数十Wで、高いものは100Wを超えるものも存在する。従ってヒートシンクなしはありえず、現実問題としてはファンなどを併用するアクティブヒートシンクや、中にも液冷などの利用を前提とするものすらある。対してMCUは、一番高いものでも数Wで、通常は1W未満。ごく一部の例外を除き、基本ヒートシンクなしでの利用となる。
- MPUの性能はおおむね数GIPS~数十GIPS/数GFLOPS~数十GFLOPSとなる。特に汎用製品の場合、浮動小数点演算能力が昨今ではずいぶん強化されており、ほぼ整数演算性能と変わらないのが一般的である。対してMCUは数MIPS~数千MIPSである。またMCUでは浮動小数点演算は必須ではないため、FPUあるいはSIMD演算ユニットはオプション扱いのことが多く、これらを使っても性能は整数演算よりは落ちるのが一般的である。
といった話が出てくる。
このほかにもズラズラと書き並べることはできると思うが、そろそろ読むのが苦痛と言われそうなので、このあたりに留めておく。繰り返しになるが、どの話に関してもほぼ間違いなく例外というか反例があるので、あくまで全体的な傾向としてみた場合、という話だ。
MPUとMCUの違いに着目するには、むしろ使われ方の違いを見た方が分かりやすいかもしれない。
例えばPC。昨今のPCの原型といってもよい初代のIBM-PCは、ご存知の通りCPUとして「8088」が搭載されていたが、実はこれ以外に、もう1つマイコンが搭載されていた。それはキーボード内部に入っている「8048」コントローラである。IBM-PCのキーは当初83キー、後に101キーが出ることになるが、これをマトリックス状に配置し、どのキーが押されているかを随時スキャンした上で、そのキーコードをIBM-PC本体に送る、という仕事をしている。この仕事をCPUでこなせないわけではないが、CPUの負荷が高まるとキースキャンの頻度が落ちかねず、キー入力の取り漏らしなどが発生しやすくなる。逆にキー入力の取り漏らしを防ぐようにキースキャンをきっちりとCPUにやらせると、今度はCPUの処理能力を大幅に奪われかねない。キースキャン専用MCUを別に用意し、キー入力の取り込みとキーコードへの変換はMCUに全部任せてしまい、CPUはキーコードだけを受け取るようにする方が、性能面でもメリットは大きく、回路的にもシンプルになり、おまけに設計コストも下がる。
もう1つPCにおいてMCUが活躍している例を挙げると、昨今のマザーボードは、電源投入時に自己診断を行ない、異常があればビープ音やLEDで表示してくれる機能が標準的に搭載されている。こちらはIntelのケースであるが、他社のマザーボードもそう大きくは変わらない。
さて、こうした診断機能は、最近ではメモリの不良やCPUの異常といったことまで警告してくれるのだが、これは誰がやっているのか? と言うと、マザーボード上にあるMCUである。当たり前だが、メモリに異常があったら、そもそもCPUが立ち上がらないから、POST(前処理)に入ることすらできない。もちろん、そのような状態でビープ音やLEDの制御ができるわけもない。
実際にはマザーボードの電源が入ると、まずマザーボード上に搭載されたMCUがすぐに動作を開始し、メモリの初期テストやCPUの起動シーケンスの監視などを行ない、ここでエラーがあったらビープなりLEDなりで表示することで、それを知らせるわけだ。こうした機能が付いたのはここ数年のことで、それ以前のマザーボードは何かおかしいと「何も起きない」だけだった。なので手探りで1つ1つ起動しない可能性を潰していくという根気強い作業が必要だったのが、MCUの搭載でトラブル時のメンテナンスが大幅に容易になったわけだ。
ちなみにこのMCUはブート時以外は何をしているか、というと何もしていないものもあるし、電源管理などを行なっている場合もある。ただ、電源管理までやらせると、処理プログラムが大きくなってしまい、コスト面などでも不利なので、ブート管理専用と割り切って小さなMCUを搭載する方が多いそうだ。
要するに、特定の機能だけをやらせるという用途にMCUは非常に適している。また電源管理(電源コントローラに、供給すべき電圧を指示したり、最大電流量を設定したりする)とか温度/ファンコントロール、LEDやビープの駆動、あるいはさまざまなスイッチの状態取り込みといった入出力も、MPUの場合はチップセット経由でGPIOピンを通して外部回路を駆動することになるが、MCUだとこれらのものが直接繋げたりするから(さすがにファンコントローラは別途ドライバが必要だが、これは例外)、はるかに回路もシンプルになる。MPUは「何でもできる」が「何をさせるのにも適している」わけではない。用途によってはMCUを外付けにして、ここに作業をオフロードした方が賢明というケースは少なくない。
さて、やっと冒頭の話に戻ってきた。IoTやセンサーにはMCUが必須で、切っても切れない関係にある。理由はコストと効率性である。
まずコストであるが、IoT時代になって2020年に500億台のデバイスがネットワークに接続される、という話はしばしば耳にする。あるいは2020年にはこのIoTの経済規模が3兆400億ドルになるという数字も出てくる。
ただ冷静に考えてほしいのだが、例えば3兆400億ドルを500億台で割ると、60.8ドル/台という計算になる。しかも一口にIoTといっても、高いコストが許容されるのはIoTの中でも上位、つまりクラウドサーバーとかデータ処理のビッグデータ関連のみである。さらに経済規模の中には通信コストも含まれるようなので、末端デバイス自身のコストは相当抑えないといけない。実際、単純なセンサーノード(例えば気温とか湿度などを定期的に発信するだけのもの)のコストは100円ですら高すぎ、できれば10円未満に抑えたいというのが実情だろう。これは別にIoTに限った話ではなく、PCでも携帯電話でもスマートフォンでも同じ話であり、裾野が広がり市場が拡大するのは価格が下がるからだ。
IoTも同じで、今はMCUにセンサー、それと接続用のRFを秋葉原の電子部品屋などで個別に買ってきて繋げると、1,000円を切るのは難しい。ところがいくつかのメーカーが出している、RF統合のMCUにセンサーを繋げるようにすると、量産に乗れば原価は百数十円まで落とすことができる。2020年にはこれを原価数十円まで落とさないと広がらないと見られており、逆に言えばそこまで落とせるから広がる、と考えることができる。この価格帯で製品を出すことは、MPUでは絶対に不可能である。
もう1つが効率性である。単純なセンサーノードはなるべく小さく収めたい(でないと取り付け場所にも苦労することになるし、コストも上がる)し、なるべく長時間の運用をさせたい。理想を言えばボタン電池1つで数年単位で動作するくらいでないと、爆発的に普及というのは難しい。あるいは太陽電池と併用でもよいが、こちらは天候に応じて発電量が左右されるから、さらに運用条件は厳しくなる可能性がある。
しかも単純なセンサーノードの場合、毎秒といった頻度でデータを収集する必要はなく、せいぜいが分あるいは時間単位となる。やることは、センサーから値を読み取り、それを上位のノードに送るだけだから、処理時間の99%以上は待機状態となる。つまり絶対性能は低くてもそれほど支障はなく、それよりも待機時間にどれだけ消費電力を減らせるかがバッテリ寿命の鍵になる。昨今のローエンドMCUはまさしくこうした用途に向けた構成になっており、MPUの出る幕はない。
もちろんIoTの中にはもう少し自律的な処理が必要な場面も多く、あるいは手持ちのPCやスマートフォン/タブレットがこうしたセンサーノードのUIあるいはハブとなる可能性もあるから、MPUと無縁ではないのだが、一番数が出て主役とも言えるのはMPUではなくMCUである。
ということで今回はMPUとMCUの違い“のみ”をご紹介したが、次回はもう少し具体的な製品を取り上げてみたいと思う。