ソフトウェアコンポーネントは、内部に定義されている複数のランナブルエンティティが共有するデータについて 相互排他処理を行う必要がある場合、「排他領域」を使用することができます。
RTEジェネレータは排他領域設定に従ってOSコンフィギュレーションファイルを作成し、排他領域を最適化し ます。たとえば、ある領域にアクセスするすべてのコンポーネントが同じタスクにマッピングされている場合、そ の領域全体を排他設定から除外できます。
排他領域はXMLコンフィギュレーションに定義され、それらを使用するランナブルエンティティに関連付けられ ます。
7.8.1 設定
ASCETはASCET_exclusive_areaという排他領域をソフトウェアコンポーネント内に自動的に作成します
このアイコンをドラッグし、ソフトウェアコンポーネントのブロックダイアグラム上 にロップします。
ツリーペインからこのリソースを選択し、Edit → Rename を選択してリソー ス名をSwcExclusiveAreaに変更します。
新たに作成されたこの排他領域SwcExclusiveAreaをソフトウェアコンポーネント内で使用するには(次項 を参照してください)、そのコンポーネントが使用する排他領域を<INTERNAL-BEHAVIOR>宣言内の
<EXCLUSIVE-AREAS>に指定します。
つまり、ユーザーが定義する排他領域のスコープはソフトウェアコンポーネントのインスタンスになります。ソフ トウェアコンポーネント境界をまたぐ排他領域を定義することはできません。複数のソフトウェアコンポーネント インスタンスに共有され、それらから同時にアクセスされる可能性があるデータは、必ず専用のコンポーネント にカプセル化して、そのデータへのアクセスには通常のセンダ/レシーバ通信またはクライアント/サーバー 通信を使用するようにしてください。
内部ビヘイビア内に定義されている各排他領域には、<SHORT-NAME>エレメント内で名前が定義されている 必要があります。この名前は、他のエレメント内でこのソフトウェアコンポーネント型を参照し、実行時に排他領 域にアクセスするための「ハンドル」を形成するために使用されるもので、有効なC識別子である必要がありま す。
さらに、ECUディスクリプション内のExclusiveAreaImplementationエレメントにより、排他領域をどの ように実装するかをRTEに知らせることができます。
注記
ある排他領域についてのExclusiveAreaImplementationの定義が省略されると、RTEはデフォルト のOSリソース実装ストラテジを使用します。
排他領域とSWCインスタンスの組み合わせごとに、異なる排他領域実装メソッドを設定できます。
注記
InterruptBlockingメソッドを使用している場合、保護されるクリティカルセクションの実行時間が最長
になると、最悪の場合にはすべてのOS割込みがブロックされてしまいます。
7.8.2 使用法
<INTERNAL-BEHAVIOR>セクション内の各ランナブルでは、「排他領域」を使用するかどうか、およびその領 域を実行時にどのように使用するかを宣言できます。
ASCET
は明示的アクセスとして排他領域を定義します。<RUNNABLE-ENTITY-CAN-ENTER-EXCLUSIVE-AREA>エレメントで、その排他領域へのアクセスに明示的APIが使用されることを指定します。この領域の名
前が、生成されるAPIの一部分になります(明示的アクセスはOSEK OSの標準リソースとよく似ています)。
ASCETでは以下の2通りの方法で排他領域を使用できます。
1. ASCETメッセージを使用してモデリングし、排他領域ASCET_exclusive_areaを使用する
2. ユーザー定義された排他領域内にランナブルエンティティのシーケンスを割り当てる ASCETメッセージにより排他領域ASCET_exclusive_areaを使用する:
“Software Component Editor for: Swc”ウィンドウの“Specification”タブで、
“Elements”パレットから符号なし離散変数を選択します。
“Properties for Scalar Element: udisc”ダイアログボックスが開きます。
この変数の名前をmsgにし、種別(“Kind”)にMessageを選択します。
OKをクリックし、メッセージmsgをソフトウェアコンポーネントのブロックダイ アグラム上に配置します。
“Basic Blocks”パレットからリテラルを選択します。
このリテラルに値0を設定します。
このリテラルをメッセージmsgに接続します。
このメッセージに値を設定するためのシーケンス番号をセットします。
図48: ランナブル“Runnable Entity”内でASCETメッセージ“msg”を使用する
ASCETコードジェネレータは、メッセージベースのランナブル間通信を保護します。ランナブルは、ASCETメッ
セージの読み取りを行うたびに排他領域ASCET_exclusive_areaに入り、すべてのメッセージを読み終え るとこの領域から出ます。ランナブルがメッセージの書き込みを行う場合も同様です。
<RUNNABLE-ENTITY>エレメント内にASCET_exclusive_areaへの参照が生成されます。
SwcExclusiveAreaのシーケンスコールreserveを編集し、メソッド RunnableEntityのシーケンス番号8をセットします。
SwcExclusiveAreaのシーケンスコールreleaseを編集し、メソッド RunnableEntityのシーケンス番号22をセットします。
図49: “RunnableEntity”で排他領域“SwcExclusiveArea”を使用する
以下のように、<RUNNABLE-ENTITY>エレメント内にSwcExclusiveAreaへの参照が生成されます。
ASCETが生成するコードについては、9.6項「排他領域による並行処理制御」を参照してください。
8 モード
前章まではAUTOSARのソフトウェアコンポーネントの定義と設定を行いましたが、本章ではソフトウェアコンポ ーネントがランナブルエンティティの実行を制御するために使用する「アプリケーションモード」を定義していきま す。
本章は、以下の各項で説明されている「モード」について、さらに詳しく説明するものです。
5.1.2項「モードグループ」
7.1.3項「モード切り替えイベント」