(57)【要約】    【課題】  タスクの起動順序を考慮する必要なく、さらに他タスクや割込みへの処理遷移を考慮した形で、暴走発生から時間の経過が少なく、自タスクの暴走検出を行うことを目的とする。    【解決手段】  従来の実行対象となるタスクの切替えの際に退避・保存、復帰・設定していた各タスクのコンテキスト情報１１２に加えて暴走検出用タイマーカウント値・情報１１１を合わせて退避・復帰することで、他タスクへの遷移など意識することなく自タスクの処理内でのシーケンシャルな処理として考慮して暴走検出のための処理を追加すればよく、タスクの起動順序を考慮する必要なく、さらに他タスクや割込みへの処理遷移を考慮した形で、暴走発生から時間の経過が少なく、自タスクの暴走検出を行うことができる。【選択図】    図１
2005107757.tif 000002
【特許請求の範囲】
【請求項１】
プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する方法であって、
タスクの切替時に暴走検出用タイマーのカウントを停止する工程と、
前記暴走検出用タイマーのカウント値を現タスクのカウント値として保存する工程と、
現タスクのコンテキスト情報を保存する工程と、
次タスクのコンテキスト情報を取得する工程と、
前記次タスクのコンテキスト情報を設定する工程と、
前記次タスクの保存された前記暴走検出用タイマーのカウント値を取得する工程と、
前記暴走検出用タイマーのカウントを開始して暴走検出を開始する工程と、
前記次タスクの処理を開始する工程と
を有し、タスクが切替わっても、あらかじめ保存しておいた次タスクのカウント値からカウントを再開することを特徴とするプログラムの暴走検出方法。
【請求項２】
プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する方法であって、
割込み要求発生時に暴走検出用タイマーのカウントを停止する工程と、
現タスクのコンテキスト情報を保存する工程と、
前記割込み処理の暴走判定時間を取得する工程と、
前記暴走検出用タイマーのカウントを開始して暴走検出を開始する工程と、
前記割込み処理を開始する工程と
を有し、割込み発生時に、あらかじめ設定しておいた割込み処理の暴走判定時間を用いて暴走を検出することを特徴とするプログラムの暴走検出方法。
【請求項３】
前記暴走検出用タイマーとしてウォッチドックタイマーを用いることを特徴とする請求項１または請求項２のいずれかに記載のプログラムの暴走検出方法。
【請求項４】
前記暴走検出用タイマーとしてシーケンシャルイベントが一定時間内で成立しない場合にブレークするタイムアウトブレーク機能を用いることを特徴とする請求項１または請求項２のいずれかに記載のプログラムの暴走検出方法。
【請求項５】
プログラムにおける、各タスクの処理時間や割込みの処理時間を計測し、その内部処理をトレースすることによりプログラムの暴走を検出する方法であって、
前記トレースを停止する工程と、
タスクの切替時に暴走検出用タイマーのカウントを停止する工程と、
前記暴走検出用タイマーのカウント値を現タスクのカウント値として保存する工程と、
現タスクのコンテキスト情報を保存する工程と、
次タスクのコンテキスト情報を取得する工程と、
前記次タスクのコンテキスト情報を設定する工程と、
前記次タスクの保存された前記暴走検出用タイマーのカウント値を取得する工程と、
前記暴走検出用タイマーのカウントを開始して暴走検出を開始する工程と、
前記トレースを開始する工程と、
前記次タスクの処理を開始する工程と
を有し、タスクが切替わっても、あらかじめ保存しておいた次タスクのカウント値からカウントを再開することができ、さらに、前記トレースを行うことにより暴走箇所を特定することを特徴とするプログラムの暴走検出方法。
【請求項６】
プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する装置であって、
タスクの切替時にコンテキスト情報や暴走検出情報を退避・復帰してタスクの切替を制御するタスク切替装置と、
各タスクの処理時間を計測して前記プログラムが定める時間を経過した時に暴走したことを通知する暴走検出部と、
前記コンテキスト情報や前記暴走検出情報を保存するコンテキスト保存部と
を有し、タスクが切替わっても、あらかじめ保存しておいた次タスクの暴走検出情報を用いて処理時間を計測することを特徴とするプログラムの暴走検出装置。
【請求項７】
プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する装置であって、
各割込みにおける暴走判定時間を設定する割込み暴走判定時間設定部と、
前記暴走判定時間を管理する割込み暴走判定時間管理部と、
割込み要求時にコンテキスト情報を退避・復帰してタスクの切替を制御するタスク切替装置と、
各タスクの処理時間を計測して前記暴走判定時間を経過した時に暴走したことを通知する暴走検出部と、
前記コンテキスト情報を保存するコンテキスト保存部と
を有し、割込み発生時に、あらかじめ設定しておいた割込み処理の暴走判定時間を用いて暴走を検出することを特徴とするプログラムの暴走検出装置。
【請求項８】
前記暴走検出部がウオッチドックタイマ機能を用いることを特徴とする請求項６または請求項７のいずれかに記載のプログラムの暴走検出装置。
【請求項９】
前記暴走検出部において、シーケンシャルイベントが一定時間内で成立しない場合にブレークするタイムアウトブレーク機能を用いることを特徴とする請求項６または請求項７のいずれかに記載のプログラムの暴走検出装置。
【請求項１０】
イベントの発生を検知して通知するイベント生成部と、
前記タスク切替部からの指示でトレース生成機能を制御するトレース制御部と、
トレース情報を格納するトレースメモリと、
前記トレース情報を前記トレースメモリに格納するトレース情報生成部と
を有し、トレースを行うことにより暴走箇所を特定することを特徴とする請求項６または請求項７のいずれかに記載のプログラムの暴走検出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアプログラムの暴走検出方法および検出装置で、特にオペレーティング・システム（以下、ＯＳと称す）を使用したプログラムの暴走検出方法およびプログラムの暴走検出装置に関する。
【背景技術】
【０００２】
従来のＯＳを使用しないソフトウェアプログラムの暴走検出方法を説明する。
従来のプログラムの仕様として、処理Ａ、処理Ｂ、処理Ｃを順次繰り返すものとした場合、全体の一連の処理で暴走を検出したいときは、全処理の最初にウオッチドックタイマを設定し、最後（今回の場合は処理Ｃの終了後）にウオッチドックタイマのクリアを行っていた。また、個別の処理、例えば処理Ｂで検出したい場合は、処理Ｂの最初にウオッチドックタイマを設定し、処理Ｂの終了時にウオッチドックタイマのクリアを行っていた。
【０００３】
一方、ＯＳを使用する場合、ＯＳの処理単位となるタスクでの資源の共有や同期通信などの機能、手段をＯＳが提供してくれるため、その分ユーザの負担が減るという反面、自タスクが終了後、次に起動されるタスクがどれになるのかが分かりにくいなどシーケンシャルな処理の流れがつかみにくいという欠点があり、一定時間内に実行される処理を把握することが困難となっていた。
【０００４】
これはＯＳがタスクの起動順序を管理しているためであり、起動するタスクを要求するなど、ユーザから指示することはできるが、その要求が即時実現されることが保障されているわけではない。
【０００５】
以下、図１１，図１２，図１３を用いて具体的に説明する。
図１１は従来の一定時間経過後にタスクの起動を要求する場合のタスクの遷移を説明する図，図１２は従来のすぐにタスクの起動を要求する場合のタスクの遷移を説明する図，図１３は従来のタスクの遷移を例示した図である。
【０００６】
あるタスクが別のタスクを起動するとしたとき、ユーザーはＯＳに対して、どのタスクをいつ起動するかという指示をする。このとき、起動可能なタスクが無い場合には、要求どおりに自タスク終了後に起動要求されたタスクがすぐに実行されることになり、処理の流れはわかりやすい。
【０００７】
しかし、ある一定時間経過後にタスクの起動を要求する場合には、起動要求したタスクは実行中のタスクが終了してから実行される。但し、５ｍｓ経過時点でどのタスクが実行されているかによって、実行順序が変わってくる。
【０００８】
図１１において、現在のタスクの実行および待ち状態が状態１１０１，要求されたタスクをタスクＥとすると、まずタスクＡ実行中に５ｍｓ経過した時は状態１１０２のようにタスクＡ→Ｅ→Ｂ→Ｃ→Ｄのような実行順序になり、タスクＢが実行中に５ｍｓ経過した時には状態１１０３のような実行順序となるなど、タスクＢ，Ｃ等の実行待ち状態のタスクの実行時間により起動される順序が変化したり、５ｍｓ経過してから実行中のタスクが終了するまでの時間により、タスクＥが起動されるまでの時間が変化してしまう。
【０００９】
また、すぐに起動するように要求していた場合でも、図１２のようにタスクＡ実行中にタスクＥの起動要求を行うと通常、状態１２０２のような実行順序になるが、起動要求したタスクＥよりタスクＢが優先度が高い場合には状態１２０３のように、さらにタスクＡ実行中に優先度の高いタスクＣが割り込んでくると、状態１２０４のような実行順序となり、タスクＥよりも先に実行されるタスクがあり得るため、タスクの実行順序がユーザが思っているものと変わってしまうので、どの処理の後に実行されるのか判断できなくなる。
【００１０】
そのため、一定時間内に実行される処理の判断が難しく、ウォッチドッグタイマのクリアのように一定時間内で行う必要のある処理をこの時点で追加するかを判断することが難しい。その結果、これまでは全タスクのプログラム中のいたる箇所にウオッチドックタイマのクリア処理を追加するという処理で対応してきた。しかし、この方法では、タスクの数が増えればウォッチドッグタイマのクリア処理も同じだけ多くなり、処理のミスやＲＯＭ容量が増加するため、ＲＯＭ容量に余裕のないシステムでは問題となってくる。また、あらゆる箇所にクリア処理を入れるとしても、実際にどこにどこまで入れればよいのかを判断するのが難しく、暴走検出するという意図からは離れたものになる可能性がある。
【００１１】
タイムシェアリング機能を搭載したＯＳの場合は、問題がより顕著となってくる。タイムシェアリング機能に対応したＯＳでは、全てのタスクに一定時間の実行権限を与えるというもので、あるタイミングでＯＳが自動的にタスクを切替えていく。この場合、あるタスクの処理が暴走していても、他の実行可能状態のタスクが正常に動作していれば、切替えが発生してウォッチドッグタイマをクリアしてしまうと、暴走しているにもかかわらず、暴走状態を検出できなくなるという問題も発生する。
【００１２】
このタイムシェアリング機能を搭載したＯＳに対しては、ハードウェアの面からの解決策として、ウォッチドッグタイマをタスクの数だけ複数個内蔵するという技術がある。これは、ウォッチドッグタイマとタスクとを一対一に関連付け、それぞれのウォッチドッグタイマが、関連するタスクが起動されたときにカウントを開始し、そのカウントはタスクの実行中に行われたウォッチドッグタイマのクリア処理によってのみクリアされる。タスクが実行されず、ウォッチドッグタイマのクリア処理が実行されない時は、ウォッチドッグタイマがオーバーフローすることになる。いずれのウォッチドッグタイマがオーバーフローしても、マイコンはいずれかのタスクが暴走していると判断し、リセット動作を行う（例えば、特許文献１参照）。
【００１３】
しかし、上述した方法でも、タスクの数だけウォッチドッグタイマを内蔵しなければならないという問題点がある。更に、実行を中断しているタスクのウォッチドッグタイマも継続してカウント動作するため、ウォッチドッグタイマのクリアからタスクの暴走検出と判断する時間までの間に、タスクを中断している状態があると中断中にタスクが暴走したと判断してしまうといった問題もある。
【００１４】
図１３はタスクＡ、Ｂ、Ｃの３つのタスクで遷移する様子を時間を横軸にとって示している。タスクＡではＴ１とＴ２の処理で暴走を検出するものであり、処理の初めと終わりでウオッチドックタイマのクリア処理を入れる。図１３の例では、ｔ１とｔ６でウオッチドックタイマのクリア処理を入れ、時間（ｔ２-ｔ１）＋時間（ｔ６−ｔ５）がある特定時間ＭＡＸよりも長い場合にはプログラムが暴走したと判断する。しかし、今回の場合タスクＡの処理中にタスクＢ、Ｃに実行が遷移しているため、タスクＡでのウオッチドックタイマのクリアから次のクリアまでに時間（ｔ６−ｔ１）がかかっていることになる。この時間（ｔ６−ｔ１）がある特定時間ＭＡＸよりも長かった場合に、上述した問題の通り、誤ってタスクＡが暴走したと判断してしまうことになる。
【００１５】
また、上述した技術（特許文献１）に関する問題点の解決策として、ＯＳのタスク切替え処理時、具体的にはタスク終了処理を行うシステムコール実行時に、ウオッチドックタイマのクリア処理を行うという技術がある（例えば、特許文献２参照）。
【００１６】
これは、従来通りにウオッチドックタイマの数に制限がなく、各タスクの処理の中でウオッチドックタイマのクリア処理を埋め込むことも全く必要が無いため、一部の問題が回避されている。タイムシェアリング機能を搭載したＯＳにおける問題として挙げたタスクの中断時間をもカウントして誤って暴走したと判断することは無くなったものの、より正確に暴走を判定することはできていない。つまり、タスク切換え時に暴走判定用のタイマをクリアしているために、切換え前に既に暴走していた場合でも該タスクに復帰してから再度カウントをはじめるために暴走を判定できたとしても実際に暴走してからはかなりの時間が経過している場合がある。また、最悪の場合には再度タスク切換えが発生してしまうと暴走判定ができないといった問題を抱えている。
【００１７】
更に、上記技術の解決策として、タスク終了処理を行うシステムコール実行時に対策を講じることとなっているが、システムコールではなく、タイマや外部要因での割込みによりタスク切換えは考慮されておらず、割込み処理にて暴走した場合には、それを判定することはできない。
【特許文献１】特開平４−１５５５４３号公報
【特許文献２】特開平１０−２３１５４６公報
【発明の開示】
【発明が解決しようとする課題】
【００１８】
ＯＳを使用したシステムでは、タスクという単位で処理を分割することで、タスク間での影響を最小限にしてある程度独立した設計を可能としていたが、その反面、タスクの起動順序がＯＳに依存するため把握し辛く、タスク間での同期設計が困難であった。そのため、前述の従来のソフトウェアプログラムでの暴走検出方法においては、一定周期で行う必要のあるウォッチドッグタイマのクリア処理が効率よくできず、全タスクのあらゆる複数箇所にクリア処理を追加するといった対策が必要となっていた。しかしこの場合、タスク数の増加に伴ってＲＯＭ容量の増加や、処理の追加箇所の判断が困難である等の問題が発生するものであった。
【００１９】
上述の問題の解決策として従来の技術で述べた、ＯＳのタスク切替え処理時にウオッチドックタイマのクリア処理を追加する対策は、暴走していないにもかかわらずタスク遷移の関係で暴走と判断してしまうことはなくなる。しかし、タスク遷移が発生した時点でＯＳが自動でウオッチドックタイマをクリアしてしまうため、遷移前に暴走していた場合でも自タスクに復帰後から検出開始となり、実際に暴走していた時点からは十分に時間が経過したときに初めて暴走と判断することになり、暴走の検出が困難になったり不可能になるという問題点があった。
【００２０】
本発明のプログラムの暴走検出方法およびプログラムの暴走検出装置は、上記問題点を解決するために、タスクの起動順序を考慮する必要なく、さらに他タスクや割込みへの処理遷移を考慮した形で、暴走発生から時間の経過が少なく、自タスクの暴走検出を行うことを目的とする。
【課題を解決するための手段】
【００２１】
上記目的を達成するために、本発明の請求項１記載のプログラムの暴走検出方法は、プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する方法であって、タスクの切替時に暴走検出用タイマーのカウントを停止する工程と、前記暴走検出用タイマーのカウント値を現タスクのカウント値として保存する工程と、現タスクのコンテキスト情報を保存する工程と、次タスクのコンテキスト情報を取得する工程と、前記次タスクのコンテキスト情報を設定する工程と、前記次タスクの保存された前記暴走検出用タイマーのカウント値を取得する工程と、前記暴走検出用タイマーのカウントを開始して暴走検出を開始する工程と、前記次タスクの処理を開始する工程とを有し、タスクが切替わっても、あらかじめ保存しておいた次タスクのカウント値からカウントを再開することを特徴とする。
【００２２】
請求項２記載のプログラムの暴走検出方法は、プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する方法であって、割込み要求発生時に暴走検出用タイマーのカウントを停止する工程と、現タスクのコンテキスト情報を保存する工程と、前記割込み処理の暴走判定時間を取得する工程と、前記暴走検出用タイマーのカウントを開始して暴走検出を開始する工程と、前記割込み処理を開始する工程とを有し、割込み発生時に、あらかじめ設定しておいた割込み処理の暴走判定時間を用いて暴走を検出することを特徴とする。
【００２３】
請求項３記載のプログラムの暴走検出方法は、請求項１または請求項２のいずれかに記載のプログラムの暴走検出方法において、前記暴走検出用タイマーとしてウォッチドックタイマーを用いることを特徴とする。
【００２４】
請求項４記載のプログラムの暴走検出方法は、請求項１または請求項２のいずれかに記載のプログラムの暴走検出方法において、前記暴走検出用タイマーとしてシーケンシャルイベントが一定時間内で成立しない場合にブレークするタイムアウトブレーク機能を用いることを特徴とする。
【００２５】
請求項５記載のプログラムの暴走検出方法は、プログラムにおける、各タスクの処理時間や割込みの処理時間を計測し、その内部処理をトレースすることによりプログラムの暴走を検出する方法であって、前記トレースを停止する工程と、タスクの切替時に暴走検出用タイマーのカウントを停止する工程と、前記暴走検出用タイマーのカウント値を現タスクのカウント値として保存する工程と、現タスクのコンテキスト情報を保存する工程と、次タスクのコンテキスト情報を取得する工程と、前記次タスクのコンテキスト情報を設定する工程と、前記次タスクの保存された前記暴走検出用タイマーのカウント値を取得する工程と、前記暴走検出用タイマーのカウントを開始して暴走検出を開始する工程と、前記トレースを開始する工程と、前記次タスクの処理を開始する工程とを有し、タスクが切替わっても、あらかじめ保存しておいた次タスクのカウント値からカウントを再開することができ、さらに、前記トレースを行うことにより暴走箇所を特定することを特徴とする。
【００２６】
請求項６記載のプログラムの暴走検出装置は、プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する装置であって、タスクの切替時にコンテキスト情報や暴走検出情報を退避・復帰してタスクの切替を制御するタスク切替装置と、各タスクの処理時間を計測して前記プログラムが定める時間を経過した時に暴走したことを通知する暴走検出部と、前記コンテキスト情報や前記暴走検出情報を保存するコンテキスト保存部とを有し、タスクが切替わっても、あらかじめ保存しておいた次タスクの暴走検出情報を用いて処理時間を計測することを特徴とする。
【００２７】
請求項７記載のプログラムの暴走検出装置は、プログラムにおける、各タスクの処理時間や割込みの処理時間を計測することによりプログラムの暴走を検出する装置であって、各割込みにおける暴走判定時間を設定する割込み暴走判定時間設定部と、前記暴走判定時間を管理する割込み暴走判定時間管理部と、割込み要求時にコンテキスト情報を退避・復帰してタスクの切替を制御するタスク切替装置と、各タスクの処理時間を計測して前記暴走判定時間を経過した時に暴走したことを通知する暴走検出部と、前記コンテキスト情報を保存するコンテキスト保存部とを有し、割込み発生時に、あらかじめ設定しておいた割込み処理の暴走判定時間を用いて暴走を検出することを特徴とする。
【００２８】
請求項８記載のプログラムの暴走検出装置は、請求項６または請求項７のいずれかに記載のプログラムの暴走検出装置において、前記暴走検出部がウオッチドックタイマ機能を用いることを特徴とする。
【００２９】
請求項９記載のプログラムの暴走検出装置は、請求項６または請求項７のいずれかに記載のプログラムの暴走検出装置において、前記暴走検出部において、シーケンシャルイベントが一定時間内で成立しない場合にブレークするタイムアウトブレーク機能を用いることを特徴とする。
【００３０】
請求項１０記載のプログラムの暴走検出装置は、請求項６または請求項７のいずれかに記載のプログラムの暴走検出装置において、イベントの発生を検知して通知するイベント生成部と、前記タスク切替部からの指示でトレース生成機能を制御するトレース制御部と、トレース情報を格納するトレースメモリと、前記トレース情報を前記トレースメモリに格納するトレース情報生成部とを有し、トレースを行うことにより暴走箇所を特定することを特徴とする。
【００３１】
以上により、タスクの起動順序を考慮する必要なく、さらに他タスクや割込みへの処理遷移を考慮した形で、暴走発生から時間の経過が少なく、自タスクの暴走検出を行うことができる。
【発明の効果】
【００３２】
本発明によると、従来の実行対象となるタスクの切替えの際に退避・保存、復帰・設定していた各タスクのコンテキスト情報に加えて暴走検出用タイマーカウント値・情報を合わせて退避・復帰することで、他タスクへの遷移など意識することなく自タスクの処理内でのシーケンシャルな処理として考慮して暴走検出のための処理を追加すればよく、タスクの起動順序を考慮する必要なく、さらに他タスクや割込みへの処理遷移を考慮した形で、暴走発生から時間の経過が少なく、自タスクの暴走検出を行うことができる。
【００３３】
また、あらかじめ各割込み（種別）ごとの暴走判定時間を設定・登録しておくことで、ユーザは割込みプログラムの中に暴走検出のための手続きを追加する必要がなく、割込み処理での暴走を検出することが可能となる。
【００３４】
さらに、限られた資源であるトレースメモリに暴走判定対象としているタスクおよび割込みの処理に関する情報のみ格納する手段を提供し、暴走検出機能を補助することで、暴走箇所を容易に特定することが可能となる。
【発明を実施するための最良の形態】
【００３５】
本発明は、各タスクおよび割込みを切替えて動作させるＯＳを使ったプログラムの暴走検出装置にあって、時間を計測し時間経過により所定の処理を行う暴走検出部と、ＯＳが有する切替発生時にコンテキスト情報を保存するコンテキスト退避部ならびに動作させるタスクのコンテキスト情報に切替えるコンテキスト復帰部と、暴走検出部の情報を保存する暴走検出情報退避部ならびに動作させるタスクの暴走検出情報に切替える暴走検出情報復帰部とを備え、切替えが発生した際に保存しておいた動作させるタスク用のコンテキストと同様に暴走検出情報を取得し暴走検出部に設定し対象タスクの切替え前の状態から暴走検出部により暴走の検出を再開できることを特徴とする。
【００３６】
これによって、利用者がＯＳによる切替え処理を意識することなくあたかも時間軸で連続した処理として扱うことができ、また、実際にその処理にかかった時間を計測し、それをもとにして暴走検出ができる。
【００３７】
つまり従来技術の説明で挙げた図１３では、タスクＢ、Ｃへの実行遷移にかかわらず、タスクＡの暴走を判定するために時間（ｔ２−ｔ１）＋時間（ｔ６−ｔ５）がある特定時間ＭＡＸを超えていないかどうかを確認して、誤りなく暴走検出を行うことができる。
【００３８】
ここで、前記暴走検出部は、ユーザがプログラム、またはデバッガの機能を使って少なくとも２点間での時間の計測ができ、その計測時間が所定の時間を越える場合にイベントを発生させるもので、マイコンのウオッチドックタイマ機能、タイムアウトブレーク機能が挙げられる。
【００３９】
また、各タスクおよび割込みを切替えて動作させるＯＳを使ったプログラムの暴走検出装置において、時間を計測し時間経過により所定の処理を行う暴走検出部と、ＯＳが有する切替発生時にコンテキスト情報を保存するコンテキスト退避部ならびに動作させるタスクのコンテキスト情報に切替えるコンテキスト復帰部と、各割込みの暴走を判断する時間を設定する割込み暴走判定時間設定部と、管理する割込み暴走判定時間管理部とを備え、割込みへの切替えが発生した際に割込み暴走判定時間管理部が管理する該割込みの暴走判定時間を取得、暴走検出部に設定、計測を開始し、本割込み処理が終了した時点で時間が経過していない場合には暴走検出部に計測終了を要求することを特徴とする。
【００４０】
これによって、利用者は各割込みごとの暴走判定時間を容易に、ＯＳが割込みから復帰までを計測し、割込み処理における暴走検出ができる。
また、トレースの有効・無効を制御するトレース機能制御部と、トレース制御部によりトレース情報を生成するトレース情報生成部とを備え、タスクまたは割込みへの切替えが発生した際に暴走検出部へ設定する次タスクまたは割込みに関する暴走検出情報をもとにトレース機能を制御してデバッグ対象とするタスクおよび割込みに関する処理のトレースを取得し、暴走検出を補助することを特徴とする。
【００４１】
これによって、利用者がデバッグ対象とするタスクまたは割込みの暴走を検出できるとともに、それにトレース情報をリンクさせて、暴走箇所の特定が容易にできる。
以下、本発明の実施の形態について、図を用いて説明する。
（実施の形態１）
まず、実施の形態１について、図１，図２，図３，図４を用いて説明する。
【００４２】
図１は本発明の実施の形態１におけるプログラムの暴走検出装置の構成を示す図，図２は本発明の暴走検出部の構成を示す図，図３は本発明の実施の形態１における暴走検出方法を説明するフローチャート，図４は本発明のコンテキスト保存部によるタスクごとのコンテキスト情報を例示する図である。
【００４３】
図１において、タスク切替装置１００は、タスクの切替えを実現するために現タスクの必要な情報、例えば、マイコンのレジスタ値を含むコンテキスト情報１１２を所定の領域に退避・保存するコンテキスト退避部１０１と、タスク切替部１０２と、コンテキスト保存部１１０の所定領域に退避された切替えて動作させるタスクのコンテキスト情報１１４をコンテキスト保存部１１０から復帰・設定するコンテキスト復帰部１０３と、切替え時の暴走検出部１２０の情報を暴走検出情報１１１としてコンテキスト保存部１１０に退避・保存する暴走検出情報退避部１０４と、切替えて動作させるタスクの暴走検出情報１１３をコンテキスト保存部１１０から復帰、暴走検出部１２０に設定する暴走検出情報復帰部１０５とから構成される。
【００４４】
暴走検出部１２０への暴走検出のための情報設定は、ユーザプログラム１３０であるタスク部１３１およびタスク独立部１３２によって制御される。
図２において、暴走検出部１２０は、一定間隔でカウントアップまたはダウンするタイマ部２１０と、ユーザプログラム１３０またはタイマ部２１０からのカウント要求を受け付けるカウント値制御部２１１と、カウント値制御部２１１からの要求によりカウント値２１３を変更・管理し、カウント値２１３がオーバフローまたはアンダーフローした場合にマイコン２００にその旨を通知するカウント値管理部２１２から構成される。
【００４５】
この実施の形態では、各タスクならびに割込みなどのタスク独立部がそれぞれ個別に暴走検出部１２０を使った暴走検出をする状況下において、タスク遷移などの条件に関係なく精度高く暴走が検出されるべく、タスクならびにタスク独立部とをスケジューリングして動作、実行させるために必要なコンテキストの保存と復帰させる際に、暴走検出部１２０に関する情報もその対象とするものである。
【００４６】
以上のように構成された本発明の実施の形態１における暴走検出方法について説明する。
例えば、セマフォー等ＯＳが提供する資源の獲得を要求して待ち状態に入ったり、ＯＳ資源を解放することで待ち状態にあった優先度の高いタスクが実行可能となったりするような、現在動作しているタスク（タスクＡとする）が発行したシステムコールによって別のタスク（タスクＢとする）が実行対象となるタスクの切り替えが発生する場合（ステップ３０１）、まず、暴走検出情報退避部１０４は暴走検出部１２０に対して暴走検出用タイマーのカウント停止を要求する（ステップ３１１）。そして、暴走検出部１２０から現カウント値２１３を取得し、コンテキスト保存部１１０に保存・管理を依頼する（ステップ３１２）。ここで、コンテキスト保存部１１０は依頼にもとづいてタスクＡの暴走検出カウント値４０４をタスクＡ用の管理領域に保存する。
【００４７】
続いて、コンテキスト退避部１０１はタスクＡのコンテキスト情報４０３を取得し、コンテキスト保存部１１０に保存・管理を依頼する（ステップ３０２）。コンテキスト復帰部１０３は次のタスクであるタスクＢ用のコンテキスト情報をコンテキスト保存部１１０から取得するように要求する。コンテキスト保存部１１０は依頼にもとづき、コンテキスト情報格納領域から検索しタスクＢのコンテキスト情報４０５を取得してコンテキスト復帰部１０３に渡す（ステップ３０３）。コンテキスト復帰部１０３はタスクＢ用のコンテキスト情報４０５をマイコンのレジスタなどに設定する（ステップ３０４）。
【００４８】
次に、暴走検出情報復帰部１０５はコンテキスト情報と同様にタスクＢ用の暴走検出用タイマーカウント値をコンテキスト保存部１１０に取得・要求する。コンテキスト保存部１１０は同じくタスクＢ用の暴走検出用タイマーカウント値４０６を暴走検出情報復帰部１０５に渡す（ステップ３１３）。取得した次タスクであるタスクＢの暴走検出用タイマーカウント値が０以外の場合は（ステップ３１４）、暴走検出情報復帰部１０５は暴走検出部１２０に対して取得した暴走検出用タイマーカウント値を設定し（ステップ３１５）、暴走検出用タイマーのカウント開始を要求する（ステップ３１６）。暴走検出用タイマーカウント値が０の場合は、何もしない。最後に、タスク切替部１０２が次タスクであるタスクＢへの実行に切替えて（ステップ３０５）、タスク切替え処理は終了となる。この一連の処理がタスク切替えが発生した場合に行われることになる。
【００４９】
上記のように、従来の実行対象となるタスクの切替えの際に退避・保存、復帰・設定していた各タスクのコンテキスト情報に加えて暴走検出用タイマーカウント値・情報を合わせて退避・復帰することで、他タスクへの遷移など意識することなく自タスクの処理内でのシーケンシャルな処理として考慮して暴走検出のための処理を追加すればよく、ユーザへの負担が軽減され、かつ暴走していない場合には判断されず、暴走した場合には正確にすばやく検出することが可能となる。
【００５０】
なお、以上の説明では、暴走検出部１２０をマイコンが提供するウオッチドックタイマー機能を想定して行ったが、ある２点間での経過時間を計測することができ、計測時間が所定の時間を越えた場合に、ユーザプログラムあるいはユーザに何らかの形で通知（例えば、マイコンリセットが発生する、プログラムが停止しデバッガでのデバッグ可能状態となる、等）されるものであれば何でもよい。
【００５１】
また、以上の説明では、コンテキスト保存部１１０によるコンテキスト情報ならびに暴走検出カウント値情報の管理方法の一例として図４を示したが、管理方法はこれにこだわらず各タスクのコンテキスト情報ならびに暴走検出カウント値情報が区別できればどんな形式でよい。
（実施の形態２）
次に、実施の形態２について、図５，図６，図７，図８を用いて説明する。
【００５２】
図５は本発明の実施の形態２におけるプログラムの暴走検出装置の構成を示す図であり、実施の形態１（図１）の構成要素から暴走検出情報退避部１０４と、暴走検出情報復帰部１０５と、暴走検出情報１１１、１１３とを除いた構成と、各割込みにおける最長処理時間、つまり暴走を判定する時間を設定する割込み暴走判定時間設定部５０１と、割込み暴走判定時間設定５０１で設定された割込み暴走判定時間５０３を管理し、タスク切替部１０２から要求される所定の割込みに対する、割込み暴走判定時間をタスク切替部１０２に渡す、割込み暴走判定時間管理部５０２とから構成される。図６は本発明の実施の形態２における多重割込みを考慮したプログラムの暴走検出装置の構成を示す図，図７は割込み暴走判定時間管理部による割込み種別ごとの暴走判定時間情報を例示する図，図８は本発明の実施の形態２における暴走検出方法を説明するフローチャートである。
【００５３】
以上のように構成された本発明の実施の形態２における暴走検出方法について説明する。
現在いずれかのタスクが動作しているものとして、外部要因（イベント）等によって割込み（ここでは割込みＡとする）の要求が発生した場合（ステップ８０１）、まず、コンテキスト退避部１０１は動作中のタスクのコンテキスト情報を取得し、コンテキスト保存部１１０に保存・管理を依頼する（ステップ３０２）。タスク切替部１０２は所定の割込みへ切替える前に、暴走検出部１２０に対して暴走検出用タイマーのカウントの停止を要求する（ステップ３１１）。そして、割込み暴走判定時間管理部５０２から割込みＡの割込み暴走判定時間５０３を取得する（ステップ８０３）。
【００５４】
実際には、割込み暴走判定時間管理部５０２は、割込みＡの暴走判定時間７０２を検索し、割込みＡの暴走判定時間情報７０２をタスク切替部１０２に返す。この取得した暴走判定時間が０以外であれば（ステップ８０４）、割込み暴走判定時間設定部５０１により取得した暴走判定時間を暴走判定部１２０のタイマーのカウント値として設定し（ステップ３１５）、暴走検出用タイマーのカウント開始を要求する（ステップ３１６）。暴走検出用タイマーカウント値が０の場合は、そのままステップ３１６のカウント開始要求処理を行う。最後に、タスク切替部１０２が該割込み処理への実行に切替えて（ステップ８０２）、切替え処理は終了となる。この一連の処理が割込み要求が発生した場合に行われることになる。
【００５５】
ここで、割込み暴走判定時間管理部５０２によって管理される割込み暴走判定時間５０３は、割込み登録時に割込み暴走判定時間設定部５０１で設定されているものとする。
上記のように、あらかじめ各割込み（種別）ごとの暴走判定時間を設定・登録しておくことで、ユーザは割込みプログラムの中に暴走検出のための手続きを追加する必要がなく、割込み処理での暴走を検出することが可能となる。
【００５６】
なお、以上の説明では、割込み暴走判定時間設定部５０１は、割込み登録時に一緒に暴走判定時間も設定することを想定して行ったが、割込み暴走判定時間管理部５０２によって割込みごとに暴走判定時間が管理されればよく、図７における割込みＡの暴走判定時間に値を設定できる方法であればいずれでもよい。
【００５７】
また、以上の説明では、割込み暴走判定時間管理部５０２により管理される割込み暴走判定時間５０３の一例として図７を示したが、管理方法はこれにこだわらず各割込みの暴走判定時間情報が区別できればどんな形式でもよい。
【００５８】
実施の形態２では、単一割込みのみを考慮した説明となっている。多重割込み、つまりある割込み処理の際にさらに割込みが入る場合の暴走検出方法は、本発明の実施の形態２に、タスク切替を考慮した実施の形態１の構成を加えた図６の構成とすることで、多重割込み、割込み処理の切替が行われる場合でも、実現が可能となる。つまり、割込み発生時には、実施の形態２の説明のように、タスク切替部１０２が割込み暴走判定時間管理部５０２から取得した、割込み暴走判定時間５０３を暴走検出部１２０に対して設定することで、暴走判定のための時間を計測し、また多重割込みが発生した場合には実施の形態１の説明のように、暴走検出部１２０のカウント値の退避、暴走検出部１２０への復帰を行い、暴走判定のための時間を計測する。こうして、実施の形態１，２の利点を合わせることで、本発明を多重割込み発生の状況下においても適用することができる。
（実施の形態３）
次に、実施の形態３について、図９，図１０を用いて説明する。
【００５９】
図９は本発明の実施の形態３におけるプログラムの暴走検出装置の構成を示す図であり、実施の形態１，実施の形態２（図１、５、６）の構成要素におけるタスク切替装置に対して、実行アドレス一致などある特定条件が一致した場合にイベント通知するイベント生成部９０５と、トレース生成機能の有効／無効の制御を受け付けるトレース制御部９０１と、トレース制御部９０１からのトレース機能を有効に制御された際に実行アドレス情報などトレースに関する情報をトレース情報９０４としてトレースメモリ９０３に格納するトレース情報生成部９０２とを付加する構成となる。図１０は本発明の実施の形態３における暴走検出方法を説明するフローチャートである。
【００６０】
上記構成におけるタスク切替部１０２は、タスクおよび割込みなどタスク独立部の実行対象を切替る際に、図１における暴走検出情報１１３または図５，図６における割込み暴走判定時間５０３に設定されて、暴走判定をするデバッグ対象であるタスクおよび割込みなどのタスク独立部の場合には、トレース制御部９０１に対してトレース機能を有効にする。逆に、暴走判定しないデバッグ対象でないタスクおよび割込みなどのタスク独立部でない場合はトレース機能を無効にするよう要求することを特徴とする。
【００６１】
以上のように構成された本発明の実施の形態３における暴走検出方法について説明する。但し、下記の説明は図３における実施の形態１の説明に補足する形で行うものとする。
現在動作しているタスクから別のタスクに切替が発生する場合、第１の実施の形態にフローチャートの暴走検出用タイマーカウント停止（ステップ３１１）の前と、暴走検出用タイマーカウント開始（ステップ３１６）の後に、それぞれトレース停止（ステップ１００１）とトレース開始（ステップ１００２）を加えた処理が行われる。
【００６２】
具体的には、タスクへの切替えが発生した場合には、ＯＳで提供される機能（ＯＳ内部の処理）をトレースしないためにまずはトレースを停止する（ステップ１００１）。一方のトレースの開始は、暴走検出情報復帰部１０５が取得した次タスクの暴走検出用タイマーカウント値が０以外の場合に（ステップ３１４）、暴走検出用タイマーカウント値の設定（ステップ３１５）および開始（ステップ３１６）とともに、トレースを開始する（ステップ１００２）。
【００６３】
上記のように、限られた資源であるトレースメモリに暴走判定対象としているタスクおよび割込みの処理に関する情報のみ格納する手段を提供し、暴走検出機能を補助することで、暴走箇所を容易に特定することが可能となる。
【産業上の利用可能性】
【００６４】
本発明にかかるプログラムの暴走検出方法およびプログラムの暴走検出装置は、タスクの起動順序を考慮する必要なく、さらに他タスクや割込みへの処理遷移を考慮した形で、暴走発生から時間の経過が少なく、自タスクの暴走検出を行うことができ、ソフトウェアプログラムの暴走検出方法および検出装置で、特にオペレーティング・システム（以下、ＯＳと称す）を使用したプログラムの暴走検出方法およびプログラムの暴走検出装置等に有用である。
【図面の簡単な説明】
【００６５】
【図１】本発明の実施の形態１におけるプログラムの暴走検出装置の構成を示す図
【図２】本発明の暴走検出部の構成を示す図
【図３】本発明の実施の形態１における暴走検出方法を説明するフローチャート
【図４】本発明のコンテキスト保存部によるタスクごとのコンテキスト情報を例示する図
【図５】本発明の実施の形態２におけるプログラムの暴走検出装置の構成を示す図
【図６】本発明の実施の形態２における多重割込みを考慮したプログラムの暴走検出装置の構成を示す図
【図７】割込み暴走判定時間管理部による割込み種別ごとの暴走判定時間情報を例示する図
【図８】本発明の実施の形態２における暴走検出方法を説明するフローチャート
【図９】本発明の実施の形態３におけるプログラムの暴走検出装置の構成を示す図
【図１０】本発明の実施の形態３における暴走検出方法を説明するフローチャート
【図１１】従来の一定時間経過後にタスクの起動を要求する場合のタスクの遷移を説明する図
【図１２】従来のすぐにタスクの起動を要求する場合のタスクの遷移を説明する図
【図１３】従来のタスクの遷移を例示した図
【符号の説明】
【００６６】
１００    タスク切替装置
１０１    コンテキスト退避部
１０２    タスク切替部
１０３    コンテキスト復帰部
１０４    暴走検出情報退避部
１０５    暴走検出情報復帰部
１１０    コンテキスト保存部
１１１    暴走検出情報
１１２    コンテキスト情報
１１３    暴走検出情報
１１４    コンテキスト情報
１２０    暴走検出部
１３０    ユーザプログラム
１３１    タスク部
１３２    タスク独立部
２００    マイコン
２１０    タイマー部
２１１    カウント値制御部
２１２    カウント値管理部
２１３    カウント値
４０３    タスクＡのコンテキスト情報
４０４    タスクＡの暴走検出カウント値
４０５    タスクＢ用のコンテキスト情報
４０６    タスクＢの暴走検出カウント値
５０１    割込み暴走判定時間設定部
５０２    割込み暴走判定時間管理部
５０３    割込み暴走判定時間
９０１    トレース制御部
９０２    トレース情報生成部
９０３    トレースメモリ
９０４    トレース情報
９０５    イベント生成部
１１０１    状態
１１０２    状態
１１０３    状態
１２０１    状態
１２０２    状態
１２０３    状態
１２０４    状態
【図１】
2005107757.tif 000003
【図２】
2005107757.tif 000004
【図３】
2005107757.tif 000005
【図４】
2005107757.tif 000006
【図５】
2005107757.tif 000007
【図６】
2005107757.tif 000008
【図７】
2005107757.tif 000009
【図８】
2005107757.tif 000010
【図９】
2005107757.tif 000011
【図１０】
2005107757.tif 000012
【図１１】
2005107757.tif 000013
【図１２】
2005107757.tif 000014
【図１３】
2005107757.tif 000015