AUTOSARには、電子制御ユニット(ECU)の共通の基本機能を実現する部分として約100個のBSW(Basic Software)が規定されており、各BSWは対象とするECUに応じて、様々な設定(コンフィギュレーション)が可能となっています。今回は、このBSWのコンフィギュレーションの仕組みについて紹介します。

BSWのジェネレータ

各BSWはジェネレータを付属しています。ジェネレータが、コンフィギュレーションに応じたコードを生成しBSWのコードとリンクすることで、ユーザの設定に応じた振舞いを実現します。分かりやすい例ですと、OS(Operating System)の場合、必要なタスクの数やタスクごとの優先度などを定義して、OSのジェネレータへ入力することで、必要なタスクを使用可能なソースコードが生成されます。

このジェネレータへの入力情報はXML形式(※1)としてAUTOSARで標準化されており、「Specification of ECU Configuration」(※2)に規定されています。

※1 AUTOSARでは拡張子を.arxmlとしています。
※2 https://www.autosar.org/fileadmin/user_upload/standards/classic/4-2/AUTOSAR_TPS_ECUConfiguration.pdf (以後、ECUC仕様)

BSWのコンフィギュレーション EcucDefsとEcucVals

BSWのコンフィギュレーションは、値を設定する「パラメータ」と、複数のパラメータをグループにまとめる「コンテナ」で構成されます。コンテナはネストすることもあります。

OSの例ですと、使用するタスクの定義においては、必要なタスクの数だけ「OsTask」というコンテナを定義し、各OsTaskコンテナの中で、タスクの優先度(OsTaskPriority)やスケジューリングポリシー(OsTaskSchedule)といったパラメータを定義するわけです。

また、各OsTaskコンテナの中には、OS起動時のタスク起動に関する設定を行うサブコンテナ(OsTaskAutostart)を定義することもできます。こういったBSWのコンフィギュレーションに関して、ECUC仕様では以下2つのメタモデルを規定しています。

・ECU Configuration Parameter Definition (EcucDefs)
・ECU Configuration Values (EcucVals)

EcucDefsは、各BSWで設定可能なコンテナおよびパラメータについて規定しています。コンテナとパラメータは、多くの種類や属性を持っており、それぞれの特徴に応じて細かな定義が可能です。EcucValsは、EcucDefsに基づいて、実際に使用するコンテナとパラメータを定義する方法を規定しています。それぞれを詳しく見ていきましょう。

EcucDefs

AUTOSARから公開されている各BSWの仕様書に記載されたコンテナ/パラメータ情報については、対応するEcucDefsも以下からダウンロードできます。

https://www.autosar.org/fileadmin/user_upload/standards/classic/4-2/AUTOSAR_MOD_ECUConfigurationParameters.zip
(zipに含まれるAUTOSAR_MOD_ECUConfigurationParameters.arxmlがEcucDefsです)

以下は、OsTaskPriority部分の抜粋です。

  1:<ECUC-MODULE-DEF UUID="ECUC:8f6994a0-a4c8-48b9-bede-db9a5b9c2474">
  2:   <SHORT-NAME>Os</SHORT-NAME>
  3:     :
  4:   <SUPPORTED-CONFIG-VARIANTS>
  5:      <SUPPORTED-CONFIG-VARIANT>VARIANT-PRE-COMPILE</SUPPORTED-CONFIG-VARIANT>
  6:   </SUPPORTED-CONFIG-VARIANTS>
  7:   <CONTAINERS>
  8:      <ECUC-PARAM-CONF-CONTAINER-DEF UUID="ECUC:f9cd89d3-97e4-4f05-ad16-d8f577b726d0">
  9:         <SHORT-NAME>OsTask</SHORT-NAME>
 10:           :
 11:         <RELATED-TRACE-ITEM-REF DEST="TRACEABLE">ECUC_Os_00073</RELATED-TRACE-ITEM-REF>
 12:         <LOWER-MULTIPLICITY>0</LOWER-MULTIPLICITY>
 13:         <UPPER-MULTIPLICITY-INFINITE>true</UPPER-MULTIPLICITY-INFINITE>
 14:         <PARAMETERS>
 15:              :
 16:            <ECUC-INTEGER-PARAM-DEF UUID="ECUC:61428e85-21e3-4df8-980f-9a985a02ede4">
 17:               <SHORT-NAME>OsTaskPriority</SHORT-NAME>
 18:                 :
 19:               <LOWER-MULTIPLICITY>1</LOWER-MULTIPLICITY>
 20:               <UPPER-MULTIPLICITY>1</UPPER-MULTIPLICITY>
 21:               <SCOPE>LOCAL</SCOPE>
 22:               <ORIGIN>AUTOSAR_ECUC</ORIGIN>
 23:               <POST-BUILD-VARIANT-VALUE>false</POST-BUILD-VARIANT-VALUE>
 24:               <VALUE-CONFIG-CLASSES>
 25:                  <ECUC-VALUE-CONFIGURATION-CLASS>
 26:                     <CONFIG-CLASS>PRE-COMPILE</CONFIG-CLASS>
 27:                     <CONFIG-VARIANT>VARIANT-PRE-COMPILE</CONFIG-VARIANT>
 28:                  </ECUC-VALUE-CONFIGURATION-CLASS>
 29:               </VALUE-CONFIG-CLASSES>
 30:               <SYMBOLIC-NAME-VALUE>false</SYMBOLIC-NAME-VALUE>
 31:               <MAX>4294967295</MAX>
 32:               <MIN>0</MIN>
 33:            </ECUC-INTEGER-PARAM-DEF>

まず1行目から、「Os」というモジュールに対する定義(ECUC-MODULE-DEF)が始まります。8行目( ECUC-PARAM-CONF-CONTAINER-DEF)で、Osには「OsTask」というコンテナが含まれること、12、13行目ではOsTaskを設定可能な数(MULTIPLICITY/多重度)は0~上限なしと定義されています。

16行目 (ECUC-INTEGER-PARAM-DEF)で、OsTaskコンテナには、「OsTaskPriority」というパラメータが含まれること、19、20行目ではOsTaskPriorityの多重度は1~1(つまり1つだけ設定することが必須)と定義されています。また、31、32行目では、OsTaskPriorityに設定可能な値は、0~4294967295(=0xffffffff)であるといったことも定義されています。このように、各コンテナ/パラメータに関する詳細な情報が、BSWごとに定義されています。

※各BSWのコンテナ/パラメータの情報は、BSWごとの仕様書の10章「Configuration Specification」にも記載されています。

ベンダ独自コンテナ/パラメータ

前述のAUTOSAR_MOD_ECUConfigurationParameters.arxmlは、あくまでAUTOSARで規定されたコンテナ/パラメータのみが定義されています。BSWを開発するベンダでは、設計や実装時に必要となったコンテナ/パラメータを独自に規定して追加することが一般的です。

例えば、AUTOSARのOsTaskには、タスクが使用するスタックサイズを指定するパラメータが規定されていません。しかし、通常、タスクが必要とするスタックサイズはユーザが決定するものですので、「OsTaskStackSize」(※3)といった独自パラメータが追加されます。

※3 【参考】独自パラメータ「OsTaskStackSize」追加の例
・TOPPERS/ATK2: https://www.toppers.jp/docs/tech/ATK2-0010_ATK2_spec_122.pdf#page=284
・ルネサスエレクトロニクス社/RV850:https://www.renesas.com/jp/ja/doc/products/tool/doc/007/r20ut2768jj0120-rv850.pdf#page=223

EcucDefsが定義されたarxmlファイルは、各AUTOSARツールにインポートすることで、GUI上で各コンテナ/パラメータを定義するといった使い方が可能です。ベンダごとの独自コンテナ/パラメータを追加したとしても、ベンダごとにEcucDefsを用意すれば、同様の使い方が可能となります。

コンテナ/パラメータの種類、属性

以下にEcucDefsにおけるコンテナ/パラメータの種類や属性をいくつか紹介します。

Choice Container

Choice Containerは、コンテナの種類の1つで、サブコンテナを1つのみ選択するコンテナです。例として、OsモジュールのOsAlarmActionがあります。OsAlarmActionは、予め設定した時間を経過した際にアラームが行うアクションを設定するコンテナですが、以下の4つの中から1つのみサブコンテナを設定します。

・OsAlarmActivateTask
・OsAlarmCallback
・OsAlarmIncrementCounter
・OsAlarmSetEvent

EcucDefsをインポートしたGUIツール上では、上記4つから1つのみを選択できる設定画面となることが期待されます。ジェネレータとしては、1つのサブコンテナのみが設定されている前提で開発することができます。

requiresIndex

requiresIndexは、コンテナ/パラメータに付与される属性の1つです。コンテナ/パラメータによっては、設定する順序に意味を持つことがありますが、XML形式である都合上、arxmlファイル内の記載順序では、設定順序が保証されない可能性があります。

例えば、Dem(Diagnostic Event Manager)のDemDidDataElementClassRefというパラメータは、requiresIndexがtrueと規定されています。DemDidDataElementClassRefは、多重度が1~255で、DIDというデータのグループに含めるDataElementを設定するパラメータです。

1つのDIDに最大255個までのDataElementを含めることができますが、どの順序でDataElementをDID内に並べるかも規定する必要があります。requiresIndexがtrueと規定されたパラメータにおいては、EcucVals側で順序を示す情報(後述)も定義が必要です。

ただし、順序が必要となるすべてのパラメータにrequiresIndex属性が付与されているわけではありません。 OsのIOC(Inter OS-Application Communicator)というデータを送受信する機能において、複数のデータを送受信する場合、送受信APIの引数の順序を設定する必要があります。しかし、送受信するデータを設定するOsIocDataPropertiesというコンテナにはrequiresIndex属性が付与されておらず、OsIocDataPropertyIndexというパラメータを用いて順序を決める仕様となっています。この辺りは、各BSWの仕様担当者のEcucDefsに対する理解や考え方の違いにより、統一されていないものと思われます。

regularExpression

regularExpressionは、パラメータに付与される属性の1つです。文字列を設定するパラメータにおいて、設定値として有効とする文字列をチェックする正規表現を定義できます。

例えば、DemのDemHeaderFileInclusionというパラメータは、regularExpressionが「[a-zA-Z0-9_]([a-zA-Z0-9._])*」と定義されています。DemHeaderFileInclusionは、Demモジュールからインクルードするユーザ定義のヘッダファイル名を指定するパラメータで、ヘッダファイル名として取りうる文字列を正規表現で定義しています。ただし、他のモジュールの同様のパラメータにおいては、regularExpressionが定義されていないこともあり、この辺りも統一はされていません。

EcucVals

以下は、AUTOSARから公開されているOsモジュールのEcucDefsに対して、TASK1というタスクを設定したEcucValsの例です。

  1:<ECUC-MODULE-CONFIGURATION-VALUES>
  2:    <SHORT-NAME>Os</SHORT-NAME>
  3:    <DEFINITION-REF DEST="ECUC-MODULE-DEF">/AUTOSAR/EcucDefs/Os</DEFINITION-REF>
  4:    <ECUC-DEF-EDITION>4.2.2</ECUC-DEF-EDITION>
  5:    <IMPLEMENTATION-CONFIG-VARIANT>VARIANT-PRE-COMPILE</IMPLEMENTATION-CONFIG-VARIANT>
  6:    <CONTAINERS>
  7:        <ECUC-CONTAINER-VALUE>
  8:            <SHORT-NAME>TASK1</SHORT-NAME>
  9:            <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/EcucDefs/Os/OsTask</DEFINITION-REF>
 10:            <PARAMETER-VALUES>
 11:                <ECUC-NUMERICAL-PARAM-VALUE>
 12:                    <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsTask/OsTaskPriority</DEFINITION-REF>
 13:                    <VALUE>7</VALUE>
 14:                </ECUC-NUMERICAL-PARAM-VALUE>

まず、1行目から「Os」というモジュールに対するEcucValsの定義が始まります。3行目の「/AUTOSAR/EcucDefs/Os」が、EcucDefsのOsモジュールに対する定義であることを示しています。7行目から「TASK1」という名前(<SHORT-NAME>)でOsTaskコンテナを定義し、OsTaskPriorityを"7"に設定しています。 <DEFINITION-REF>タグにより、対応するEcucValsのコンテナ/パラメータを参照しています。この辺りのXMLタグの構成は、対象パラメータの型(整数、文字列、浮動小数点など)などに応じて変わりますのでご注意ください。

上記のように、EcucDefsに従って用途に応じた設定を行い、作成したEcucVals(arxml)を、対象BSWのジェネレータへ入力することで、目的の振舞いをするコードを生成します。

※通常arxmlファイルをユーザが直接作成することはなく、AUTOSARツールを用いてGUIベースで設定するのが一般的です。

requiresIndex

requiresIndex属性を持つパラメータに対しては、以下12、17、22行目のように<INDEX >タグを設定することで、順序を決定します。

  1:<ECUC-CONTAINER-VALUE>
  2:    <SHORT-NAME>DID1</SHORT-NAME>
  3:    <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/EcucDefs/Dem/DemGeneral/DemDidClass</DEFINITION-REF>
  4:    <PARAMETER-VALUES>
  5:        <ECUC-NUMERICAL-PARAM-VALUE>
  6:            <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR/EcucDefs/Dem/DemGeneral/DemDidClass/DemDidIdentifier</DEFINITION-REF>
  7:            <VALUE>1</VALUE>
  8:        </ECUC-NUMERICAL-PARAM-VALUE>
  9:    </PARAMETER-VALUES>
 10:    <REFERENCE-VALUES>
 11:        <ECUC-REFERENCE-VALUE>
 12:            <INDEX>0</INDEX>
 13:            <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/AUTOSAR/EcucDefs/Dem/DemGeneral/DemDidClass/DemDidDataElementClassRef</DEFINITION-REF>
 14:            <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/EcucVals/Dem/DemGeneral/DataElement1</VALUE-REF>
 15:        </ECUC-REFERENCE-VALUE>
 16:        <ECUC-REFERENCE-VALUE>
 17:            <INDEX>1</INDEX>
 18:            <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/AUTOSAR/EcucDefs/Dem/DemGeneral/DemDidClass/DemDidDataElementClassRef</DEFINITION-REF>
 19:            <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/EcucVals/Dem/DemGeneral/DataElement2</VALUE-REF>
 20:        </ECUC-REFERENCE-VALUE>
 21:        <ECUC-REFERENCE-VALUE>
 22:            <INDEX>2</INDEX>
 23:            <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/AUTOSAR/EcucDefs/Dem/DemGeneral/DemDidClass/DemDidDataElementClassRef</DEFINITION-REF>
 24:            <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/EcucVals/Dem/DemGeneral/DataElement3</VALUE-REF>
 25:        </ECUC-REFERENCE-VALUE>
 26:    </REFERENCE-VALUES>
 27:</ECUC-CONTAINER-VALUE>

なお、requiresIndex属性の連番や重複に関する制約については規定されていませんので、<INDEX>の不正な設定値に対する振舞いは、ジェネレータの実装依存となります。

※AUTOSAR_MOD_ECUConfigurationParameters.arxmlでは、パッケージ名の構成が「/AUTOSAR/EcucDefs」となっていますが、これはAUTOSARの標準仕様におけるパッケージ名です。本稿で例示したEcucValsでは、<DEFINITION-REF>の参照先が「/AUTOSAR/EcucDefs/…」となっていますが、ECUC仕様では、ベンダごとに提供するEcucDefsでは、パッケージ名の構成を変更することが規定されています。

以上のように、標準化したXML(arxml)を用いて定義したEcucDefs、EcucValsにより、ツール等を使用し、共通的な手段でBSWのコンフィギュレーションを行うことが可能となります。

 

鴫原 一人博士(情報科学)
鴫原 一人(Kazuto Shigihara)

ASI事業部
次長 / エグゼクティブフェロー

この記事を読んだ人はこちらの記事も読んでいます。