ABREXの使い方
Table of Contents
はじめに
- 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
でパラメータ名を記述する
- 複数の同一パラメータを定義する場合は,キーをショートネームとして,パラメータの1つとして
- サブコンテナは,ハッシュをネストすることで表現する
- コンテナへの参照は,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_MOD_ECUConfigurationParameters.zipに入っている
- ABREX開発時に使用したのは,
Release 4.0
であり,これ以外のバージョンでは動作未確認である
- パラメータ情報を作成したい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
19 months ago
Last modified on Dec 8, 2022, 10:16:56 AM
Note:
See TracWiki
for help on using the wiki.