{{{ #!html
ABREXの使い方
}}} [[PageOutline(1-2, Table of Contents, pullout)]] [[BR]] = はじめに = * AUTOSARでは,コンポーネント間のデータのやりとりにXMLを用いる(拡張子はarxml) * BSWのコンフィギュレーション情報もXMLで定義する * 基本的に人が読み書きすることは想定されておらず,ツールで生成するのが一般的である * BSW単体でコンフィギュレーションを行いたい場合や,BSWを開発する際にはパラメータを直接指定して,arxmlファイルを作成したいニーズがある * arxmlファイルを直接編集するのは効率的ではないので,簡略化したテキストデータからarxmlファイルを生成できるツールがあれば有用である * TOPPERSでは,AUTOSARのRTE,BSWの開発に際し,[https://ja.wikipedia.org/wiki/YAML YAML]フォーマットで記述したデータを,arxmlファイルに変換するツールであるABREX(AUTOSAR BSW and RTE XML Generator)を使用している ---- = 入手方法 = * ABREXは,[https://www.toppers.jp/atk2-download.html TOPPERS/ATK2]に同梱されている * どのパッケージにも同梱されているので,ABREXを使用したいだけの場合は,どれか1つのATK2をダウンロードすればよい * ABREXもバージョンアップしているので,最新版を使用するのが望ましい * ATK2は,tar.gz形式で公開されているので,解凍ソフト等を使用して,解凍する * 解答したフォルダの{{{utils\abrex\abrex.rb}}}がABREXの実行スクリプトである ---- = 使い方 = == 実行環境 == * ABREXはRubyスクリプトで開発されているので,Rubyの実行環境が必要となる * [https://www.cygwin.com/ Cygwin]に含まれる以下のバージョンのRubyで動作確認されている * {{{ruby 1.9.3p327 (2012-11-10 revision 37606) [i386-cygwin]}}} * Windows環境であれば,[https://rubyinstaller.org/ 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ファイル)> {{{ Ecuc Os /AUTOSAR/EcucDefs/Os 4.2.0 VARIANT-PRE-COMPILE OsOS /AUTOSAR/EcucDefs/Os/OsOS /AUTOSAR/EcucDefs/Os/OsOS/OsStackMonitoring true /AUTOSAR/EcucDefs/Os/OsOS/OsStatus EXTENDED /AUTOSAR/EcucDefs/Os/OsOS/OsUseGetServiceId true /AUTOSAR/EcucDefs/Os/OsOS/OsUseParameterAccess true /AUTOSAR/EcucDefs/Os/OsOS/OsScalabilityClass SC1 OsHooks /AUTOSAR/EcucDefs/Os/OsOS/OsHooks /AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsErrorHook false /AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsPostTaskHook false /AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsPreTaskHook false /AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsProtectionHook false /AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsShutdownHook false /AUTOSAR/EcucDefs/Os/OsOS/OsHooks/OsStartupHook false TASK1 /AUTOSAR/EcucDefs/Os/OsTask /AUTOSAR/EcucDefs/Os/OsTask/OsTaskActivation 1 /AUTOSAR/EcucDefs/Os/OsTask/OsTaskPriority 10 /AUTOSAR/EcucDefs/Os/OsTask/OsTaskSchedule FULL /AUTOSAR/EcucDefs/Os/OsTask/OsTaskEventRef /Os/Os/EVENT1 EVENT1 /AUTOSAR/EcucDefs/Os/OsEvent }}} == 実行コマンド == * 作成した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)を入手する * [https://www.autosar.org/fileadmin/standards/classic/4-0/AUTOSAR_MOD_ECUConfigurationParameters.zip 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ファイル> {{{ /AUTOSAR/EcucDefs/Os/OsCounter/OsCounterMaxAllowedValue 2147483647 /AUTOSAR/EcucDefs/Os/OsCounter/OsSecondsPerTick 1.666666e-08 }}} * この現象を回避し,YAMLにファイルに書いた通りに出力したい場合は,以下のように文字列として記述する <入力するYAMLファイル> {{{ Ecuc: Os: MAIN_HW_COUNTER: DefinitionRef: OsCounter OsCounterMaxAllowedValue: "0x7FFFFFFF" OsSecondsPerTick: "0.00000001666666" }}} <出力されるarxmlファイル> {{{ /AUTOSAR/EcucDefs/Os/OsCounter/OsCounterMaxAllowedValue 0x7FFFFFFF /AUTOSAR/EcucDefs/Os/OsCounter/OsSecondsPerTick 0.00000001666666 }}}