2409129_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2409129_ja-JP

2409129_ja-JP

GMAC0とLinflexd UART0は同時に安定して動作しません

皆さんこんにちは。私はS32G274AのM7_0コア上でS32DS3.5とRTD4.0.0を使用し、FreeRTOS、Linflexd_Uart、Lwipをコンポーネントとして開発しています。デバッグ中に、GMAC0とLinflexd UART0が同時に安定して動作しないことに気づきました。私はprintfの内容を出力するためにLinflexd_Uartを使用しています。ログには初期化が完了し、アプリケーション起動後は各FreeRTOSタスクのステータスを循環的に印刷できます。しかし、ボードのIPアドレスにpingができません。_write 関数内の printf 呼び出しをコメントアウトするか、UART 送信を無効にすると、電源投入後またはリセット後にボードが ping 可能になります。ここでの問題は何でしょうか?printf関数はGMAC0がデータを受信できない原因になりますか?この問題をどのように解決すればよいでしょうか?ご提案をいただければ幸いです。よろしくお願いいたします。

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

エラーログは共有できますか?

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg通常.jpg exception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpg

左側の図はプログラムが正常に動作している様子を示し、右側の図は例外発生後の動作を示しています:基板にpingが送れず、ログ出力が固定された位置で止まっています。

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

こんにちは、 @williams_ww

投稿ありがとうございます。

私の理解では、printf() 自体が S32G274A GMAC0 ハードウェアによるフレームの受信を停止させることはないはずです。より可能性が高いのは、printf -> _write -> Linflexd_UartパスがFreeRTOS/lwIP/GMACソフトウェアのタイミングを乱していることです

詳細な実装についてはよくわかりませんが、_write() 内のブロックを確認したり、UART 出力を低優先度のロガー タスクに移動したりして、可能性のある範囲を絞り込むことをお勧めします。


BR

チェイン

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

IPアドレス192.168.7.200とは何ですか?それはGMACの設定の一部ですか?

GMAC関連の接続が安定していない場合は、S32G2ハードウェア設計ガイドラインAN14063も確認できます。

以下のどの作業モードがあなたのデザインに適していますか?

db16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.pngdb16122_0-1788253582320.png

db16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.pngdb16122_1-1788253600524.png


Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

サポートチームの提案に従い、元の印刷ロジックを修正し、以下のようにバッファにデータを書き込みました。


静的文字バッファ[64*1024+1];
volatile char buffer_to_print = 0;
void my_printf(const char *format , ...)
ヤージュ
va_list 引数;
if(1 == buffer_to_print)
ヤージュ
戻る ;
}

va_start(args,format);
vsnprintf(buffer,sizeof(buffer),format,args);
va_end(args);
buffer_to_print = 1;
}
優先度0のタスクを作成しました。これは他のすべてのタスクよりも優先度が低いものです。


void my_printf_flush()
ヤージュ
if(buffer_to_print)
ヤージュ
Linflexd_Uart_Ip_AbortSendingData(0);
Linflexd_Uart_Ip_SyncSend(0,(uint8*)buffer,strlen(buffer),3000000);
buffer_to_print = 0;
}
}



void PrintfTaskDemo(void *pvParameters)
ヤージュ
(void)pvParameters;
のために(;;)
ヤージュ
my_printf_flush();
vTaskDelay(pdMS_TO_TICKS(10));
}
}


// ここに印刷内容がありますが、なぜ PRINT_HEAP_INFO だけが印刷され、taskInfo は毎回印刷されないのでしょうか ?????????????????????
のために(;;)
ヤージュ
ZRSleep(1000); // 1秒間スリープ
PRINT_HEAP_INFO; // 残りのヒープサイズを表示する
vTaskList(taskInfo); // FreeRTOSの全タスク状態を取得します
ZRLOG(ZRLOG_USER_INFO,taskInfo); // my_printf を呼び出してバッファに書き込む
ZRSleep(1000); // 1秒間スリープ
}



現在の動作はこうです:PrintfTaskDemoタスクは通常通りコンテンツを印刷できます(DMAを有効にしていません)が、GMAC0のIPアドレスが時々到達不能で、ネットワーク機能も安定して動作しません。

私のlinker_ram.ldのSRAMサイズは3MB(S32G274A M7_0上)で、コンパイル設定とFreeRTOSのヒープサイズはどちらも正常のようです。

問題解決に関して、さらに詳しい説明や技術的なアドバイスが必要な場合はお知らせください。

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

「提案された変更を適用した後も、問題は依然として解決していません。」

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

こんにちは、 @williams_ww

ご返信ありがとうございます。

ブロック方法を使っていたようですね(Linflexd_Uart_Ip_SyncSend)。ノンブロッキングAPIを試したことはありますか?(Linflexd_Uart_Ip_AsyncSend)


BR

チェイン

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

GMACの設定は、基本的に公式のサンプルプログラムに従って行われます。 ip.jpgip.jpgip.jpgip.jpgip.jpgip.jpgip.jpg code.jpgcode.jpgcode.jpgcode.jpgcode.jpgcode.jpgcode.jpg dev.jpgdev.jpgdev.jpgdev.jpgdev.jpgdev.jpgdev.jpg

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

こんにちは、 @williams_ww

ご返信ありがとうございます。

私には以下の提案があります。

1. まず、UARTドライバ、ポーリング、割り込みモードのどの設定を使っているか確認します。

2. ポーリングモードの場合は、割り込みモードに変更し、UART/GMAC両方で使用されている割り込みの優先順位を確認し、UART割り込みをGMACよりも低く設定して再度試してください。


BR

チェイン

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

ハードウェアエラーが発生した可能性があります。UART同期送信インターフェースの内部実装を確認しました。 SuspendAllInterrupts 関連コードをコメントアウトし、同期送信インターフェースを呼び出す前にロック保護を追加しましたが、問題は依然として解決していません。したがって、UART同期送信ロジックとは強く関係がないと思います。ハードウェアエラーがlwipとUARTの両方のクラッシュを引き起こしたのではないかと疑っています。

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

割り込みモードを使うと状況が悪化する。

Re: GMAC0 and Linflexd UART0 cannot work stably at the same time

こんにちは、 @williams_ww

ご返信ありがとうございます。

ソフトウェアの観点から見ると、あなたが遭遇した問題は、頻繁なUART TX/RX割り込みがイーサネット割り込みプロセッシングを妨害し、RXプロセッシングのレイテンシを増加させパケットロスを引き起こすことによるものと考えられます。

これまで話したアドバイス以外にも、UARTやネットワークの割り込み優先度も影響するので、UART割り込みを設定して、ネットワーク割り込みの優先度より低く設定して試してみることをおすすめします。


BR

チェイン

タグ(1)
評価なし
バージョン履歴
最終更新日:
火曜日
更新者: