• Imagix 4D ユーザガイド
  • 目次

データフロー解析 - タスク、クリティカルな領域、イベントの定義

タスクは、組込みのリアルタイム・ソフトウェアシステムの操作において、重要な役割を果たします。[タスクフロー]レポート は、ソフトウェアのタスクの実装と相互関係をチェックする、一連のレポートです。タスクの連携は複雑で、問題を引き起こす可能性があります。これらのチェックによってレポートされた結果は、必ずしもソフトウェアの欠陥を示すものではありません。それよりはむしろ、タスク間の潜在的な矛盾が特定され、その後のレビュー対象の決定に役立ちます。

タスクは C / C++ プログラムで明示的に指定されるものではないため、これらのレポートには [タスクの定義] ダイアログからタスクを定義できる機能が搭載せれています。各タスクについてルート関数を指定すると、それぞれのタスクはルート関数、およびそのルート関数から直接的あるいは間接的に呼び出される、すべての関数で構成されると見なされます。[タスクの定義] ダイアログでタスクを定義しない場合は、プロジェクト内のルート関数ごとにタスクが自動的に定義されます。

このレポートでは、割り込み禁止あるいはセマフォによって保護される文のクリティカルな領域や範囲も示されます。これらについても、ソースコードでは明示的に指定されません。[クリティカルセクションの定義] ダイアログでは、クリティカルな領域への入力(割り込み禁止 / セマフォ)、もしくはクリティカルな領域からの出力(割り込み許可 / セマフォ)に使用される関数を指定することが可能です。[クリティカルセクションの不一致] レポートならびに [クリティカルセクションでの呼出し] レポートでは、クリティカルな領域を定義する必要があります。また、その他のレポートにおける、クリティカルな領域の定義は任意です。

マルチタスク・システムの同期に対するイベントの使用は、固有のタスク・フローチェック・レポートである [タスク内のイベント呼出し] レポートおよび [タスク間のイベントの遷移] レポートの2つで解析されます。タスクやクリティカルな領域と同様に、イベントメカニズムも C / C++ プログラムで明示的に示されないため、これらのレポートを実行する前に特定する必要があります。その作業は [イベント定義] ダイアログで行い、ここでオペレーティング・システムのイベント関数を指定します。タスクからの呼び出しにより、これらの関数を使用して待機(pend)、解放(post)、クリアのアクティビティが処理されるのです。また、このダイアログではイベントと、イベント間の情報交換で使用されるオペレーティング・システムの共有リソースに対する、ソースコード・レベルの識別子(マクロ、列挙リテラル、定数変数)を指定します。

[タスクフローチェック] レポートを実行することで、ソフトウェアを調査し、レポートで指摘された問題を理解するために、Imagix 4D の全機能を生かすことができるのです。

タスクの指定

[タスクフローチェック] レポートにおけるタスクは、プログラムの内部から明示的に呼び出されることなく、プログラム内において実行できる制御フロー用のルート(またはエントリ)関数によって、定義されます。通常タスクは、同時(プログラムの他の部分の実行中に実行)、または準同時(不特定のステップ数を実行し、別のタスクへの転送を制御)に実行することが可能です。

リアルタイムシステムについては、以下のケースをタスクとして考慮してください。

  • 割り込み発生時に同期せずに呼び出しが可能な関数
  • 基盤となるスケジューラによって開始され、制御フローの完了前に停止が可能で、基盤のスケジューラの制御を別のタスクに移すことができる関数
  • プログラムの他の部分と(準)同時的に実行される可能性のある開始(あるいはルート)関数

次の関数は、単一のタスクとして定義するか、別のタスクに分けて定義することができます。

  • スケジューラによって常に同じ順序で実行され、プログラムの他の部分による停止や割り込みが発生しない一連の関数
  • 起動時や他のタスクの開始前に実行されるシステムを常に初期化する関数。初期化子関数は、オペレーティング・システムを定義する関数に組み込むことが可能

ユーザ自身が手動でタスクを指定する代替の方法として、[自動タスク] を選択することで Imagix 4D にユーザが選択したルールに基づくタスクを自動的に定義させることができます。

グローバル変数を使用する、クラスでないルート関数C++プログラムに適用されます。クラスメソッドではない関数で、直接または呼び出し先でグローバルまたは静的変数を使用するもののみを選択します。Cプログラムの場合、これは次のオプションと同じです。
グローバル変数を使用する任意のルート関数他の関数から呼び出されないすべての関数を選択し、それらの関数が直接または呼び出し先でグローバルまたは静的変数を使用するものを含みます。C++では、この条件を満たすクラスメソッドも含まれます。
クラスでないルート関数他の関数から呼び出されないすべての関数を選択します。C++の場合、これはクラスメソッドを除外します。Cの場合、これは次のオプションと同じです。
任意のルート関数他の関数から呼び出されないすべての関数を選択します。C++では、この条件を満たすクラスメソッドも含まれます。このオプションがデフォルトとして推奨されます。

この定義に従いプログラムがタスクを1しか持たないような場合には、一部の [タスクフローチェック] レポートの価値が失われることになりますが、価値のあるレポートも、まだ存在します。特に、[クリティカルセクションの不一致] レポートは、タスクのクリティカルな領域における問題をレポートし、[Out of Step(Z)変数] レポートは循環タスクでの潜在的な順序付けの問題を示します。

イベントの指定

イベント関連の [タスクフローチェック] におけるイベント定義には、待機(pend)、解放(post)、クリア(clear)のアクティビティを処理するために使用される、オペレーティング・システムのイベント関数の仕様が組み込まれます。通常 post と clear は、同一の関数によって処理されます。マクロあるいは列挙リテラルは、ポストではなくクリアの処理を実行するよう、その関数へ渡されるのです。この機能をサポートするために [イベントの定義] ダイアログをセットアップします。

post と clear に対して別々の関数が適用されているオペレーティング・システムを使用している場合は、その対処方法として、マクロを追加の引数として取得するように修正したクリア関数を定義します。新しいクリア関数を宣言し、その後、実際のクリア関数をその新しい関数に定義してください。例えば、実際のクリア関数を ClearEvent と命名し、そのクリア関数でパラメータを1つ取ると仮定します。そして、使用しているコンパイラ設定ファイルに、以下の文を追記します。

void IMAGIX_ClearEvent(int event, int mode);
#define IMAGIX_CLR 1
#define ClearEvent(E) IMAGIX_ClearEvent(E, IMAGIX_CLR)
この作業を行うのに最適な場所は、新しい単体のファイルです。このファイルを作成した後、-inc オプションを使用して、そのファイルが全ソースファイルから事実上インクルード(#include)されるようにします(アナライザの構文とオプション のページを参照)。

これらの #define を追加することによって、ソースアナライザが ClearEvent の宣言を処理する際に、構文警告のメッセージが出力されることがありますが、作成されるデータベースに、問題が発生することはありません。

その後 [イベント定義] ダイアログで、IMAGIX_ClearEvent を post イベントのパラメータ、IMAGIX_CLR をクリアイベントのパラメータとして指定します。これらの変更により、イベント関連の [タスクフローチェック] では post のアクティビティとクリアのアクティビティとを区別することが可能となるのです。