組み込みアプリケーション開発において、消費電力を抑える技術は様々な用途で必要とされています。例えば、充電しないで何年間も電池駆動するような用途(リモコンなど)では、なるべく長い間動作し続けられるように、マイコン機器の消費電力を可能な限り抑えた設計が必要となります。
また、それほど消費電力を気にしないような用途でも、不必要な消費電力は省くに越したことはありません。
本技術レポートでは、ソフテックで過去に開発を行った、低消費電力を重視した組み込みアプリケーション開発で得た経験を基に、ルネサステクノロジ製シングルチップマイコンH8/38024を例に説明します。
1.1 動作クロックと消費電流
マイコンの消費電流は、動作クロック周波数やクロック発振モードによって変化します。
クロック周波数が高い方が、消費電流は大きくなり、逆にクロック周波数が低ければ低いほど消費電流は小さくなります。また、マイコンに供給する電源電圧が高い程消費電流が大きくなります。(図1-1)
 |
| 図 1-1. H8/38024の消費電流 |
1.2 内蔵周辺機能
H8/38024の内蔵周辺機能には以下のものがあります。
- タイマA
- タイマC
- タイマF
- タイマG
- ウォッチドッグタイマ
- 非同期イベントカウンタ
- シリアルコミュニケーションインタフェース(SCI3)
- 10ビットPWM (PWM: Pulse Width Modulator)
- A/D変換器
- LCDコントローラ/ドライバ (LCD: Liquid Crystal Display)
これらの周辺モジュールひとつひとつについて動作/停止を設定できる、モジュールスタンバイモードという機能があります。
この機能を用いて不必要な機能をスタンバイモードにすることで、無駄な消費電力を抑えることができます。
1.3 低消費電力モード
「1.2 内蔵周辺機能」で挙げたモジュールスタンバイモードも低消費電力モードの1つですが、それを含めてH8/38024の動作モードには以下の9種類存在します。
| 動作モード |
説 明 |
| アクティブ(高速)モード |
CPU がシステムクロックにより、高速動作でプログラムを実行しているモードです |
| アクティブ(中速)モード |
CPU がシステムクロックにより、低速動作でプログラムを実行しているモードです |
| サブアクティブモード |
CPU がサブクロックにより、低速動作でプログラムを実行しているモードです |
| スリープ(高速)モード |
CPU が動作を停止し、内蔵周辺機能がシステムクロックで動作しているモードです |
| スリープ(中速)モード |
CPU が動作を停止し、内蔵周辺機能がOSC クロックの1/128、1/64 、1/32 、1/16 の周波数で動作しているモードです。 |
| サブスリープモード |
CPU が動作を停止し、タイマA、タイマC、タイマG、タイマF、SCI3 、非同期イベントカウンタおよびLCD コントローラ/ドライバがサブクロックで動作しているモードです。 |
| ウォッチモード |
CPU が動作を停止し、タイマA の時計機能、タイマF、タイマG、非同期イベントカウンタおよびLCD コントローラ/ドライバがサブクロックで動作しているモードです。 |
| スタンバイモード |
CPU およびすべての内蔵の周辺機能が動作を停止しているモードです。 |
| モジュールスタンバイモード |
ソフトウェアによって指定された内蔵の周辺機能ごとにスタンバイモードの状態になり、動作を停止しているモードです。 |
|
| 表1-1. H8/38024低消費電力モード |
この中で、アクティブ(高速)モード以外のモードを「低消費電力モード」と呼びます。
プログラムからSLEEP命令を実行する、または、様々な割り込み要因によって、動作モードを遷移させることができます。
低消費電力を重視した組み込みアプリケーション開発では、「1.低消費電力を実現するための知識」で紹介した内容を前提に、消費電力が最低となるような組合せを模索していく形となります。
理論上では可能でも、マイコンだけでなくその周辺回路もある訳ですので、実際に消費電流を測定してみなければ要求仕様を満たしているか分かりません。
ソフテックで過去に行った開発でも、「試作→消費電流測定→改良」を繰り返す形となりました。
設計のポイントを、ソフトウェアの視点からいくつか紹介します。
2.1 内蔵周辺機能
内蔵周辺機能には、「1.2 内蔵周辺機能」で紹介したように様々な種類のものが存在します。
周辺機能は使用すればそれだけ電力を消費してしまいますので、必要な機能のみを動作させ、不必要な機能は全てスタンバイモードに設定することで消費電力を抑えることが可能です。
2.2 低消費電力モードの選択
■スタンバイモード→アクティブモードの組合せ
「1.3 低消費電力モード」で紹介した低消費電力モードの中で、最も消費電力が少なくなるものは、CPU及びすべての周辺機能が停止する「スタンバイモード」になります。
過去に行った開発では、スタンバイ状態においてもシリアル通信を実現するSCI3機能が動作している必要がありましたので、スタンバイモードは初めより選択から外しました。
■スリープモード→アクティブモードの組合せ
低消費電力モード中でもSCI3機能だけは動いている必要があると考えると、「スリープモード」が選択肢に挙がってきます。
スリープ中では、CPUは動作を停止しますが内蔵周辺機能は動作しています。
しかも、「モジュールスタンバイモード」にてSCI3以外の機能すべてを停止させるため、スリープ中にSCI3機能のみを動作させることが可能です。
過去に経験した開発では、シリアル通信を実現するためにサブクロックを使用する必要がありましたので、「サブスリープモード→サブアクティブモード→アクティブ(高速)モード」での復帰方法で検討しました。
しかし、この場合の問題点としては、「サブアクティブモード→アクティブ(高速)モード」へ移行する際、停止していたシステムクロックが復帰するときに要する「クロック安定時間」が必要になるということでした。
ソフトウェア処理時間にも厳しい規定がありましたので、この組合せをもってしても実現出来ないことが分かりました。
■アクティブ(中速)モードで常時動かす
「1.1 動作クロックと消費電流」より動作クロックを落とせば消費電流も抑える事ができます。
このことより、「アクティブ(中速)モード」を利用して非常に遅いクロックで動作させれば、スリープさせなくても仕様を実現できるのではないか?という検討を行いました。
いろいろと検証した結果、システムクロックを16分周した動作速度であれば消費電流的に実現できると言うことが分かりました。
あとは「選択した動作クロックで処理時間が規定を満たせるか?」の問題だけとなりました。
2.3 処理時間
今回の開発では、システムクロック2.45MHzを使用しました。
「2.3 低消費電力モードの選択」の結果から、アクティブ(中速)モードを用いてシステムクロックを16分周したクロックで動作するように設定した場合、動作クロックは約153.1KHzとなります。
命令の実行速度をH8/38024で最も動作の速いMOV命令で計算すると、表2-1のようになります。
| 2.45MHz |
0.816μ秒 |
| 153.1KHz |
13.06μ秒 |
|
| 表 2-1. 動作クロックと命令処理時間 |
※MOV.B #xx:8, Rdの場合(8ビットイミディエイトデータをレジスタに転送)
これは、アクティブ(中速)モードで動作させた場合、アクティブ(高速)モードに比べて16倍処理時間がかかってしまう事を意味します。
このため、いかに無駄なコードを省き処理時間を短くできるかがソフトウェア設計をする上で重要となります。
2.4 アセンブラ言語という選択肢
ソフテックでは組み込みアプリケーションの開発にC言語を選択することが多いのですが、場合によってはアセンブラ言語を選択した方が良い事もあります。
「処理時間を可能な限り抑える」を念頭に置いた場合、どうしても無駄が入り込んでしまうコンパイラ任せの機械語よりは、極論してしまえば自分ですべてをアセンブラ言語で書いた方が処理時間を大幅に節約することができます。
しかし、アセンブラですべてを記述することは非常に労力がいる作業ですので、繰り返し呼ばれる処理など、処理時間短縮に効果の高い部分を厳選して置き換えても効果的です。
また、アセンブラ言語に置き換えない部分でも、コンパイラの癖を研究してシンプルな機械語が吐き出されるようなコードを記述するだけでも大幅に改善することができます。
さらに、アセンブラ言語で記述するメリットには、処理時間を正確に計算できるということもあります。
過去に経験した開発では、シリアル通信制御を行うモジュールのみアセンブラで記述し、その他の処理はC言語で記述しました。
その背景には、通信処理で必要となるタイマを、周辺機能のタイマ機能を用いずに実現可能であったという理由もありました。
そうすることで、処理時間の節約という目的に加え、タイマ機能分の消費電力を抑えることができました。
低消費電力を実現するには、以下の事が重要となります。
・不要な電力を省く
・必要な電力をなるべく少なくする
3.1 不要な電力を省く
「2. ソフトウェア設計のポイント」では、不必要な内蔵周辺機能を停止させることで、不要な電力を省きました。
今回はソフトウェアの視点からのみのレポートとなりましたが、マイコンが搭載されるハードの設計においても不要な電力を省くために様々な工夫をする必要があります。
また、シリアル通信のプロトコルはあらかじめ決まっていることが多いのですが、全く一から仕様を決められるのであれば、より電力を消費しないプロトコル設計を行うことも可能です。
3.2 必要な電力をなるべく少なくする
「2. ソフトウェア設計のポイント」では、低消費電力モードを使用して、
(1) 動作クロックはそのままでスリープさせる事で消費電力を抑える
(2) 動作クロック自体を遅くする事で消費電力を抑える
の2つのアプローチから必要な電力を少なくする手法を模索していきました。
(1)は、要求仕様に制限が無ければ有効な手法であると言えます。
(2)の場合には、動作クロックを遅くすればするほど消費電力は少なくなりますが、それに比例してソフトウェアの命令実行速度は遅くなっていきます。逆に言えば、ソフトウェアの実行速度を短縮できればできるほど、動作クロックを遅くすることができ、消費電力を抑えることが出来ると言えます。