AUTOSAR CP入門(その3)SW-C内部のふるまいを実装するAUTOSARを使いこなす(26)(3/4 ページ)

» 2022年08月29日 07時00分 公開
[櫻井剛MONOist]

2.1.2.4 RE間の排他制御:Exclusive Area(EA)

 前回(第25回)の「2.1.1.1 SW-C間のデータ授受用インタフェース」の注記において、排他制御の必要性について触れました。日時や多次元データなど、「セット」としての扱いが求められるデータ群は、例えば更新(書き込み)途中のものを読みだしてしまうと、おかしなことになってしまいます(例:時刻が11:59:59から12:00:00に変わる瞬間に、更新側が秒→分→時の順に更新していったとしたら、11:59:59から12:00:00になるまでの間に、11:00:00や11:59:00を読み出してしまう可能性がある)。

 こういったことを防ぐために、SW-C間I/Fでの取り扱いの際には、ひと固まりとして扱えるようにする(=アクセスにおける排他制御を、RTE以下に自動的に行わせるようにする)ための仕組み(RTEレベルではComposite Data Type、ComレベルではSignal Group)が用意されています。

 一方、SW-C内(RE間)I/Fでそれらのデータを更新する際には、同時に更新できるとは限りません。ほとんどの場合には段階的に更新していくわけですから、図1のような現象が起こらないように図2のような排他制御が必要となります。

図1 図1 排他制御が必要となる典型的な同期問題(1):ACID違反[クリックで拡大]
図2 図2 排他制御が必要となる典型的な同期問題(1):ACID違反への、排他制御による対処[クリックで拡大]

 また、SWS RTEで示されているようなLost Updateと呼ばれる同期問題(図3)でも同様な対処(図4)が必要になります※4)

図3 図3 排他制御が必要となる典型的な同期問題(2)Lost update[クリックで拡大]
図4 図4 排他制御が必要となる典型的な同期問題(2)Lost update への、排他制御による対処[クリックで拡大]

 Rte_Enter() APIで排他制御区間を開始し、Rte_Exit() APIで排他制御区間を終了する、というように、排他制御区間を明示する方法(canEnterExclusiveArea)とすることもできますし、また、当該REの処理の開始/終了を排他制御区間の開始/終了と併せて行う方法(runsInsideExclusiveArea)とすることもできます。なお、排他制御の実現手段は、RTEのconfigurationにより、RTOSのResource Mechanismや割り込み禁止/許可操作などが選択可能です。

※4)Theo Haerder and Andreas Reuter:Principles of transaction-oriented database recovery、https://doi.org/10.1145/289.291(1983-12)で示されたACID原則(ACID Principle)は、データベースなどのトランザクションシステムで満たすべき条件を示した、非常に古くからある設計原則ですが、組み込みシステムの排他制御でも有用です。以下のいずれかを満たさないなら、基本的には排他制御などの対処の検討が必要となります。なお、Lost Updateも、read-modify-writeというatomic操作の中間過程が見えてしまいconsistencyが損なわれることにより生じる同期問題ですので、ACID原則を満たしません。

1)Atomicity:不可分であること。言い換えると、そのアクセス処理の一部だけが実行されてしまわないこと(all-or-nothingであること:全て実行されるか、あるいはまったく実行されないか、のいずれか)
2)Consistency:処理の結果が、制約に対して一貫性を持つこと(処理結果が満たすべき条件に違反したような結果に到達しないこと) 例:エラー処理の後、処理結果として不正データ取得可能ならば、この条件を満たさない
3)Isolation:処理の中間過程が、外部からは観測できないこと ※)中間過程:処理内容によっては、部分的な書き換えや更新の過程が外部から見えてしまったとき、適切ではない状態になり得る
4)Durability:処理の結果が、永続すること(後のアクセスで、過去の状態に巻き戻ってしまわないこと)

2.1.2.5 RE間のTrigger:Internal Trigger

 SW-C間での処理の実行要求の手段として、C/S I/Fの他にもう一つ、Clientとの授受用引数/返値なしのExternal Triggerを紹介しました。

 それと同様なメカニズムを、SW-C内のRE間でも使えるようにしたのが、Internal Triggerです(API:Rte_IrTrigger())。例えば、連載第24回の「1.2.3 AUTOSAR RTEを使用する場合」でご紹介したRTE Eventの1つである初期化イベントInitEvent(I)や、時間イベントTimingEvent(T)による周期的なトリガーで起動されるREを、強制的に同一SW-C内のREからも追加でトリガーする手段として利用可能です(RTE EventのInternalTriggerOccurredEvent、ITO)。応答時間制約(デッドライン)の短い処理部分を割り込みレベルで実行し、時間制約に余裕のある残りの処理部分をタスクレベルで実行する、ということも可能です※5)

※5)AUTOSAR R19-11にて、Cat. 2 ISR(RTOS管理下の割り込みであり、RTOS Service APIを利用可能なもの)へのREの割り付けに正式対応しています。

Copyright © ITmedia, Inc. All Rights Reserved.