こんにちは、チームの皆さん
リアは次のことを尋ねています。
-------------------------------------------------------------------------------------
シングルコア ECU (S32K311) にマルチパーティショニングを実装していますが、SPI ドライバの初期化中に問題が発生しました。
観察:
SPI ドライバは、OsIf_timer.c から OsIf_GetPartitionID() を呼び出して現在のパーティション ID を取得し、それを SpiID として使用します。ただし、両方が同じ ECUC パーティション用に構成されているにもかかわらず、この ID は SpiCorePartitionUse の値と一致しません。この不一致のため、ドライバは DET エラーをトリガーし、ペリフェラルの初期化に失敗します。
デバッグ中に発見されたこと:
関数 OsIf_apxMultiPartitionPredefinedConfig は、SPI ドライバが予期しない値を返します。これが不一致の原因となっているようです。
初期分析では、この問題は Vector DaVinci/Tresos ツールからの構成生成に関連している可能性があることが示唆されています。
インパクト
SPI 初期化はマルチパーティション モードでは完了できず、通信機能がブロックされます。
-------------------------------------------------------------------------------------
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
OsIf_apxMultiPartitionPredefinedConfig について言及されている SO、ASR OS を使用していると想定します。
では、この場合、関数 GetApplicationID() からどのような値が返されるのでしょうか?
EcuC、Os、Spi、BaseNXP を含む構成を送ってください。
次の構造の出力が生成されました:
どのような SW パッケージを使用していますか?
よろしくお願いいたします。
ニ
こんにちは、 Nhi_Nguyenさん
添付ファイルが十分かどうかお知らせください。
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
関数 SPI_Init() の次のパラメータの読み取りを手伝ってください。
- スピイド?
- Spi_Init() 関数にどのような構成を渡しましたか?
このようになります:
よろしくお願いいたします。
ニ
こんにちは、 Nhi_Nguyenさん
リアは答えた。
Spi_Init(&Spi_Config_EcucPartition_C0_B);
これは Init 関数で渡されたもので、SPI_ID はパーティション ID API から読み取られますが、OS アプリケーション ID に正しくリンクされていません。
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
これは彼らのアプリケーション内の OS です:
Spi_Config_EcucPartition_C0_B を Spi_Init() に渡したので、SPI_ID は次の値にする必要があります。
このCASE、Det エラーが発生しないようにするには、u32AppId を 1 にする必要があります。ただし、関数 OS_GetApplicationID() は RTD ではなく RTOS に属しているため、誰かが取得できるように RTOS にタグを付けてください。
よろしくお願いいたします。
ニ
こんにちは、 Nhi_Nguyenさん
以下はリアの返答です:
このCASE、SPI ID と OS アプリケーションが一致しません。ASIL の場合、1 を返す必要があると考えられますが、0 を返すことで構成の不一致が発生します。以下のスナップショットを確認してください。
ご希望であれば、短いミーティングを行って詳細をご説明することもCANです。
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
RTOS がどのように動作するのか、または RTOS の関数 GetCurrentApplicationID() から値がどのように返されるのか分かりません。ただし、u32AppID = 0 を現在の状態に保ち、Det エラーを回避したい場合は、以下のようにCANできます。
生成されるファイルは次のようになります。
つまり、u32AppId = 0 の場合、SpiID = 0 となります。
u32AppId = 1、SpiID = 1;
SPI では、生成されるファイルは次のようになります。
これは、Spi_Config_EcucPartition_C0_QM->u32SpiCorePartitionUse = 1; を意味します。
Spi_Config_EcucPartition_C0_B->u32SpiCorePartitionUse = 0;
別のCASEでは、u32AppID を別の値に変更したいので、@StefanoGattazzo さん、RTOS タグを追加して、RTD タグを削除してください。RTOS の誰かがCAN手伝ってくれます。
よろしくお願いいたします。
ニ
こんにちは、 Nhi_Nguyenさん
もし誰か知っている人がいたら、直接尋ねてもCANですが、今は緊急です。
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
RTD を削除してください。RTOS タグを追加したことを確認しました。このチームの誰かが回答します。
よろしくお願いいたします。
ニ
こんにちは、 Nhi_Nguyenさん
誰にCANで聞けばいいですか?
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
申し訳ありませんが、これについてはアイデアがありません。
よろしくお願いいたします。
ニ
こんにちは、チームの皆さん
リアはこう書いています。
いいえ、NXP OS ではなくベクター OS を使用しています。OsIf 参照は Base コンポーネントからのものです。
現在、LPSPI2 を QM アプリケーション専用にし、残りの LPSPI モジュールを ASIL B アプリケーション用として SPI ドライバを分割する POC に取り組んでいます。
RTD ユーザー マニュアルによれば、パーティションごとに 2 つの個別の Spi_Init() 呼び出しを呼び出す必要があります。SO、最初に ASIL B OS アプリケーションから Spi_Init() 関数を呼び出し、次に QM OS アプリケーションからそれぞれに正しい構成ポインターを渡して呼び出します。
Spi_Init()関数ではSpi_GetID()が呼び出され、それがGetCurrentApplicationID()を呼び出していることがわかります(下のスクリーンショット)。
以下は、Os によって生成された列挙型です。ASIL B OS アプリケーションが GetCurrentApplicationID() を呼び出すと 0 を返します。QM OS アプリケーションが GetCurrentApplicationID() を呼び出すと 1 を返します。
OsIf_GetPartitionID では、Os によって返された値を使用して、配列 OsIf_apxMultiPartitionPredefinedConfig で構成されているパーティション番号を取得します。
OsIf_apxMultiPartitionPredefinedConfigの値は以下のとおりです。
QM アプリケーションが Spi_Init() を呼び出すと、Spi_GetID() は 1 の値を返します (GetCurrentApplicationID() は 1 を返し、OsIf_apxMultiPartitionPredefinedConfig のインデックス 1 も 1 です)。
しかし、生成された SPI 構成には期待された値がないため、Det にエラーが報告されます。
Spi_Config および OsIf_apxMultiPartitionPredefinedConfig の MCAL によって生成される値に影響を与えるものは何ですか?
BR
ステファノ
こんにちは、 @StefanoGattazzo さん、
添付のプロジェクトから取得した Spi、Ecu、Os の構成は次のとおりです。
EcuC はパーティション ID を定義するために使用されます。たとえば、その構成では、QM はパーティション 0、C0_B はパーティション 1、システムはパーティション 2 です。
Spi、Os は、EcuC からパーティション ID を取得するパーティションを選択します。例えば:
SPI: C0_B はパーティション 1、C0_M はパーティション 0 です。
OS: 構造体 OsIf_apxMultiPartitionPredefinedConfig も EcuC のパーティション ID を参照します。たとえば、次の構成になります。
アプリケーション 0 - システム - パーティション 2;
アプリケーション 1 - C0_B - パーティション 1;
アプリケーション2 - C0_M - パーティション0;
SO、C0_B を Spi_Init() に渡す場合、これはパーティション 1 を Spi_Init() に渡すことを意味し、OsIf_apxMultiPartitionPredefinedConfig[x] = 1; または x = 1; (x = GetCurrentApplicationID();) となります。
SO、彼らが最新の返信で示した写真を見てみましょう。
Spi では、C0_B はパーティション 1 です。
C0_M はパーティション 2 です。
つまり、EcuC では、インデックス 0 はシステム パーティション、インデックス 1 は C0_B パーティション、インデックス 2 は構成に適合しない C0_M パーティションがここに接続されています。
とにかく、上記の Os、Spi、EcuC の定義に基づいて、パーティション構成を調整し、Det エラーを回避できます。
よろしくお願いいたします。
ニ