「FreeMaster over CAN」と「s32k3xx_fm_over_can_s32ct」から生成されたコードから、ポーリングモードを有効にするために3 micoを変更しようとしています。
FMSTR_SHORT_INTR 、 FMSTR_POLL_DRIVEN 、およびFMSTR_DEBUG_TX
しかしコンパイルに失敗しました。理由は、転送機能のフリーマスターオーバーが割り込み時に「s32k3xx_fm_over_can_s32ct」応答から可能になるためです。しかし、モータ制御の場合、少なくとも10kHzの高速タスクやBCTU、ホール、ワッチドッグ、フリーマスターはControllewr K312からの応答を受け取れず、ポーリングモードが必要です。
これら3つのマイクロコントローラを有効にして、「s32k3xx_fm_over_can_s32ct」のポーリングモードを開く方法
通信手段は相互に排他的な選択肢である。エラーメッセージはまさにそのことを意味しています。
FreeMASTERドライバールーチンはかなりの処理時間を必要とする場合があり、これら3つの設定は利用ケースに応じて実行のバランスを取るのに役立ちます。
あなたが試すべきなのは、最後の方法(ポーリングと割り込みの組み合わせ)だと思います。それでも割り込みはCANフレームの読み取りを保証するかもしれませんが、FMSTR_Poll呼び出す頻度が十分でない場合(より高い優先度の割り込みによる)、ボードが時間通りに応答しないことがあります。その結果、FreeMASTERデスクトップツールでタイムアウトエラーが表示されます。
開発者は、計算集約型アプリケーションにおいてFreeMASTERドライバーのルーチンに十分な時間を割り当てられるかを確実にしなければなりません。
これでFreeMASTERの通信モードが明確になったことを願います。
以前、あなたと同じ設定で試してみました。
例えば、 FMSTR_POLL_DRIVENを1に変更しました(以前は割り込みモードとして0でした)。
// 割り込み駆動またはポーリング駆動のシリアル通信を選択します
#define FMSTR_LONG_INTR 1 割り込みにおけるメッセージプロセッシングの完了
#define FMSTR_SHORT_INTR 0 //割り込みでキューイングが完了
#define FMSTR_POLL_DRIVEN 1 /*0 */
7 エラー: 主に
#if (FMSTR_LONG_INTR && (FMSTR_SHORT_INTR || FMSTR_POLL_DRIVEN )) || \
(FMSTR_SHORT_INTR && (FMSTR_LONG_INTR || FMSTR_POLL_DRIVEN )) || \
( FMSTR_POLL_DRIVEN && (FMSTR_LONG_INTR || FMSTR_SHORT_INTR)) || \
!( FMSTR_POLL_DRIVEN || FMSTR_LONG_INTR || FMSTR_SHORT_INTR)
割り込みモードでは1つだけ選択可能です */
#エラーFMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります
#endif
コンパイル時に上記で3つのエラーが発生しました
../FMsrc/freemaster_private.h:326:2: エラー: #error FMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります
326 | #エラー FMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります。
| ^~~~~
../FMsrc/freemaster_private.h:326:2: エラー: #error FMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります
326 | #エラー FMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります。
| ^~~~~
../FMsrc/freemaster_private.h:326:2: エラー: #error FMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります
326 | #エラー FMSTR_LONG_INTR、FMSTR_SHORT_INTR、またはFMSTR_POLL_DRIVENのいずれか1つだけを有効にする必要があります。
| ^~~~~
1つでは不十分だが、2つでもすべて失敗に終わった。
こんにちは、 @millerhughes さん。
ポーリングモードを有効にするには、以下のマクロを更新する必要があります。
#define FMSTR_LONG_INTR 0
#define FMSTR_SHORT_INTR 0
#define FMSTR_POLL_DRIVEN 1
3つのうち1つだけを1に設定する必要があります。そうしないと、コードはコンパイルされません。
FMSTR_DEBUG_TXについてですが、これはTXラインを検証するためのデバッグマクロです。これまでの定義と合わせて、次の定義も考えられます。
#define FMSTR_DEBUG_TX 1
FreeMASTERドライバーに継続的にデバッグフレームを送信するよう指示します(注:これはTXラインの検査に役立ちますが、この機能が有効になっている間はFreeMASTERツールでボードに接続できません)。
コンパイルエラーログを共有してもらえますか?
私の知る限り、s32k3xx_fm_over_can_s32ct例はモデルベースデザインツールボックス(MBDT)チームによって実装されています 。Simulinkでアプリケーションを開発する場合、手動のコード変更ではなくブロック設定の更新が必要になるかもしれません。この場合、MBDT開発者は専用のMBDTコミュニティを通じて、あなたのユースケースにより適切な支援を提供できます 。
ご説明ありがとうございます。はい、ポーリングと割り込みの組み合わせが私の目標です。
問題の要約:ターゲットk312は、freeamsterをしばらく実行した後、応答を送信できません。
フィードバックは以下のとおりです。
割り込みモード:フリーマスター動作中、上記の問題発生、FMSTR_LONG_INTRのみ
ポーリングモード: コンパイル、freemaster が動作しない、freemaster_private.h:326:2 のエラーメッセージを削除しても FMSTR_POLL_DRIVEN:
混合:FreeMasterは動作し、コンパイルは可能ですがトラフィックの問題は残ります。FMSTR_LONG_INTRまたはFMSTR_SHORT_INTRまたはFMSTR_POLL_DRIVENの3つすべてが1に設定され、freemaster_private.h:326:2のエラーメッセージが削除されます:
今は正当化します:おそらくCANドライバーの問題かもしれません。
もし追加のサポートができるなら、どのような情報が必要ですか?
こんにちは、 @millerhughes さん。
FMSTR_LONG_INTRモードは、たとえ短時間しか動作しないとしても、唯一動作するモードなので、このモードのトラブルシューティングを試みるつもりです。私が調査するであろう事項は以下のとおりです。
MATLAB/Simulinkモデルから始めましたか?それともS32 Design Studioのサンプルアプリケーションから始めましたか?元のソースによって、FreeMASTER CANドライバの実装は異なる場合があります。
可能であれば、ソースファイル( freemaster_s32_flexcan.hとfreemaster_s32_flexcan.cという名前である必要があります)を添付してください。
1. Peakcan Viewを使用してメッセージフローを監視しました。
はい、CANメッセージはもうボードから送信されていません
フリーアムスターがスムーズに動作しているとき、メッセージが非常に速く点滅します。freeamasterがフリーズすると、S32k312minEVBから送信されたCANメッセージは停止したようですが、Freemasterからのメッセージは依然として表示され、動作が遅くなっています。
2、合計で20個の変数が少ないですが、その数はdemon fmプロジェクトs32k312_mc_pmsm_2sh_s32ct.pmpx "s32k344_mc_pmsm_2sh_s32ct"よりもはるかに少ないです。
3.フリーマスター専用のCANインスタンス;
おっしゃる通り、私たちのBSWはRTDを使ってCANを使ったFMを実装し、DEMON s32k3xx_fm_over_can_s32ct MCALドライバーのflexcan_43とflexcan_ipwレイヤーを統合しています。しかし、上記の問題にはまだ取り組んでいます。
ちなみに、CANのIP層制限により、私たちのCANドライバは標準のmsg IDを受け入れることができるので、freeamsterの設定設定:標準送信、受信拡張。
添付ファイルに、あなたに近いと思われる4つのファイルがありますのでご確認ください。
すべてのCAN IP設定ファイルが必要ですか?実際、43/ipw はすべて demon s32k3xx_fm_over_can_s32ct と同じように構成されます。
直接メールで連絡することもできます。
こんにちは、 @millerhughes さん。
残念ながらこのThreadには添付ファイルは見つかりませんでしたが、MBDTから入手したファイルでは、確かに私たちのチームの実装とは異なっていました。
MBDTの実装を私たちのバージョン(添付ファイル参照 - freemaster_s32k3xx_can.c とfreemaster_s32k3xx_can.hに対応しています)に置き換えてみてはどうでしょうか。
私が気づいた一つの矛盾点は、CAN割り込みハンドラのシグネチャです:
FMSTR_BOOL FMSTR_CanIsr(FMSTR_U16 RxObjectId, FMSTR_U32 RxCanId, FMSTR_U32 RxMsgLength, const FMSTR_U8 * RxMsgData, FMSTR_U16 TxMsgBufId);
対
void FMSTR_CanIsr(void);
CANの詳細(バッファIDなど)がfreemaster_cfg.hで定義されていると仮定しますハンドラー内でそれらは必要ありません。当社もRTD(低ハードウェア層)を使用しており、お客様の設定を変更する必要はありません。
ファイルのアップロードリクエストに失敗しました。このThreadにファイルをアップロードする方法
ただし、CAN readバッファをリセットする関数を探す助けを求めてください。
また、MBD CANドライバーコードCan_43_FLEXCAN_Ipw.cに変更が加わったのではないかと疑っています
MBD MCAL CANドライバーをRTD非MCALドライバーに統合すると、機能Can_43_FLEXCAN_Ipw_ProcessRxMesgBufferが強制的にMEMCPYに転送されます。
手動転送がなければ、RTD非MCALのCANドライバーを使うCan_43_FLEXCAN_Ipw_ProcessRxMesgBufferすべてのCAN情報を読み取れません。
オリジナルのMBD DEMON s32k3xx_fm_over_can_s32ct手動転送は不要です。なぜなら、demonはMCAL CAN 43ドライバを使用しているからです。
Freemasterの問題を引き起こす場合、関数Can_43_FLEXCAN_Ipw_ProcessRxMesgBuffer()での手動転送を回避する方法はありますか?
あるいは、あなたが知っている何らかの機能を使ってバッファを手動でリセットすることもできますか?
static void Can_43_FLEXCAN_Ipw_ProcessRxMesgBuffer
(
const Can_43_FLEXCAN_ControllerConfigType * Can_pControllerConfig、
const Can_43_FLEXCAN_HwObjectConfigType * Can_pHwObjectConfig、
uint8 u8MbIdx
)
{
Can_HwHandleType u8HwObjectID = 0U;
Can_HwType CanIf_Mailbox;
PduInfoType CanIf_PduInfo;
const Can_43_FLEXCAN_HwObjectConfigType * Can_pHwObject = NULL_PTR;
Flexcan_Ip_MsgBuffType * pReceivedDataBuffer = NULL_PTR;
/**/
memcpy(&Can_Ipw_xStatus0,&FlexCAN_State0,sizeof(FlexCAN_State0));
/**/
u8HwObjectID = Can_Ipw_au16MbIdxToObjIDMap[Can_pControllerConfig-> Can_u8ControllerID ][u8MbIdx];
フィードバック:RTD版Freemasterドライバーコードの提供ありがとうございます。
MBDのバージョン機能はFMSTR_CanIsr(*,*,*..*)はMCALドライバ freemaster_s32k3xx_canで、RTDドライバ freemaster_can_flexcanではFMSTR_CanIsr()によって使われています。
統合と実行時に、Freemasterがs32k312MINEVBとの接続に失敗しました。
フリーマスターがフリーズしたときにデバッグを始めました。S32K312N=MINEVBがメッセージを送信失敗したとき、SWが「読み取れる」状態になり、これが未完了のCAN読み取りを引き起こし、間接的には送信遅延が無制限になることがわかりました。
バッファがいっぱいになった場合にリセットするなど、読み取り用のバッファを手動でクリアする機能はありますか?