wiki:tips_abrex
ABREXの使い方


はじめに

  • AUTOSARでは、コンポーネント間のデータのやりとりにXMLを用いる(拡張子はarxml)
  • BSWのコンフィギュレーション情報もXMLで定義する
    • 基本的に人が読み書きすることは想定されておらず、ツールで生成するのが一般的である
  • BSW単体でコンフィギュレーションを行いたい場合や、BSWを開発する際にはパラメータを直接指定して、arxmlファイルを作成したいニーズがある
  • arxmlファイルを直接編集するのは効率的ではないので、簡略化したテキストデータからarxmlファイルを生成できるツールがあれば有用である
  • TOPPERSでは、AUTOSARのRTE、BSWの開発に際し、YAMLフォーマットで記述したデータを、arxmlファイルに変換するツールであるABREX(AUTOSAR BSW and RTE XML Generator)を使用している

入手方法

  • ABREXは、TOPPERS/ATK2に同梱されている
    • どのパッケージにも同梱されているので、ABREXを使用したいだけの場合は、どれか1つのATK2をダウンロードすればよい
    • ABREXもバージョンアップしているので、最新版を使用するのが望ましい
  • ATK2は、tar.gz形式で公開されているので、解凍ソフト等を使用して、解凍する
  • 解答したフォルダのutils\abrex\abrex.rbがABREXの実行スクリプトである

使い方

実行環境

  • ABREXはRubyスクリプトで開発されているので、Rubyの実行環境が必要となる
  • Cygwinに含まれる以下のバージョンのRubyで動作確認されている
    • ruby 1.9.3p327 (2012-11-10 revision 37606) [i386-cygwin]
  • Windows環境であれば、Ruby Installer for Windowsを使うと簡単にRubyの実行環境が構築できる

YAMLファイルの書き方

  • 最上位のレイヤがパッケージ名、その次がECUモジュール名となる
  • ECUモジュール名の下に該当モジュールに含まれるパラメータ名をキーとして、パラメータコンテナと値をハッシュ形式で記述する
    • 複数の同一パラメータを定義する場合は、キーをショートネームとして、パラメータの1つとしてDefinitionRefでパラメータ名を記述する
  • サブコンテナは、ハッシュをネストすることで表現する
  • コンテナへの参照は、YAMLファイルに定義したパッケージ名に従ってパスを記述する
  • YAMLファイルに記載しないarxmlファイル内の情報は固定値でABREXが生成する

OSの例

<変換前(YAMLファイル)>

Ecuc:
  Os:
    OsOS:
      OsStackMonitoring: true
      OsStatus: EXTENDED
      OsUseGetServiceId: true
      OsUseParameterAccess: true
      OsScalabilityClass: SC1
      OsHooks:
        OsErrorHook: false
        OsPostTaskHook: false
        OsPreTaskHook: false
        OsProtectionHook: false
        OsShutdownHook: false
        OsStartupHook: false
    TASK1:
      DefinitionRef: OsTask
      OsTaskActivation: 1
      OsTaskPriority: 10
      OsTaskSchedule: FULL
      OsTaskEventRef: /Os/Os/EVENT1
    EVENT1:
      DefinitionRef: OsEvent

<変換後(arxmlファイル)>

<?xml version="1.0" encoding="EUC-JP"?>
<AUTOSAR xmlns="http://autosar.org/schema/r4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org/schema/r4.0 AUTOSAR_4-0-3_STRICT.xsd">
	<AR-PACKAGES>
		<AR-PACKAGE>
			<SHORT-NAME>Ecuc</SHORT-NAME>
			<ELEMENTS>
				<ECUC-MODULE-CONFIGURATION-VALUES>
					<SHORT-NAME>Os</SHORT-NAME>
					<DEFINITION-REF DEST="ECUC-MODULE-DEF">/AUTOSAR/EcucDefs/Os</DEFINITION-REF>
					<ECUC-DEF-EDITION>4.2.0</ECUC-DEF-EDITION>
					<IMPLEMENTATION-CONFIG-VARIANT>VARIANT-PRE-COMPILE</IMPLEMENTATION-CONFIG-VARIANT>
					<CONTAINERS>
						<ECUC-CONTAINER-VALUE>
							<SHORT-NAME>OsOS</SHORT-NAME>
							<DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/EcucDefs/Os/OsOS</DEFINITION-REF>
							<PARAMETER-VALUES>
								<ECUC-NUMERICAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsStackMonitoring</DEFINITION-REF>
									<VALUE>true</VALUE>
								</ECUC-NUMERICAL-PARAM-VALUE>
								<ECUC-TEXTUAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsStatus</DEFINITION-REF>
									<VALUE>EXTENDED</VALUE>
								</ECUC-TEXTUAL-PARAM-VALUE>
								<ECUC-NUMERICAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsUseGetServiceId</DEFINITION-REF>
									<VALUE>true</VALUE>
								</ECUC-NUMERICAL-PARAM-VALUE>
								<ECUC-NUMERICAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsUseParameterAccess</DEFINITION-REF>
									<VALUE>true</VALUE>
								</ECUC-NUMERICAL-PARAM-VALUE>
								<ECUC-TEXTUAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsScalabilityClass</DEFINITION-REF>
									<VALUE>SC1</VALUE>
								</ECUC-TEXTUAL-PARAM-VALUE>
							</PARAMETER-VALUES>
							<SUB-CONTAINERS>
								<ECUC-CONTAINER-VALUE>
									<SHORT-NAME>OsHooks</SHORT-NAME>
									<DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks</DEFINITION-REF>
									<PARAMETER-VALUES>
										<ECUC-NUMERICAL-PARAM-VALUE>
											<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsErrorHook</DEFINITION-REF>
											<VALUE>false</VALUE>
										</ECUC-NUMERICAL-PARAM-VALUE>
										<ECUC-NUMERICAL-PARAM-VALUE>
											<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsPostTaskHook</DEFINITION-REF>
											<VALUE>false</VALUE>
										</ECUC-NUMERICAL-PARAM-VALUE>
										<ECUC-NUMERICAL-PARAM-VALUE>
											<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsPreTaskHook</DEFINITION-REF>
											<VALUE>false</VALUE>
										</ECUC-NUMERICAL-PARAM-VALUE>
										<ECUC-NUMERICAL-PARAM-VALUE>
											<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsProtectionHook</DEFINITION-REF>
											<VALUE>false</VALUE>
										</ECUC-NUMERICAL-PARAM-VALUE>
										<ECUC-NUMERICAL-PARAM-VALUE>
											<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsShutdownHook</DEFINITION-REF>
											<VALUE>false</VALUE>
										</ECUC-NUMERICAL-PARAM-VALUE>
										<ECUC-NUMERICAL-PARAM-VALUE>
											<DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsStartupHook</DEFINITION-REF>
											<VALUE>false</VALUE>
										</ECUC-NUMERICAL-PARAM-VALUE>
									</PARAMETER-VALUES>
								</ECUC-CONTAINER-VALUE>
							</SUB-CONTAINERS>
						</ECUC-CONTAINER-VALUE>
						<ECUC-CONTAINER-VALUE>
							<SHORT-NAME>TASK1</SHORT-NAME>
							<DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/EcucDefs/Os/OsTask</DEFINITION-REF>
							<PARAMETER-VALUES>
								<ECUC-NUMERICAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsTask/OsTaskActivation</DEFINITION-REF>
									<VALUE>1</VALUE>
								</ECUC-NUMERICAL-PARAM-VALUE>
								<ECUC-NUMERICAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsTask/OsTaskPriority</DEFINITION-REF>
									<VALUE>10</VALUE>
								</ECUC-NUMERICAL-PARAM-VALUE>
								<ECUC-TEXTUAL-PARAM-VALUE>
									<DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsTask/OsTaskSchedule</DEFINITION-REF>
									<VALUE>FULL</VALUE>
								</ECUC-TEXTUAL-PARAM-VALUE>
							</PARAMETER-VALUES>
							<REFERENCE-VALUES>
								<ECUC-REFERENCE-VALUE>
									<DEFINITION-REF DEST="ECUC-REFERENCE-DEF">/AUTOSAR/EcucDefs/Os/OsTask/OsTaskEventRef</DEFINITION-REF>
									<VALUE-REF DEST="ECUC-CONTAINER-VALUE">/Os/Os/EVENT1</VALUE-REF>
								</ECUC-REFERENCE-VALUE>
							</REFERENCE-VALUES>
						</ECUC-CONTAINER-VALUE>
						<ECUC-CONTAINER-VALUE>
							<SHORT-NAME>EVENT1</SHORT-NAME>
							<DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">/AUTOSAR/EcucDefs/Os/OsEvent</DEFINITION-REF>
						</ECUC-CONTAINER-VALUE>
					</CONTAINERS>
				</ECUC-MODULE-CONFIGURATION-VALUES>
			</ELEMENTS>
		</AR-PACKAGE>
	</AR-PACKAGES>
</AUTOSAR>

実行コマンド

  • 作成したYAMLファイルを引数として、abrex.rbを実行する
    $ ruby abrex.rb ./sample.yaml
    
  • 入力したYAMLファイルの情報に対応するarxmlファイルが、入力ファイル名の拡張子をarxmlに変更したファイルに出力される
    • 上記実行例の場合、sample.arxmlが出力される

コンテナ情報に関して

  • YAMLファイルに記載したパラメータが整数型かどうか等は、ABREXに同梱されているparam_info.yamlに定義されている
  • ABREXに同梱されているparam_info.yamlでは、TOPPERSプロジェクトから公開されているモジュールで使用するパラメータのみ定義されている
  • param_info.yamlに別のBSWのパラメータを定義したい場合、AUTOSARから公開されているECUコンフィギュレーションパラメータコンテナ情報ファイルを入力として、ABREXで作成することができる

param_info.yaml作成方法

  • ECUコンフィギュレーションパラメータコンテナ情報ファイル(AUTOSAR_MOD_ECUConfigurationParameters.arxml)を入手する
    • AUTOSAR公式サイトへアクセス:http://www.autosar.org
    • Specifications -> Release X.X -> Methodology and Templates -> Templates -> Standard Specifications -> AUTOSAR_MOD_ECUConfigurationParameters.zipをダウンロード
      • ABREX開発時に使用したのは、Release 4.0であり、これ以外のバージョンでは動作未確認である
    • 解凍すると"AUTOSAR_MOD_ECUConfigurationParameters.arxml"となる
  • パラメータ情報を作成したいBSWモジュール名をABREXソースコードに設定する
    • MakeParamInfoメソッド内の配列aTargetModuleに定義する
      # 読み込み対象モジュール
      aTargetModule = ["Rte", "Os", "Com", "PduR", "CanIf", "Can", "EcuC", "EcuM", "WdgM", "WdgIf", "Wdg", "Dem"]
      
  • ABREXに-pオプションを付けて実行する
    $ ruby abrex.rb -p AUTOSAR_MOD_ECUConfigurationParameters.arxml
    
    • 各パラメータコンテナのデータ型、外部参照型の参照先情報などが、param_info.yamlに出力される

注意事項

  • ABREXによるYAML→arxml変換実行時、param_info.yamlに含まれないキー名が登場した場合、エラー終了する
  • サブコンテナ名はparam_info.yamlに含まれず、YAMLファイルに記述した名称が正しいものとして、サブコンテナを生成する
  • 設定値の妥当性等のチェックは一切行わない

応用編

複数YAMLファイルの入力

  • 引数のYAMLファイルは複数指定することができ、すべてのYAMLファイルの情報をマージしたXMLファイルを生成する
  • 同じパスのコンテナが異なるファイルに存在する場合、1つのコンテナにマージする
  • 例えば、以下のa.yamlとb.yamlを入力した場合、MAIN_HW_COUNTERには両方のファイルに指定されたすべてのパラメータが設定されたarxmlファイルとなる
    • 同じパスのパラメータが複数のファイルに含まれる場合は、多重度が*と判断して、複数のコンテナを生成する(パラメータ毎の多重度情報は保持しない)

<a.yaml>

Ecuc:
  Os:
    MAIN_HW_COUNTER:
      DefinitionRef: OsCounter
      OsCounterMaxAllowedValue: 0x7FFFFFFF
      OsCounterTicksPerBase: 10
      OsCounterMinCycle: 4000
      OsCounterType: HARDWARE
      OsSecondsPerTick: 1.666666e-08
      OsCounterIsrRef: /Os/Os/ISR1

<b.yaml>

Ecuc:
  Os:
    MAIN_HW_COUNTER:
      OsCounterAccessingApplication: OSAP1

arxmlファイルからYAMLファイルを作成する(逆変換)

  • ABREXでは、作成済みのarxmlファイルから、YAMLファイルを作成することが出来る
  • -iオプションに、arxmlファイルを引数として与え、実行する
    $ ruby abrex.rb -i sample.arxml
    
  • 入力したXMLファイルの情報に対応するYAMLファイルが、入力ファイル名の拡張子をyamlに変更したファイルに出力される
    • 上記例の場合、sample.yaml
  • 逆変換において、複数のarxmlファイルを指定した場合は、入力されたarxmlファイル毎に、YAMLファイルを個別に出力する

出力するarxmlファイルでの整数、小数の表記

  • ABREXでは、Ruby標準のYAMLライブラリを使用して、YAMLファイルを読み込むが、整数、少数はそれぞれInteger、Floatクラスとして解釈される
  • この結果、以下のように、16進数表記で記述した整数は10進数表記で出力され、0に近い小数は指数表記で出力される

<入力するYAMLファイル>

Ecuc:
  Os:
    MAIN_HW_COUNTER:
      DefinitionRef: OsCounter
      OsCounterMaxAllowedValue: 0x7FFFFFFF
      OsSecondsPerTick: 0.00000001666666

<出力されるarxmlファイル>

<ECUC-NUMERICAL-PARAM-VALUE>
	<DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsCounter/OsCounterMaxAllowedValue</DEFINITION-REF>
	<VALUE>2147483647</VALUE>
</ECUC-NUMERICAL-PARAM-VALUE>
<ECUC-NUMERICAL-PARAM-VALUE>
	<DEFINITION-REF DEST="ECUC-FLOAT-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsCounter/OsSecondsPerTick</DEFINITION-REF>
	<VALUE>1.666666e-08</VALUE>
</ECUC-NUMERICAL-PARAM-VALUE>
  • この現象を回避し、YAMLにファイルに書いた通りに出力したい場合は、以下のように文字列として記述する

<入力するYAMLファイル>

Ecuc:
  Os:
    MAIN_HW_COUNTER:
      DefinitionRef: OsCounter
      OsCounterMaxAllowedValue: "0x7FFFFFFF"
      OsSecondsPerTick: "0.00000001666666"

<出力されるarxmlファイル>

<ECUC-NUMERICAL-PARAM-VALUE>
	<DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsCounter/OsCounterMaxAllowedValue</DEFINITION-REF>
	<VALUE>0x7FFFFFFF</VALUE>
</ECUC-NUMERICAL-PARAM-VALUE>
<ECUC-NUMERICAL-PARAM-VALUE>
	<DEFINITION-REF DEST="ECUC-FLOAT-PARAM-DEF">/AUTOSAR/EcucDefs/Os/OsCounter/OsSecondsPerTick</DEFINITION-REF>
	<VALUE>0.00000001666666</VALUE>
</ECUC-NUMERICAL-PARAM-VALUE>
Last modified 2 years ago Last modified on 03/09/15 15:18:44