S32K311 MCU と MC33774A AFE を使用して FreeRTOS BMS アプリケーションを作成しています。AFE との通信は、割り込みモードの直接 SPI ドライバを介して行われます。
それに加えて、車載と充電器との通信に割り込みモードで CAN ポートを使用しています。いずれかのポートで100ms未満の間隔でCANデータを送信すると、コードは停止します。
CAN ISRは次のようになります
何が問題なのか、そしてどのように対処すべきか
CAN ISR の優先度を SPI よりも低く設定すると、問題は解決しました。現在、MCU は停止しておらず、CAN タスクはデータ損失なしで実行されています。
こんにちは、
CAN 負荷が高いために SPI がブロックされている場合、CAN ISR が CPU 時間を過剰に消費しているか、他の割り込み (特に割り込み駆動型の SPI) が不足していることを意味している可能性があります。これにより、SPI トランザクションが完了せず、TD_Wait() 関数がポーリング ループから抜け出せなくなるCANがあります。
CAN ISR の優先度が高すぎるため、SPI ISR の実行が妨げられている可能性があります。
SPI のブロックを解除する解決策としては、CAN 割り込み優先度を下げ、SPI よりも低く、configMAX_SYSCALL_INTERRUPT_PRIORITY よりも低く設定することが考えられます。
これにより、SPI ISR は必要に応じて CAN ISR をプリエンプトできるようになります。
以下にいくつかの追加のヒントを示します...
- CAN ISR負荷を軽減
CAN ISR で行われる作業を最小限に抑えます。ログ記録とプロセッシングをキュー経由で FreeRTOS タスクに移動します。
- SPIにDMAを使用する
アプリでサポートされている場合は、SPI を DMA モードに切り替えて ISR への依存を減らし、スループットを向上させます。
- TD_Wait() にタイムアウトを追加する
タイムアウトを追加するか、FreeRTOS 同期 (セマフォなど) を使用することで、無限ブロックを防止します。
- ISR実行時間のプロファイル
ロジック アナライザーまたは MCU トレース ツールを使用して、ISR 期間を測定し、ボトルネックを特定します。
BR、ペトル