Tech Article

高性能で低消費電力、32ビット・マイコンへ移行すべきか(中編)

 前編では、32ビット・マイクロコントローラへの移行が進んでいる要因として、処理性能の高さや消費電力量の少なさを挙げた。そして、ARMアーキテクチャのマイクロコントローラ「Cortex-M0」と「Cortex-M3」を例に挙げ、8ビットや16ビットのマイクロコントローラよりもコンパクトなプログラムを作れるということを解説した。

 中編では、32ビット・マイクロコントローラの処理性能の高さと、消費電力量の低さを検証する。さらに、Cortex-Mシリーズが備える、消費電力を節減する機能について解説する。

低消費電力で高性能な32ビット・マイコン

 多くの組み込み開発者が8ビットや16ビットのマイクロコントローラから32ビットのマイクロコントローラに切り替える理由の1つとして、組み込み製品の処理性能向上に迫られているという点が挙げられる。もちろん、切り替えることで性能は上がる。

 しかし、上がるのは性能だけではない。あまり知られておらず、正しく理解されていないことだが、電力効率も上がるのだ。ARMアーキテクチャのマイクロコントローラに切り替えることで、消費電力を低減でき、組み込み製品の電池駆動時間を延長できる。

 まずは、性能を比較してみよう。マイクロコントローラの処理性能を比較する一般的な方法としては、先に挙げたDhrystoneが挙げられる。このベンチマーク・プログラムは、無料で使いやすく、またプログラム・サイズが小さいので主記憶容量が極めて小さいマイクロコントローラでも簡単に使える。8ビットや16ビットのマイクロコントローラと、Cortex-MシリーズをDhrystoneベンチマークの結果で比較したグラフが図1だ。

図1
図1 5種類のマイクロコントローラの性能をDhrystoneで計測した結果
Cortex-Mシリーズが圧倒的な性能を見せている。

 最も性能が低かったのは初期型の8051で、0.0094DMIPS/MHzだ。8051アーキテクチャの最新マイクロコントローラの処理性能はわずかに向上している。例えば、米Maxim Integrated Products社の「80C310」の結果は0.027DMIPS/MHzとなっている。そして、Microchip Technology社のPIC18は0.02DMIPS/MHzだった。図には示していないが、Microchip Technology社の16ビット製品の性能はCortex-M3の半分以下だった。

 このように、8ビットや16ビットのマイクロコントローラは、ARM Cortex-Mシリーズに比べるとかなり遅い。Cortex-M3マイクロコントローラの結果は1.25DMIPS/MHzであり、Cortex-M0マイクロコントローラは0.9DMIPS/MHzだった。

 一般に、8ビットのマイクロコントローラは、16ビットや32ビットのデータを扱うときに処理性能が落ちる。先に述べたように、整数型やポインタ、整数演算を実行するライブラリ関数を使うためだ。整数型やポインタを処理するたびに一連の複数の命令が必要になるので、処理性能が低下しコード・サイズが大きくなる。

 問題はまだある。8ビットや16ビットの多くのマイクロコントローラは命令セットに強い制限があり、マイクロコントローラ独自のプログラミング・モデルでの開発を要求されるのだ。例えば、8051は、データの転送やデータを処理するときにアキュムレータ(ACC)とデータ・ポインタ(DPTR)に大きく依存する。結果として、ACCとDPTRに対するデータの出し入れのための命令が多くなるため、コード・サイズは大きくなり、処理性能は落ちる。

メモリー・インターフェース幅による制限

 主記憶との接続インターフェース(メモリー・インターフェース)も8ビットや16ビット・マイクロコントローラの処理性能を制限する要因の1つとして挙げられる。例えば、8051の命令には、16ビット長や24ビット長のものが多い。しかし、メモリー・インターフェースの幅は8ビットしかない。非常に簡単な演算であっても、命令を読み込むために主記憶へ複数回アクセスしなければならない。その結果、多数のクロック・サイクルを費やすことになる。

 主記憶の64Kバイトを超える領域にアクセスするとき、8ビットや16ビットのマイクロコントローラの処理性能はさらに低下する。8ビットや16ビットのマイクロコントローラは、主記憶のアドレス幅が16ビット(メモリー空間が64Kバイト)になっている。プログラム・カウンタもデータ・ポインタも16ビットになっており、命令セットは64Kバイトのメモリー空間で上手く動作するように設計してある。しかし、16ビット・マイクロコントローラを使いながら、64Kバイトを超える主記憶が必要になる場合も多い。メーカーは、ハードウエアを追加したり、追加の命令を用意することで対応しているが、これが原因で性能が落ちることも多い。

 64Kバイトを超える主記憶へのアクセスが可能なマイクロコントローラの代表として、8051を例に説明しよう。メモリーは「バンク」単位で分割されていて、バンクを切り替えるときは毎回、バンク#0(固定バンク)を経由する必要がある。その結果、コード・サイズは大きくなり、クロック・サイクルも浪費することになる。一部の16ビット・マイクロコントローラは、プログラム・カウンタを大きくしたり、セグメント方式で主記憶を管理するなどの方法でこの問題を回避しているが、大きなアドレス値を取り扱うと、やはり余分な処理が必要となるため、処理性能が低下し、プログラム・コードも大きくなる。

 32ビット・マイクロコントローラのメモリー・インターフェース幅は32ビットだ。8ビット、16ビット・マイクロコントローラに比べると、少ない回数のアクセスで、主記憶から多くのデータを取得できる。主記憶へのアクセスの回数が減ると、性能向上だけでなく消費電力の節約にもつながる。メモリー内の同量のデータをコピーする場合、8ビット・マイクロコントローラでは、主記憶へのアクセス回数が32ビット・マイクロコントローラの4倍にもなる。

 命令読み込みの面でも、Cortex-Mシリーズのマイクロコントローラは8ビットや16ビットのマイクロコントローラよりもはるかに効率がよい。1回の読み込みで32ビットの命令を取得できる。16ビットThumb命令なら、1クロック・サイクルで最大2つの命令を読み込める。

 32ビット長の命令を読み込むには、8ビット・マイクロコントローラなら32ビット・マイクロコントローラに比べて主記憶へのアクセス回数が4倍になる。16ビット・マイクロコントローラなら2倍だ。命令の読み込みでも、8ビットと16ビットのマイクロコントローラは、32ビットのマイクロコントローラに比べてより多くの電力を消費するのだ。

コードの肥大化が電力の浪費につながる

 ARMアーキテクチャへの移行を考える開発者にとっての最大の懸念の1つは、消費電力が増大する恐れである。しかし、最新のARMアーキテクチャのマイクロコントローラを見ればすぐ分かることだが、ARM Cortex-Mシリーズのマイクロコントローラは、ほとんどの16ビットや8ビット・マイクロコントローラよりも消費電力が低い。

 Cortex-Mシリーズのマイクロコントローラが、組み込み機器の消費電力を低減できる理由を理解するための第一歩は、標準的なマイクロコントローラの内部を調べることだ。最新のマイクロコントローラでは、消費電力を最も大きく消費している要素はマイクロコントローラのコアではない。

 前述のように、8ビット・マイクロコントローラのコード・サイズは大きくなりがちだ。この結果、マイクロコントローラは大きなフラッシュ・メモリーのブロックを搭載しなければならなくなり、消費電力が増大する(図2)。ARMアーキテクチャのマイクロコントローラのコード密度は特に高いため、マイクロコントローラが使用するフラッシュ・メモリーを小さくでき、消費電力とコストの両方を抑えられるのだ。

図2
図2 8ビット・マイクロコントローラと、Cortex-Mシリーズのチップ構成の違い
コアはCortex-Mシリーズ(右)の方がやや大きいが、8ビット・マイクロコントローラはフラッシュ・メモリーがかなり大きい(左)。

より低い動作周波数で同程度の性能を発揮

 図1の結果が示すとおり、Cortex-Mシリーズの性能は8ビットや16ビット・マイクロコントローラよりもかなり高い。このように処理性能が高いマイクロコントローラを使うと、同じ性能を達成するにも、8ビットや16ビットのマイクロコントローラよりも駆動周波数をかなり低くできる。その結果、消費電力削減につながる。例えば、30MHz駆動の8051で動作するプログラムは、Cortex-M3ならわずか3MHzで動作させても同程度の速度で動作する。

 考え方を変えて、必要なときだけマイクロコントローラを動作させるようにするとどうだろうか。ARMアーキテクチャのマイクロコントローラは、消費電力の低減に主眼を置いて設定してあり、そのために数々の機能を盛り込んである。もちろん、必要のない部分への電力供給を止めるスリープ・モードも数種類用意している。割り込み処理が終了すると直ちにマイクロコントローラをスリープ・モードにする「sleep-on-exit」という機能まで備えている。

 図3は、8051とCortex-Mシリーズで同じプログラムを実行したときに、マイクロコントローラが動作している時間とスリープ・モードに入っている時間を示したものだ。8051は処理性能が低いので、処理に時間がかかり、なかなかスリープ・モードに入れない。

 一方、Cortex-Mシリーズは一瞬で処理を終えて、長いスリープ・モードに入っていることが分かる。8051と比べると、マイクロコントローラが動作する時間を短くできるので、消費電力を節約できるのだ。

図3
図3 同じプログラムを動かして、スリープ・モードに入っている時間を比較した図
Cortex-Mシリーズはほとんどの時間、スリープ・モードに入っているのが分かる。このため平均消費電力(オレンジ色の線)も低い。

 ARM Cortex-Mシリーズは、高いエネルギ効率が得られ、8ビットや16ビットのマイクロコントローラよりも、はるかに優れた性能を発揮する。ARMアーキテクチャのマイクロコントローラはエネルギ効率を追求して設計されている。さらに、優れた処理性能を利用して、長い時間スリープさせるなど、いくつかの方法で消費電力を削減できる。

 後編では、8ビットや16ビットのマイクロコントローラからCortex-Mシリーズにプログラムを移植する際に注意すべきポイントを解説する。

記事一覧

PR