(57)【要約】【課題】  ＲＴＯＳシミュレータ上の時間管理を、汎用ＯＳの負荷の影響を受けずに正確に実現し、かつ、ＲＴＯＳがアイドル状態になった際には汎用ＯＳに無駄な負荷をかけないようにする。【解決手段】  まずは起動時にＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるプロセス相対時間タイマ機能を起動する。このシグナルでチックを実現する。次に、ユーザタスクがみずから待ち状態に遷移するシステムコール発行の際に、通常のユーザタスクからアイドルタスクへのタスクスイッチが起こるかどうかを判定し、もしそうなら、実時間に基づいて一定時間ごとにシグナルを発生させる実時間タイマ機能に切り替える。また、割込みをシミュレートするシグナルの発生時には、各割込みハンドラ処理終了後、アイドルタスクから通常のユーザタスクへのタスクスイッチが起こるかどうかを判定し、もしそうなら再びプロセス相対時間タイマ機能に切り替える。【選択図】  図１
2006163983.tif 000002
【特許請求の範囲】
【請求項１】
リアルタイムＯＳ（ＲＴＯＳ）をワークステーション（ＷＳ）やＰＣなどの汎用開発マシン上でＵＮＩＸ（登録商標）やＷｉｎｄｏｗｓ（登録商標）などの汎用ＯＳを利用して実現するＲＴＯＳシミュレーション方式であって、
汎用ＯＳの実時間に基づいて指定時間間隔で定期的にシグナルを発生するタイマ機能（実時間タイマ機能）とプロセスに対するＣＰＵ割り当て時間に基づいて指定時間間隔で定期的にシグナルを発生するタイマ機能（プロセス相対時間タイマ機能）とを効率良く使い分けて利用してＲＴＯＳの時間管理を実現するために、
ＲＴＯＳ起動時に、前記プロセス相対時間タイマ機能を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する起動時タイマ設定工程と、
ユーザタスクがみずから何らかのイベント発生を待つＷＡＩＴＩＮＧ状態やＳＵＳＰＥＮＤＥＤ状態への遷移を伴うシステムコールを発行した際に、発生するタスクスイッチが通常のユーザタスクからアイドル状態を意味する特殊なタスク（アイドルタスク）へのタスクスイッチであるかどうかを判定するタイマ切り替え実行判定工程と、
前記タイマ切り替え実行判定工程で、通常のユーザタスクからアイドルタスクへのタスクスイッチであると判断された場合に、起動されているタイマ機能を停止し、前記実時間タイマ機能を用いて実時間に基づいて一定時間ごとにシグナルを発生させるように設定するタイマ切り替え工程と、
シグナル発生時に、各割り込みハンドラ処理終了後、タスクスイッチが必要でかつそれがアイドルタスクから通常のユーザタスクへのタスクスイッチであるかどうかを判断する第２のタイマ切り替え実行判定工程と、
前記第２のタイマ切り替え実行判定工程で、タスクスイッチが必要でかつそれがアイドルタスクから通常のユーザタスクへのタスクスイッチであると判断された場合に、起動されているタイマ機能を停止し、前記プロセス相対時間タイマ機能を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する第２のタイマ切り替え工程とを有することを特徴とするＲＴＯＳシミュレーション方式。
【請求項２】
リアルタイムＯＳ（ＲＴＯＳ）をワークステーション（ＷＳ）やＰＣなどの汎用開発マシン上でＵＮＩＸ（登録商標）やＷｉｎｄｏｗｓ（登録商標）などの汎用ＯＳを利用して実現するＲＴＯＳシミュレータであって、
汎用ＯＳの実時間に基づいて指定時間間隔で定期的にシグナルを発生するタイマ機能（実時間タイマ機能）とプロセスに対するＣＰＵ割り当て時間に基づいて指定時間間隔で定期的にシグナルを発生するタイマ機能（プロセス相対時間タイマ機能）とを効率良く使い分けて利用してＲＴＯＳの時間管理を実現するために、
ＲＴＯＳ起動時に、前記プロセス相対時間タイマ機能を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する起動時タイマ設定手段と、
ユーザタスクがみずから何らかのイベント発生を待つＷＡＩＴＩＮＧ状態やＳＵＳＰＥＮＤＥＤ状態への遷移を伴うシステムコールを発行した際に、発生するタスクスイッチが通常のユーザタスクからアイドル状態を意味する特殊なタスク（アイドルタスク）へのタスクスイッチであるかどうかを判定するタイマ切り替え実行判定手段と、
前記タイマ切り替え実行判定手段で、通常のユーザタスクからアイドルタスクへのタスクスイッチであると判断された場合に、起動されているタイマ機能を停止し、前記実時間タイマ機能を用いて実時間に基づいて一定時間ごとにシグナルを発生させるように設定するタイマ切り替え手段と、
シグナル発生時に、各割り込みハンドラ処理終了後、タスクスイッチが必要でかつそれがアイドルタスクから通常のユーザタスクへのタスクスイッチであるかどうかを判断する第２のタイマ切り替え実行判定手段と、
前記第２のタイマ切り替え実行判定手段で、タスクスイッチが必要でかつそれがアイドルタスクから通常のユーザタスクへのタスクスイッチであると判断された場合に、起動されているタイマ機能を停止し、前記プロセス相対時間タイマ機能を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する第２のタイマ切り替え手段とを有することを特徴とするＲＴＯＳシミュレータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、リアルタイムＯＳのシミュレーション方式に関する。
【背景技術】
【０００２】
一般に、リアルタイムＯＳ（ＲＴＯＳ）を用いた組み込み機器を開発するための開発環境として、ＲＴＯＳとファームウェアをワークステーション（ＷＳ）やＰＣなどの汎用開発マシン上で模擬実行するためのシミュレーション開発環境が存在している。
【０００３】
ＷＳやＰＣ上では、一般にＵＮＩＸ（登録商標）やＷｉｎｄｏｗｓ（登録商標）などの汎用ＯＳが動作しているため、上記のようなシミュレーション開発環境はこれら汎用ＯＳの機能を利用して実現されている。
【０００４】
また、こうしたシミュレーション開発環境としては、（１）ターゲットＣＰＵのインストラクションセットシミュレータ（ＩＳＳ）を用いて、ＲＴＯＳやファームウェアすべてをターゲット用クロスコンパイラで生成して実行する方式、（２）ターゲット用ＲＴＯＳのＣＰＵ依存部分を改変して、汎用ＯＳが提供するマルチスレッド機構等を用いることでＲＴＯＳ機能をシミュレートする方式、などが存在している。
【０００５】
方式（２）の場合は、ファームウェアやＲＴＯＳは汎用ＯＳ上で普通に動作するプログラムとしてセルフコンパイルされ、汎用開発マシン上でそのままのネイティブコードで実行されることになる。このようにＲＴＯＳ機能レベルでシミュレーションする方式をＲＴＯＳシミュレーション方式、そしてその実態をＲＴＯＳシミュレータと呼ぶことにする。
【０００６】
また、ＲＴＯＳは一般的にハードウェアタイマ機能を利用してある一定間隔（1msecなど）で割込み（チックと呼ばれる）を発生させ、割込みハンドラでソフトウェアカウンタをカウントアップすることで時間計測を行なっている。これをＲＴＯＳシミュレータでシミュレーションする場合、汎用ＯＳ例えばＵＮＩＸ（登録商標）の場合はタイマ機能をつかってＲＴＯＳシミュレータの実体となるプロセスに定期的にシグナルを発生させ、シグナルハンドラで上記と同様にソフトウェアカウンタをカウントアップすることで実現できる。
【０００７】
より具体的には、例えばＵＮＩＸ（登録商標）にはsetitimer()というシステムコールがあり、これにより、
（Ａ）実時間（実世界の時間）に基づいて指定時間間隔で定期的にシグナルを発生する機能
（Ｂ）プロセスにＣＰＵが割り当てられている時間に基づいて定期的にシグナルを発生する機能
これらの２種類のどちらかを利用して上記のチック機能を実現できる（例えば、特許文献１参照）。
【特許文献１】特開平３−７０１５８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記（Ａ）、（Ｂ）どちらを使って実現してもそれぞれに問題が発生する。
【０００９】
（Ａ）を利用した場合は、ＲＴＯＳシミュレータプロセスが常にＣＰＵを使って実行しているわけではないので、ＲＴＯＳ上での時間経過とＲＴＯＳ上のタスクの実行時間との間で矛盾が生じてしまう。例えば、実機であれば１msecの間に１００の仕事を実行できるはずのタスクが、シミュレータの場合汎用ＯＳの負荷の度合いによってはまったく実行できないといった状況も起こりうる。もちろん、実機とシミュレータでは動作ＣＰＵのパフォーマンスの違いからタスク実行効率が異なっているのは当然ではあるが、まったく実行されない、という状況は問題となる可能性が高い。
【００１０】
（Ｂ）を利用した場合には上記の矛盾は無くなるものの、今度はＲＴＯＳにとってのアイドル状態の際、ＲＴＯＳシミュレータプロセスがＣＰＵを放棄することができない、という問題が生じる。本来、ＲＴＯＳがアイドル状態になった場合には、汎用ＯＳに無駄な負荷をかけないようにするためpause()などのシステムコールを利用して自らＣＰＵを放棄するべきである。なぜこれができなくなるかというと、アイドル状態になった場合にＲＴＯＳシミュレータプロセスがＣＰＵを放棄してしまうと、ＲＴＯＳシミュレータプロセスにとっての時間が経過しなくなってしまうためである。もちろん、アイドル状態の際にpause()を呼ぶのではなく、while(TRUE);のように無限ループにすれば時間は経過するようになるものの、汎用開発マシン全体で考えると、無駄にＣＰＵパワーを消費していることになってしまう。
【００１１】
本発明は上記の問題点に鑑みてなされたものであり、その目的は、ＲＴＯＳ上の時間管理を、汎用ＯＳの負荷の影響を受けずにできるだけ正確に実現し、かつ、ＲＴＯＳがアイドル状態になった際には汎用ＯＳに無駄な負荷をかけないようにできるＲＴＯＳシミュレーション方式を提供することにある。
【課題を解決するための手段】
【００１２】
この課題を解決するために、本発明に係わるＲＴＯＳシミュレーション方式では、汎用ＯＳの実時間に基づいて指定時間間隔で定期的にシグナルを発生するタイマ機能（実時間タイマ機能）とプロセスに対するＣＰＵ割り当て時間に基づいて指定時間間隔で定期的にシグナルを発生するタイマ機能（プロセス相対時間タイマ機能）とを効率良く使い分けて利用してＲＴＯＳの時間管理を実現する。
【００１３】
そのために、ＲＴＯＳ起動時に、前記プロセス相対時間タイマ機能を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する起動時タイマ設定手段と、
ユーザタスクがみずから何らかのイベント発生を待つＷＡＩＴＩＮＧ状態やＳＵＳＰＥＮＤＥＤ状態への遷移を伴うシステムコールを発行した際に、発生するタスクスイッチが通常のユーザタスクからアイドル状態を意味する特殊なタスク（アイドルタスク）へのタスクスイッチであるかどうかを判定するタイマ切り替え実行判定手段と、
前記タイマ切り替え実行判定手段で、通常のユーザタスクからアイドルタスクへのタスクスイッチであると判断された場合に、起動されているタイマ機能を停止し、前記実時間タイマ機能を用いて実時間に基づいて一定時間ごとにシグナルを発生させるように設定するタイマ切り替え手段と、
シグナル発生時に、各割り込みハンドラ処理終了後、タスクスイッチが必要でかつそれがアイドルタスクから通常のユーザタスクへのタスクスイッチであるかどうかを判断する第２のタイマ切り替え実行判定手段と、
前記第２のタイマ切り替え実行判定手段で、タスクスイッチが必要でかつそれがアイドルタスクから通常のユーザタスクへのタスクスイッチであると判断された場合に、起動されているタイマ機能を停止し、前記プロセス相対時間タイマ機能を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する第２のタイマ切り替え手段とを有することを特徴とする。
【発明の効果】
【００１４】
本発明によれば、
ＲＴＯＳシミュレータにおいて、通常のユーザタスク実行状態の際には、ＣＰＵ割り当て時間に基づいて時間管理を実行するようになり、アイドル状態になっている間だけ、実時間に基づいて時間管理を実行するように自動的に切り替わるようになるため、ＲＴＯＳ上の時間管理を、汎用ＯＳの負荷の影響を受けずにできるだけ正確に実現し、かつ、ＲＴＯＳがアイドル状態になった際には汎用ＯＳに無駄な負荷をかけないようにできるＲＴＯＳシミュレーション方式を実現できるという効果がある。
【発明を実施するための最良の形態】
【００１５】
＜実施形態１＞
以下、添付図面にしたがって本発明に係る実施例を詳細に説明する。本実施例では汎用ＯＳとしてＵＮＩＸ（登録商標）を例とする。前述のようにＵＮＩＸ（登録商標）には指定時間間隔ごとにシグナルを発生するシステムコールとしてsetitimer()があり、これを使うことで以下の２種類の機能が利用できる。
【００１６】
（Ａ）実時間に基づいて指定時間間隔で定期的にシグナルを発生する機能
（Ｂ）プロセスにＣＰＵが割り当てられている時間に基づいて定期的にシグナルを発生する機能
それぞれをタイマ機能（Ａ）、タイマ機能（Ｂ）と呼ぶことにする。
【００１７】
次に、ＲＴＯＳにおけるアイドル状態の実現形態について説明する。ＲＴＯＳはユーザタスクがすべてＲＥＡＤＹ状態（実行可能状態）でなくなるとアイドル状態と呼ばれる何も処理を実行しない状態となる。
【００１８】
アイドル状態を実現するもっとも簡易な方法は、アイドルタスクと呼ばれるＲＴＯＳ内の特殊なタスクを用意する方法である。このタスクを通常は設定できないもっとも優先順位の低い設定で常にＲＥＡＤＹ状態にしておく。こうすることで、すべてのユーザタスクがＲＥＡＤＹ状態でなくなった場合には必ずこのアイドルタスクがディスパッチされアイドル状態となることができる。つまり、アイドル状態とはアイドルタスクが実行している状態を意味する。
【００１９】
実機の場合はアイドル状態では割り込みは常時受け付け可能である。ＲＴＯＳシミュレータの場合は割り込みをシグナルでシミュレーションし、アイドル状態ではシグナルを常時受け付け可能なようにしておく。実機では、割り込みが発生すると割り込みハンドラが起動され、もしそこであるユーザタスクがＲＥＡＤＹ状態に復帰すると、割り込みハンドラ終了時にアイドルタスクからユーザタスクへのタスクスイッチが起こり、ユーザタスクがディスパッチされアイドル状態から抜けることになる。ＲＴＯＳシミュレータの場合もまったく同様で割り込みがシグナルに、割り込みハンドラがシグナルハンドラに置き換わるだけである。
【００２０】
アイドル状態になると、実機の場合は電力消費を押さえるためＣＰＵを省電力状態でスリープする命令を実行して割り込みを待ったり、または単に無限ループ処理を実行したりする。ＲＴＯＳシミュレータの場合は汎用ＯＳに無駄な負荷をかけないようにするためにpause()システムコールなどを利用してＣＰＵを放棄する。
【００２１】
アイドル状態への遷移およびアイドル状態から通常のユーザタスク実行状態への遷移はすべてＲＴＯＳが管理しているので、当然現在アイドル状態になっているかそうでないかをいつでも把握することができる。これは実機もＲＴＯＳシミュレータも同様である。
【００２２】
以下では、ＲＴＯＳシミュレータの時間管理に関する実現方法について説明していく。
【００２３】
まずはＲＴＯＳ起動時の処理について説明する。実機のＲＴＯＳの場合は、起動時の処理としてＲＴＯＳの内部構造の初期化とともにハードウェアタイマを１msecや１０msecといった一定時間ごとに割込みを発生させるように設定する。ＲＴＯＳシミュレータの場合もこれと同様に、汎用ＯＳのタイマ機能（Ｂ）を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する。その後ＲＴＯＳシミュレータは実機のＲＴＯＳの処理とまったく同様に、最初に起動すべきタスクを生成し、そのタスクを実行させるためにディスパッチする。
【００２４】
次に、通常のユーザタスク実行状態からアイドル状態に遷移する際の処理について図１のフローチャートを用いて説明する。この遷移は、ユーザタスクがみずからＲＥＡＤＹ状態からＷＡＩＴＩＮＧ状態やＳＵＳＰＥＮＤＥＤ状態に遷移するシステムコールを発行した際に起こりうる。具体的にはイベントフラグを待つシステムコール、セマフォを獲得するシステムコール、メッセージの到着を待つシステムコールなどである。こうしたシステムコールで実行される通常の処理の最後のタスクスイッチ処理のところに、以下で示す処理を追加する。
【００２５】
まずはステップＳ１０１で、発生するタスクスイッチが通常のユーザタスクからアイドル状態を意味する特殊なタスク（アイドルタスク）へのタスクスイッチであるかどうかを判断する。ステップＳ１０１で、通常のユーザタスクから別の通常のユーザタスクへのタスクスイッチであると判断された場合にはステップＳ１０２からステップＳ１０５に進み通常のタスクスイッチ処理を実行する。
【００２６】
ステップＳ１０１で、通常のユーザタスクからアイドルタスクへのタスクスイッチであると判断された場合にはステップＳ１０２からステップＳ１０３に進む。ステップＳ１０３では、このとき起動されているタイマ機能（Ｂ）をいったん停止し（setitimer()で実現可能）、タイマの残時間を獲得する。タイマの残時間とは、現在から次にシグナルが発生する予定の時間までの差分のことで、これもタイマ停止時に利用するsetitimer()で獲得することができる。
【００２７】
次にステップＳ１０４で、タイマ機能（Ａ）を用いて実時間に基づいて一定時間ごとにシグナルを発生させるように設定する。このとき、最初のシグナルだけは前記残時間後に発生するように、そしてそれ以降は規定時間間隔で発生するように設定する。これもsetitimer()を利用することで実現可能である。
【００２８】
次にステップＳ１０５で通常のタスクスイッチ処理を実行する。ステップＳ１０２から進んできた場合には、通常のユーザタスクから別の通常のユーザタスクへのタスクスイッチとなるので指定の通常のユーザタスクをディスパッチし、ステップＳ１０４から進んできた場合には、アイドルタスクへのタスクスイッチとなるのでアイドルタスクをディスパッチする。実際の処理としては両者に違いはない。
【００２９】
ステップＳ１０５で、アイドルタスクがディスパッチされた場合には、アイドルタスクの処理として、汎用ＯＳに無駄な負荷をかけないようにするために pause()システムコールなどを呼び出しＣＰＵを放棄する。
【００３０】
次に、発生したシグナルに対するシグナルハンドラの処理について説明する。シグナルは前述したタイマ機能のためのシグナル（タイマシグナル）と何らかの形で実現したＩＯ装置ハードウェアのシミュレーションプログラム（ＩＯシミュレータ）によって発生されるシグナル（ＩＯシグナル）とに分けられる。まずはＩＯシグナルに対するシグナルハンドラの処理について図２のフローチャートを用いて説明する。
【００３１】
上記のように発生したＩＯシグナルに対して、ＲＴＯＳ内部のシグナルハンドラは、まずは実機の場合と同様に、ステップＳ２０１で、あらかじめユーザプログラム（ファームウェア）により登録されている割り込みハンドラのうちどのハンドラを起動すべきかを特定する。これは各ＩＯシミュレータから得られる付加情報（割り込み番号など）を用いることで特定できる。
【００３２】
次にステップＳ２０２で、特定した割り込みハンドラをコールする。ステップＳ２０３でユーザにより記述された割り込みハンドラの処理が実行される。割り込みハンドラでは、任意のタスクを起床するためのＲＴＯＳのシステムコールを利用することもできる。ただし、割り込みハンドラ内でタスク起床が行なわれてもそれに伴うタスクスイッチはすべての割り込みハンドラの処理が終了するまで遅延される。この処理はＲＴＯＳでは一般的である。
【００３３】
次に割り込みハンドラからリターンすると、ステップＳ２０４で、ＩＯシグナルハンドラはＲＴＯＳのスケジューラを呼び出しタスクスイッチが必要かどうかを判断する。タスクスイッチが必要ない場合には、ステップＳ２０５からステップＳ２０６に進み、シグナルハンドラから元の状態にリターンするだけである。
【００３４】
タスクスイッチが必要な場合には、ステップＳ２０５からステップＳ２０７に進み、それがアイドルタスクから通常のユーザタスクへのスイッチかどうかを判断する。通常のユーザタスク同士のスイッチだった場合には、ステップＳ２０８からステップＳ２１１に進み、タスクスイッチ処理を実行してユーザタスクをディスパッチして終了となる。アイドルタスクから通常のユーザタスクへのスイッチだった場合には、ステップＳ２０８からステップＳ２０９に進み、タイマ機能切り替え処理を実行したあとにステップＳ２１１に進む。
【００３５】
タイマ機能切り替え処理では、ステップＳ２０９で、起動されているタイマ機能（Ａ）をいったん停止し、タイマの残時間を獲得する（setitimer()で実現可能）。次にステップＳ２１０で、タイマ機能（Ｂ）を用いてＣＰＵ割り当て時間に基づいて一定時間ごとにシグナルを発生させるように設定する。このとき、最初のシグナルだけは前記残時間後に発生するように、そしてそれ以降は規定時間間隔で発生するように設定する（setitimer()で実現可能）。
【００３６】
最後に、タイマシグナル発生時の処理について説明する。タイマシグナルが発生するとタイマシグナルハンドラが起動される。タイマシグナルハンドラでは、まずはＲＴＯＳのチック処理を呼び出す。チック処理は一般のＲＴＯＳで行なわれる処理と同様であり、現在時刻を維持している内部変数をチック分加算し、その結果ユーザプログラムによりあらかじめ登録されたＲＴＯＳ内部で管理されているソフトウェアタイマのうち満期時間を過ぎたものがあった場合にそのタイマハンドラを呼び出す処理を行なう。チック処理が終了すると、図２のステップＳ２０４からの処理を実行する。
【００３７】
以上述べたように、本実施例では、
ＲＴＯＳシミュレータにおいて、通常のユーザタスク実行状態の際には、ＣＰＵ割り当て時間に基づいて時間管理を実行するようになり、アイドル状態になっている間だけ、実時間に基づいて時間管理を実行するように自動的に切り替わるようになる。
【図面の簡単な説明】
【００３８】
【図１】通常のユーザタスク実行状態からアイドル状態に遷移する際の処理の流れを示したフローチャートである。
【図２】ＩＯシグナルに対するシグナルハンドラの処理の流れを示したフローチャートである。
【図１】
2006163983.tif 000003
【図２】
2006163983.tif 000004