Windows Mobile デベロッパー センター > Windows Mobile 向けアプリケーション開発 フォーラム > Windows CE > 電源スイッチによる電源オフをサスペンド状態にするには
質問する質問する
 

質問電源スイッチによる電源オフをサスペンド状態にするには

  • 2009年10月5日 8:30鏑木肆星 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    お世話になっております、鏑木と申します。
    現在、Windows CE 6.0にてVisual Studio 2005のC++のアプリケーションを開発しております。
    アプリケーションの開発において、お聞きしたいことがあり、こちらで質問させて頂きたいと思い、投稿致しました。

    お聞きしたい内容はタイトルの通りなのですが、こればアプリケーションによるものなのかOSによるものなのか
    いまいちはっきりせず、とりあえずあいまいに質問させて頂きました。
    目的とする動作は、ボードの電源スイッチをOFFにすると、現状ではそのまま電源がオフになる。(立ち上げ時に
    OSの初期化等をする)のですが、これをサスペンド状態へ移行するようにするにはどのようにすればよいでしょうか?
    サスペンド状態にさせたい理由は、OSの立ち上げ時間の短縮の為です。
    この方法がOSのBSPの修正なのか、それともVC++のアプリケーションの何らかの関数で出来るものなのか分かりません。

    ご存じの方がいらっしゃいましたら、ご意見を頂きたいと思っております。
    どうぞよろしくお願い致します。

    尚、開発環境は
    Windows CE 6.0
    Visual Studio 2005
    です。

すべての返信

  • 2009年10月8日 5:25高橋 忍MSFT, モデレータユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    ボードメーカーに確認したほうが良いのではないでしょうか。
    なお、あくまでフォーラムはCE上のアプリケーション開発に関する情報交換の場となっております。
    サポートサイトではありませんので、プラットフォームについてのご質問、業務開発における質問等は
    開発サポート等をご利用ください。
    マイクロソフト エバンジェリスト 高橋 忍
  • 2009年10月8日 8:22鏑木肆星 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    高橋 忍様

    お門違いの質問だったようですね。申し訳ございませんでした。
  • 2009年10月26日 12:23hnakayam ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    はい、サスペンド・リジュームはOS側(BSP)に実装するもので、アプリケーション側でどうこうできる種類のものではありません。

    一般的にサスペンドの実装は

    1. サスペンドの実装が必要なデバイスドライバにD3ステートを実装
    2. カーネル内のOEMPowerOff(の前半)を実装
    3. 必要に応じてパワーマネージャ(PM.DLL)をカスタマイズ

    ということが必要で、以下のいずれか、あるいは複数のサスペンドシナリオをサポートするようにします。

    - 電源OFFキーでサスペンド
    どれかの(たとえば電源スイッチの)デバイスドライバからSetSystemPowerState("SUSPEND")を呼び出す。

    - アプリケーションからサスペンド
    アプリケーションからSetSystemPowerState("SUSPEND")を呼び出す。
    Explorerシェルや独自シェルからSUSPENDを実行する場合はこれ

    - パワーマネージャー(PM.DLL)のアイドルタイマーでサスペンド
    PMのレジストリ設定
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]
       "ACUserIdle" = dword:3c; in seconds
       "ACSystemIdle" = dword:12c; in seconds
       "ACSuspend" = dword:0; in seconds
       "BattUserIdle" = dword:3c; in seconds
       "BattSystemIdle" = dword:b4; in seconds
       "BattSuspend" = dword:12c; in seconds
    でタイムアウト時間を設定し、これらがタイムアウトしたらサスペンド

    また、サスペンドリジュームを行う機器の場合、たいていはバッテリドライバを実装する必要があるかと思いますが、その場合

    - バッテリ残量が一定値を下回ったらサスペンド
    Explorerシェルや独自シェルのバッテリ監視スレッドでSetSystemPowerState("SUSPEND")を行います

    を実装します。


    一方リジューム側の実装は

    4. リジュームを行うイベントを決定する
    5. リジュームイベント発生時にCPU割り込みが発生するようにハードウエアを調整(設計)
    6. カーネル内にリジューム処理をOEMPowerOff(の後半)に実装
    7. もちろん、1.でサスペンド処理を実装したドライバにもD0ステートでリジュームを実装

    のようになります。

    たとえば

    - 電源ONキーでリジューム

    - モデムの着信でリジューム

    - キーボード入力、タッチパネル入力でリジューム

    - リアルタイムクロックで指定時刻になったらリジューム

    などのイベントを割り込みで受け取れる(あるいはCPUによっては特定GPIOにアサインする)ハードウエアがある場合にこのようなドライバ実装が可能になります。


    このように実装されたBSPを使ってOSをビルドすると、それはサスペンド・リジューム対応のOSだということになります。


    hnakayam