チームの皆さん、こんにちは。
私たちは NXP S32K588 をAUTOSARベースのプログラムで使用しており、 ETAS OS と EB MCALを組み合わせています。
いくつかのMCALコンポーネントは、タイムアウト方法を以下のいずれかに設定できるタイムアウト機構を提供しています:
タイムアウト方法が OSIF_COUNTER_SYSTEMに設定されている場合、影響を受けるドライバーは初期化シーケンス中にOsIf_GetCounter()を通じてOSIFカウンターにアクセスしようとします。
これらのドライバー初期化関数は EcuM_Init()から呼び出されるため、AUTOSAR OSは以下の方法でエラーを報告します:
エラーフック => E_OS_CALLEVEL
私たちの理解では、これはAUTOSAR OSカウンターAPIは タスク や ISRなどの有効なOSコンテキストからのみアクセスが許可されているのに対し、EcuM_Init()はOSスケジューラが起動する前に実行されるためです。
この状況に対処するための推奨されるアプローチについてアドバイスをいただけますか?具体的には:
こんにちは、
ありがとうございます。SW/RTDチームに追加のフィードバックがあれば聞いてみます。
BR、ペトル
こんにちは、
あなたの分析は正しいようです。OSIF_COUNTER_SYSTEMで設定されたドライバがOS起動前にEcuM_Init()から初期化されている場合、AUTOSAR OSの実装によってOsIf_GetCounter E_OS_CALLEVELが発生することがあります。
OS起動前の段階で初期化されるモジュールの場合、一般的な回避策は、OSベースのタイミングサービスの使用を避け、代わりにOSIF_COUNTER_DUMMY(または別のOS以外のタイミングソース)を使用することです。
具体的な推奨事項は、ETAS OSの実装方法や使用しているMCAL/RTDのバージョンによっても異なる場合があります。さらなる検証のためにS32DSとRTD(またはMCAL)バージョンを共有していただけませんか?
BR、ペトル
こんにちは、
RTDチームからのフィードバックは以下をご覧ください。
BR、ペトル
このタイムアウト構成(OSIF_COUNTER_SYSTEM / OSIF_COUNTER_DUMMY)はNXPベンダー固有のものであり、AUTOSAR標準自体で定義されていません。
E_OS_CALLEVELエラーの根本原因は、OSIF_COUNTER_SYSTEMが内部的にOSカウンタAPIを呼び出すことですが、これらのAPIはStartOS()が呼び出された後にのみ有効になります。EcuM_Init()はStartOS()より先に実行されるため、この段階でOSのAPIを呼び出すことはAUTOSAR OSの呼び出しレベルルールに違反します。
推奨される解決策:
EcuM_Init()(OSフェーズ前)から初期化されたすべてのMCALドライバーについては、タイムアウトメソッドを次のように設定してください。
OSIF_COUNTER_DUMMYはOS APIを呼び出さず、OS以前のコンテキストで安全に使用できます。