Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume I/11-5

← 4 節に戻る ↑11 章トップへ 6 節に進む →


11-5 ハードウェアとのやりとり

 
Palm OS は本当の意味では決して電源オフにはならないという点で従来のデスクトップシステムとは異なっています。電力は常に主要サブシステムに供給されており、オン/オフボタンはハンドヘルドの低電力モードの状態を切り替えるためのものに過ぎません。オン/オフボタンの押下による明らかな効果は LCD のオン/オフです。電源ボタンを押してハンドヘルドをオフにすると、LCD が消灯するためにデバイス全体の電源がオフになったように見えます。実際には、少量の電力しか消費しませんが、メモリシステムやリアルタイムクロック、割込み生成回路などは動き続けています。

このセクションでは Palm OS の電源管理について、以下のトピックを説明します。

  • Palm OS の電源モード
  • アプリケーション開発者のためのガイドライン
  • 電源管理の関数

 

Palm OS の電源モード

電力消費を最小限に抑えるために、オペレーティングシステムは3つの異なる操作モード ―― スリープ(sleep)モード、休止(doze)モード、動作(running)モード ―― を動的に切り替えます。システムマネージャはこれらの電源モードの切換えを制御し、電源管理の一部をコントロールするための API を提供します。

  • スリープモードでは、ハンドヘルドは電源オフになっているように見えます。ディスプレイは消灯、ディジタイザは非活性状態になり、メインクロックは停止します。アクティブな回路はリアルタイムクロックと割込み生成回路だけになります。ハンドヘルドがこのモードに入るのは数分間ユーザー操作がなかった場合、あるいはオフボタンが押された場合です。ハンドヘルドがスリープモードから復帰するのは、例えばユーザーがボタンを押した場合など、割込みが発生した場合だけです。スリープモードに入る場合、システムはできるだけ多くの周辺機器を省電力モードにし、ハードボタンやリアルタイムクロックによる割込みでシステムがウェイクアップできるようにセットアップをします。システムがスリープ中にこれらの割込みを受けると、システムは完全なウェイクアップが可能なバッテリ残量かどうかを素早くチェックし、その後 LCD、シリアルポート、タイマーといった周辺機器の省電力モードを解除します。
  • 休止モードではメインクロックは動的しており、ハンドヘルドは電源が入っているように見えます。LCD もオンになっています。プロセッサのクロックは動作していますが、命令は実行していません(つまり、停止しています)。プロセッサが割込みを受けると、停止状態が解除されて割込みの処理を開始します。ハンドヘルドは電源が入っていて処理すべきユーザー入力がない状態では常にこのモードに入ります。周辺装置をウェイクアップする必要がないため、休止モードはスリープモードからよりも速く復帰できます。実際、休止モードから割込み処理の開始にはほとんど時間がかかりません。通常、システムがオンになっている状態はほとんどが休止モードで、ペンタップやボタン押下といったユーザー入力に対する応答や割込みを処理するために短時間動作モードに入るだけになります。
  • 動作モードでは、プロセッサは実際に命令を実行しています。ハンドヘルドは休止モード中に(スクリーンタップなどの)ユーザー入力を検出した場合、あるいは休止・スリープモード中に割込みを検出した場合に動作モードに入ります。ハンドヘルドはユーザー入力を処理するのにかかる時間(たいていは1秒以下)だけ動作モードに入り、処理が完了するとただちに休止モードに戻ります。典型的なアプリケーションでは、システムは全体の5%程度しか動作モードに入りません。

バッテリの持続時間を最大にするために、Palm ハンドヘルドのプロセッサは可能な限り動作モードに入りません。そのため、ハンドヘルドで生成される割込みはプロセッサを“ウェイクアップ”させることができなければなりません。プロセッサはシリアルポート、ハードボタン、クレードルのボタン、プログラマブルタイマー、メモリモジュールスロット、リアルタイムクロック、低電力検出器、ページャやモデムなどのその他内蔵周辺機器からの割込みを受け取ることができます。

 

アプリケーション開発者のためのガイドライン

通常、アプリケーションはいくつかのシンプルなガイドラインを除いて電源管理を気にする必要はありません。アプリケーションが EvtGetEvent をコールして次に処理すべきイベントをシステムに問い合わせる時、システムは処理すべきイベントが発生するまで自動的に休止モードに入ります。アプリケーションが EvtGetEvent を使用している限り、電源管理は自動的に行なわれます。ユーザー操作がないままオートオフのプリファレンスで設定されている時間が過ぎると、システムはアプリケーションが介在することなく自動的にスリープモードに入ります。

アプリケーションは独自の遅延ループを避けるべきです。そのかわり、SysTaskDelay を使用します。これは待ち時間の間システムを休止モードにすることでできるだけ電力を節約するものです。アプリケーションが周期的な処理を必要とする場合、EvtGetEvent にタイムアウト時間を与えることもできます。これはタイムアウトが発生した時点で処理すべきイベントがなくても強制的に休止モードからウェイクアップしてアプリケーションに復帰させます。このメカニズムを使用することでバッテリの持続時間を最大限にすることができます。

 

電源管理の関数

システムコールである SysSleep は、システムをただちにスリープモードに移行します。通常、システムはオートオフに設定された時間だけユーザー操作がなかった場合や、ユーザーが電源ボタンを押下した場合にスリープモードに移行します。

SysSetAutoOffTime 関数は、オートオフの設定値を変更します。この関数は通常、ブート時にシステムによって、あるいはプリファレンスアプリケーションによってのみ使用されます。プリファレンスアプリケーションはオートオフ時間に関するユーザープリファレンスをプリファレンスデータベースに保存し、システムはブート時にプリファレンスデータベースに保存されている値でオートオフ時間を設定します。オートオフ機能はタイムアウト時間に 0 を指定して SysSetAutoOffTime をコールすることで無効にできますが、これはバッテリを使い果たすことになります。

現在のバッテリレベルやその他の情報は、SysBatteryInfo 関数を通して取得することができます。この関数はバッテリに関する情報を返します。これには現在のバッテリ電圧(小数点第2位まで)、低電力警告の閾値、バッテリタイプ、外部電源に接続されているかどうか、などが含まれます。この関数はバッテリ警告の閾値やバッテリタイプを変更することもできます。

 


← 4 節に戻る ↑11 章トップへ 6 節に進む →