🚗

車載開発:AUTOSAR CLASSICの不揮発系モジュール概要

に公開

不揮発系もAUTOSAR CLASSICを実装するうえでよく弄るモジュールの一つと認識しています。
このモジュールはECUのシャットダウン時に必要な情報を保存したり、即時に書き込んだり、基本的にはNVMで担います。

この記事では、NVM関連の主要モジュール・API、書き込みの分類、冗長化、検証処理などについて簡単にまとめます。


関連モジュール

モジュール名 役割概要
NvM 不揮発メモリの読み書きを管理する中心モジュール
EA/FEE EEPROM or Flashへの実際のアクセスを担当する下位モジュール(MCU依存、ハードウェア抽象化)

基本的な書き込みのタイミングとAPI

基本はシャットダウン時に書き込むのが基本の認識です。どうしても即時で書き込む必要がある場合は即時書き込みを使うと認識しています。前者がWriteALL、後者がWriteBlockです。

1. NvM_WriteAll()

  • 全ブロックのうち、**変更フラグが立っているものだけ※**を書き込み。
  • 通常は シャットダウンシーケンス や周期的バックアップに用いる。

※** NvM_SetRamBlockStatus(BlockId, TRUE)**

  • 指定ブロックのRAMが変更されたことを通知。
  • WriteAll()の対象になるようNVMが内部状態を管理。

2. NvM_WriteBlock()

  • 特定のブロックのRAM内容を即時書き込みするAPI。
  • RAMの内容が変更されていなくても呼べば書き込まれる。
  • 通常はアプリ側でNVRAM変更後に明示的に呼ぶ。

    引用:AUTOSAR

即時書き込みと遅延書き込みの違い

即時に書けばいい、というものでもなく、マイコン系の不揮発(データフラッシュ、E2PROM等)は書き込み回数の制約で10年、20年の使用回数を考慮すると頻繁に書き込む場合は成立しない場合があります。

種別 API例 特徴
即時 NvM_WriteBlock() 呼び出し時点で即座に書き込み処理が走る(内部的には非同期)
遅延 SetRamBlockStatus() + WriteAll() 書き込みは明示的に WriteAll() で一括実行

NvM_WriteAll() と BswM(Basic Software Mode Manager)

  • 通常 NvM_WriteAll() はECUシャットダウン時に明示的に実行されます。
  • 多くの場合、BswMと連携して ECU_STATE_APP_SHUTDOWN などのモード遷移で自動発火します。
  • この流れで、変更済みRAM内容が永続化される。

書き込み後のデータ検証

  • NVMは**書き込み後に自動的に検証(Verify)**を行います。

    • 書き込んだ値を読み戻して比較し、失敗すればエラーコードで通知。
  • 検証に失敗した場合は再書き込みやフォールバックが実装によって行われる場合も。

冗長化と二重化サポート

  • AUTOSAR標準では**2重書き(冗長化)**までがサポート対象です。
  • 書き込み時には**2つの記憶領域(プライマリ/セカンダリ)**に交互または同時に書き込み。
  • 読み出し時は、1つ目のブロックが破損していれば2つ目を参照

この仕組みにより、書き込み途中の電源断でも安全性が高い構成が可能です。

読み出し (Read)について

基本はReadALLの認識です、readblock使うケースはあまりない印象。
常に最新がNVRAMに展開されている認識なので意識しないことがおおいかもしれないです。

NvM_ReadAll

  • 起動時に必ず実行される
  • 全ブロックを一括でインシャライズ

NvM_ReadBlock

  • 個別ブロックの読出し
  • 通常過程では使われないが、再読みしたい場合などに限定的に利用

まとめ

NVMもそれなりにややこしいので、全体像をざっくり書いてみました。

  • WriteBlock() は即時、SetRamBlockStatus() + WriteAll() は遅延保存方式。
  • 書き込み後は自動で検証処理が走る。
  • 標準で2重化による耐障害性が考慮されている。

Discussion