復刻:キーワードガイダンス第3回「電源制御」2014年03月05日 21時20分32秒

初出:技術評論社「組込みプレスVol.5」(平成18(2006)年11月3日発売)

家電製品、音響機器、ビデオ機器、携帯電話などの組込み機器は機械に強い人、弱い人など何の意識もせずに電源をON にしたりOFF にしたりする操作が行えるようになっています。

通常のアプリケーションの開発とは大きく異なる、組込み開発の特徴の一つにこの電源制御を挙げることが出来ます。

(1)機器の全体制御としての電源制御

テレビの電源を切るのにシャットダウン操作を意識する人はいません。 また、電源を入れっぱなしのまま、コンセントを抜いたりすることもあります。 携帯端末などのバッテリで動作する機器では電源ボタンの長押しなどの操作により起動したり、終了したりします。

現在の組込み機器での電源スイッチはメカニカルにロックしてON/OFF の状態が確定するようなスイッチはほとんど使用されていません。押している間スイッチがONになるようなプッシュスイッチが使用されています。そのようなスイッチで電源がONなのかOFF なのかはソフトウェアの状態管理により行われます。電源がOFF の時に電源スイッチが押されたら電源をON にする。電源がON の時に電源スイッチが押された ら電源をOFF にする。簡単にはそのような状態管理です。

このような機器では電源OFF の状態でもCPU は実は動作しています。 動作しているからといって、電流を大量に流せばすぐにバッテリが上がって動作することが出来なくなります。このようなことを避けるためにCPU は休止状態という動作状態にしてCPUへの電流供給が少なくて済むようにし、周辺機器の電源もOFF にします。

バッテリで動作する機器の場合はバッテリがなくなるような状況では極力バッテリを温存するために省電力動作を行い、いよいよバッテリの残量が低下して不意にアプリケーション動作中に電源が切れてしまったとしてもバッテリを充電して次に電源をONにすると正常に動作することが要求されます。

このような電源制御は多くの場合は機器毎に最適に設計をし直す必要があります。また、単純に起動や終了時の設計だけではなく、アプリケーション動作中にいつでも電源 OFF 操作を行うことが出来るための全体に波及するような設計が必要です。

組込み機器に組込みLinux などを取り入れる場合が多くなりましたがUNIX 系の OS はシャットダウン操作が必要なことで有名なOS です。 多くの場合は電源OFF 操作をしても起動したままシャットダウンなどせずに表示だけをOFF するなどの対応がされています。

μITRON なども電源制御に対する標準システムが存在するわけではありませんが、シャットダウンなどは必要ではないため、プロセッサそのものを休止状態にして電源 ON 操作で「起こす」などの処理は割り込み処理とタスクの連携により行われます。

(2)機器に搭載された周辺機器の制御のための電源制御

機器内部に搭載されたドライバIC などのチップの電源、通信I/F によって接続された外部機器の電源などの制御も重要な電源制御機能の一部です。技術的には専用のハードウェアで制御することも可能ですが、修正が容易、コストが安いなどの理由からソフトウェアで制御することは一般的になっています。

CPU の汎用のポートと外部機器とを接続してCPU からそのポートに対応したビット単位のON/OFF を行うことにより周辺機器の制御を行います。 これらの制御は個々のチップメーカ、機器のデータシートに記述されたタイミングチャートに従って、制御を行う必要があります。

オーディオ系の機器の場合はこの電源制御と同時に音声ノイズがイヤホンやスピーカから出力されないようなMUTE制御も必要になってきます。 映像系の機器の場合はオーディオ系に加えて映像的なノイズの対策も必要です。 周辺機器には起動して動作可能になるまでのタイムラグなどがあり、メインのCPU はそれを意識してアプリケーションとのI/F を調整する必要があります。 一つのチップなどの制御対象に対して複数のポートのON/OFFをタイマと連携させた複数のタイミングで制御を行います。

タイマ処理の実装には以下の方法があります。

  • タイマの時間分解能に応じてCPU をループで浪費させる
  • タイマ割り込みにより基準時間を数えて制御
  • タイマ制御対象が複数に及ぶ場合は一つの基準時間を数えて間接的に制御対象毎に利用する

電源制御を行うためにはタイマ処理は必須の機能となります。

復刻:キーワードガイダンス第4回「RTOS はアクセラレータではない」2014年03月16日 12時43分18秒

初出:技術評論社「組込みプレスVol.6」(平成19(2007)年2月3日発売)

■RTOS とは何か

RTOS(Real Time OS)の特徴を考えてみましょう。
検索エンジンで調べて見ると一般的に言われている内容を取得する事が出来ますが、CPUの性能や設計の事などは何も触れられていないと思います。
また、RTOS を使った方が使わないよりもリアルタイム性能が高いような説明がされていることがあります。
基本的にCPU の条件やI/O の条件が変わらないのであれば以下の順番でリアルタイム性能は高くなります。

(1) OS を使わない、適切に設計されたシステム
(2) RTOS を使った、適切に設計されたシステム
(3) OS を使わない、不適切に設計されたシステム
(4) RTOS を使った、不適切に設計されたシステム

残念ながら、RTOS を使ったシステムは(4)のパターンの比率が高いと感じています。

RTOS の特徴を設計視点で再定義すると、以下になります。

(a) タスクと優先度概念を有する
(b) 指定した時間間隔で周期的に処理を実行する機能を含めた時間監視機能を備える
(c) 割り込み処理とアプリケーションタスク間のデータ授受を適切に行う機能を備える
(d) CPU を効率的に使用するための機構を備える
(e) 小規模なRTOS はフレームワークであるので性能はシステム設計に依存する

■RTOS 利用は適切なリアルタイム制御システム実装のための手段

RTOS はアクセラレータではありませんからCPU の性能以上の能力は発揮出来ません。
不適切な設計でもそこそこ性能を高くする、というようなことも出来ません。

例えば、1ms 周期で何らかの処理を実行するとしましょう。
その処理に2ms 必要だとしたら1 回目の処理の途中で2回目の処理開始のイベントが発生しますのでそのイベントを無視するかイベントをどんどん溜め込むことになります。いずれにしても1ms 周期で処理を行うことは出来ず、RTOS の利用テクニックを駆使しても性能要件を解決できません。
この時、2ms 費やしているタスクが無駄なCPU の使い方をしているのだとしたら、そのタスクの設計やアルゴリズムを見直して問題を回避できるかもしれません。
しかし、アルゴリズムやCPU の性能を引き出す実装に問題がなく、処理時間の短縮が望めない場合は以下のように設計変更するしかないでしょう。

(A) CPU のクロックを上げる
(B) CPU を性能の高いものに変える
(C) 演算処理だけを行なう専用プロセッサを別に設ける
(D) 1ms 周期を2ms 以上の周期に延ばしても全体として矛盾がないようにする
(E) 時間がかかる演算処理と1ms 間隔で実行させる必要のあるタスクとは別のタスクとして動作させて、そのような構成でもシステムとして矛盾しないようにする

具体的には演算処理部分が何らかのストリームに対して信号処理するようなもの、例えば音声などのコーデック処理の場合は(A),(B),(C)などのハードウェアに波及する設計変更が必要です。

工業用制御目的の何らかのセンサーデータ取得用のA/D コンバータのデータを周期的に取得して演算して制御するために使うような場合は用途によっては(D),(E)などの抜け道はあるでしょう。

いずれも、RTOS を使うとか使わないという問題ではありませんが、後者はRTOS を使えば実装上の問題解決には寄与することができます。
一般的にRTOS などの標準部品を使った方がソフトウェアの可搬性と開発効率は高くなります。可搬性や開発効率は以下の順位になります。

(1) RTOS を使った、適切に設計されたシステム
(2) OS を使わない、適切に設計されたシステム
(3) OS を使わない、不適切に設計されたシステム
(4) RTOS を使った、不適切に設計されたシステム

リアルタイム制御システムの設計はRTOS 利用有無にかかわらず以下に留意する必要があります。

・制御対象イベントと必要な反応時間の洗い出し
・I/O コントローラ処理中は他の仕事をCPU に割り当てる
・データフローとタイミングチャートの吟味
・イベントを明確にしたタスク関連性の吟味
・機能分割は並列処理と負荷分散を重視
・排他制御は極力行わない
・I/O 目的の局所ループは排除
・緊急性の低い処理は途中で他の処理が割り込んでも矛盾がないような設計を行う
・CPU やメモリの節約の努力

復刻:キーワードガイダンス第5回「メインループ」2014年03月22日 16時27分09秒

初出:技術評論社「組込みプレスVol.7」(平成19(2007)年5月7日発売)

●メインループとは

OS のない組込みシステムでは,CPU がリセットされてプログラム実行開始用の
先頭アドレスから動き始めると必ずどこかで永久にループしていなければなりません.
もし,ループするための分岐条件が命令コードにないのであれば,その CPU 上のアドレス空間のデータを順番に命令コードとして実行し,まっすぐに最終アドレスまで実行してしまいます.
ですが,アドレスを表現するレジスタのサイズによっては,最後のアドレスまで実行したら次のアドレスは最初のアドレスを指すことになり,先頭に処理が戻ります.
このような場合も結局はループするということです.
もしくは,そのようなアドレスをアクセスすることが不正な状況ということで,割り込み処理に分岐して,また,元に戻る,ということを繰り返すかもしれません.
これも大きな意味でループを構成しています.

一般的にはこのような不正な状況を検出してのループを構成するのではなく,意図的に大きなループを構築します.

このように,CPU を動作させている意図的な大きなループのことを
「メインループ」と呼びます.

もし,ループを構成しないで,ある時点の処理でCPU が眠ってしまう,という命令があった場合,かつ,復帰するための割り込み処理も存在しないのだとすると,そのシステムは停止してしまいます.
パソコンの利用環境では俗に「ハングアップ」という状態です.
組込みシステムではこのようなハングアップする状態は絶対に避けなければなりません.

一方,パソコンのOS(Operating System)上で実行される一つのアプリケーションプログラムが永久にループするような処理を構成している場合は,OS の実装の仕方によっては全体のパフォーマンスに影響を与えるためにループすることを避けなければなりません.
つまり,「ハングアップ」の状況には以下の二通りのパターンがあります.

(1) アプリケーションで局所的に永久ループを構成して,メインループに戻ってこない.
(2) メインループの途中でCPU 自体が停止して復帰する条件が発生しない.

したがって,システム全体としてはメインループでループしている必要がありますが,個々のアプリケーションプログラムでループしてしまうのは不具合ということになります.

特定の目的がはっきりした組込みシステムの場合は,このようにメインループ以外のアプリケーションで処理を抜けてこない永久ループが存在すると,CPU が他のアプリケーションを実行できなくなり,システムの深刻な欠陥になります.

●アプリケーションタスク

大きなメインループの中である目的をもって処理を実行するプログラムをアプリケーションタスクと呼びます.
OS 上で動作しているときだけ,タスクという呼び方をするわけではありません.
それは単に機能ごとに分割したサブルーチンかもしれませんが,周期的に,または,何らかのイベントを検出して処理を行うプログラムは全てアプリケーションタスクと呼んでも構いません.

●不正なループの回避

アプリケーションタスクの局所ループを回避する方法は二つしかありません.

(a) アプリケーションタスクで永久ループをバグと捉えて,ループしないプログラムを作る.
(b) アプリケーションが不正な状態でもメインループに戻れるような仕組みを作りこむ.

(a)の手段は単なるアプリケーション単位の実装依存の対応手段ということに対して,(b)の手段はいわゆる,OS の実装,ということになります.

●イベントループ

GUI プログラミングなどでのアプリケーション単位にループしているイベントループ処理はここで言うところのメインループではありません.
イベントループは必ずループ中にイベントを検出するための検出関数または
システムコールが存在します.

これらのイベント検出システムコールなどの処理にはアプリケーションの局所ループから抜けてOS の処理に戻る仕組みが実装されています.
したがって,それらの関数を呼び出した時点でOS が作りだしたメインループに
処理が遷移します.コーディング上はアプリケーション内で局所的にループしているように見えても実は局所的にはループしていないことになります.
他のアプリケーションに対するイベント検出なども行うような大きなメインループが背後では動作していることになります.

これがOS の実装による効果です.

●割り込み処理はループ禁止

割り込み処理は局所的なループから別の処理に遷移するための唯一の手段
です.もし,その割り込み処理内で不正なループが構成されると二度と
システムは復帰できなくなってしまいます.