質問する質問する
 

質問CEの時間処理について

  • 2009年7月27日 7:41鏑木肆星 ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    お世話になります鏑木です。
    とても抽象的な内容の質問になるのですが、Windows CEはリアルタイムOSといわれますが、
    それは通常のWindowsよりタイムイベント処理の時間精度が良いためなのでしょうか?
    現在、Windows CEのVisual C++でアプリケーションを作成しており、500msec毎に相手に
    コマンドを送信させたいと思っているのですが、正確に500msec毎にイベント関数を呼び出すこと
    ができず困っています。
    CE専用により精度の高い時間処理のAPIが存在したりするものなのでしょうか?
    リアルタイムOSというもののイメージがいまいちなため、かなり的外れな質問となっているかと
    思いますが、貴重なご意見を頂けたらなと思っています。
    ご回答をお待ちしております。

    開発環境は
    Windows CE 6.0です。

すべての返信

  • 2009年7月27日 12:59渋木宏明MVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    >Windows CEはリアルタイムOSといわれますが、

    言われてます? 出典はありますか?

    通常版の Windows OS よりはリアルタイム性は高いものの、明確に「リアルタイム OS である」とはされていなかったような…

    また、そのリアルタイム性もカーネル/ドライバレベルの話で、GUI 層も含めたらリアルタイム性なんかおよそ期待できないように思います。

     

  • 2009年7月28日 9:42ホーミンMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    すでに渋木さんが指摘されているようにWindowsCEがリアルタイムOSといえるのかという問題もありますが、
    それはひとまず置いておくとして、、、

    まず提示された情報が少なすぎて回答がつけにくいです。一言で「リアルタイムに」といっても要件次第で
    その精度は変わってきます。
    とりあえず以下の点ぐらいは明確にすべきと思います
    ・「500msec毎にイベント関数を呼び出す」ために使っている(または使おうとしている)API・方法
    ・「正確に500msec毎」の精度(何msec以下なら許容されるのか)
    ・現状ではどの程度の精度なら実現できているのか
    ・「相手にコマンドを送信」の処理概要(送信方法、処理時間や負荷の程度など)

    また使用しているCE端末が十分な精度のハードウェアタイマーを持っていないとソフトでは手も足も
    出ませんが、このあたりは問題ないのでしょうか?
  • 2009年7月30日 10:33hnakayam ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    Windows Embedded CE 6.0であれば1msec毎に割り込むことのできるタイマーハードウエアが使用されていることと思います。
    通常、どれかのスレッドが実行中にも、より優先度の高いスレッドが実行可能状態になって、しかもそのあとに(1msecタイマー割り込みをきっかけに)
    スレッドのリスケジューリングが発生すれば、その優先度の高いスレッドが実行開始されます。

    この時点で、スレッドが実行開始するタイミングには最大1msecのブレがあることがわかります。
    イベントの開始タイミングの精度にはこだわらず、イベント間隔が500msecであればよいのであれば、1msec以下(たとえば100マイクロsec)に近い間隔精度で
    イベントを連続して発生させることができるかもしれません。

    以上の議論は、システム組み込みのタイマー割り込みで何ができるか、という話ですが、これ以上を求めるのであれば外部のハードウエア信号割り込みを用意することになると思います。割り込みパルス入力から割り込み処理が開始されるまでどれくらい遅れが発生するかはILTIMINGというテストプログラムで計ることができますが
    100マイクロsec以下、良くて10マイクロsecあたりで多少変動するのではないかと思います。

    そういう話ではなくて、たとえば希望する割り込み精度より20msecも悪いとかいう話であれば、何かプログラムの作り方を間違えています。
    リアルタイムスレッドはCeSetThreadPriority()でスレッド優先度を変更する必要がありますのでお忘れなく。


    hnakayam