皆さんこんにちは。私は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がデータを受信できない原因になりますか?この問題をどのように解決すればよいでしょうか?ご提案をいただければ幸いです。よろしくお願いいたします。
エラーログは共有できますか?
正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg正常.jpg通常.jpg
exception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpgexception.jpg
左側の図はプログラムが正常に動作している様子を示し、右側の図は例外発生後の動作を示しています:基板にpingが送れず、ログ出力が固定された位置で止まっています。
こんにちは、 @williams_ww
投稿ありがとうございます。
私の理解では、printf() 自体が S32G274A GMAC0 ハードウェアによるフレームの受信を停止させることはないはずです。より可能性が高いのは、printf -> _write -> Linflexd_UartパスがFreeRTOS/lwIP/GMACソフトウェアのタイミングを乱していることです
詳細な実装についてはよくわかりませんが、_write() 内のブロックを確認したり、UART 出力を低優先度のロガー タスクに移動したりして、可能性のある範囲を絞り込むことをお勧めします。
BR
チェイン
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.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.png
サポートチームの提案に従い、元の印刷ロジックを修正し、以下のようにバッファにデータを書き込みました。
静的文字バッファ[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のヒープサイズはどちらも正常のようです。
問題解決に関して、さらに詳しい説明や技術的なアドバイスが必要な場合はお知らせください。
「提案された変更を適用した後も、問題は依然として解決していません。」
こんにちは、 @williams_ww
ご返信ありがとうございます。
ブロック方法を使っていたようですね(Linflexd_Uart_Ip_SyncSend)。ノンブロッキングAPIを試したことはありますか?(Linflexd_Uart_Ip_AsyncSend)
BR
チェイン
GMACの設定は、基本的に公式のサンプルプログラムに従って行われます。 ip.jpgip.jpgip.jpgip.jpgip.jpgip.jpg
code.jpgcode.jpgcode.jpgcode.jpgcode.jpgcode.jpg
dev.jpgdev.jpgdev.jpgdev.jpgdev.jpgdev.jpg
こんにちは、 @williams_ww
ご返信ありがとうございます。
私には以下の提案があります。
1. まず、UARTドライバ、ポーリング、割り込みモードのどの設定を使っているか確認します。
2. ポーリングモードの場合は、割り込みモードに変更し、UART/GMAC両方で使用されている割り込みの優先順位を確認し、UART割り込みをGMACよりも低く設定して再度試してください。
BR
チェイン
ハードウェアエラーが発生した可能性があります。UART同期送信インターフェースの内部実装を確認しました。 SuspendAllInterrupts 関連コードをコメントアウトし、同期送信インターフェースを呼び出す前にロック保護を追加しましたが、問題は依然として解決していません。したがって、UART同期送信ロジックとは強く関係がないと思います。ハードウェアエラーがlwipとUARTの両方のクラッシュを引き起こしたのではないかと疑っています。
割り込みモードを使うと状況が悪化する。
こんにちは、 @williams_ww
ご返信ありがとうございます。
ソフトウェアの観点から見ると、あなたが遭遇した問題は、頻繁なUART TX/RX割り込みがイーサネット割り込みプロセッシングを妨害し、RXプロセッシングのレイテンシを増加させパケットロスを引き起こすことによるものと考えられます。
これまで話したアドバイス以外にも、UARTやネットワークの割り込み優先度も影響するので、UART割り込みを設定して、ネットワーク割り込みの優先度より低く設定して試してみることをおすすめします。
BR
チェイン