カーネル lf-6.6.52-2.2.1 を搭載した iMX6ULL システム。コンソールは、ttymxc3 上の RS-485 シリアル ポートである ttymxc0 に設定されています。トランシーバ「Drive Enable」は SNVS_TAMPER7 にコネクテッドであり、次の DTS があります。
&iomuxc_snvs {
pinctrl_rs485_snvs: rs485grp_snvs {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x1b0b1 /* RS485.DE as RTS */
>;
};
};
&uart4 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rs485>, <&pinctrl_rs485_snvs>;
fsl,dte-mode;
rts-gpios = <&gpio5 7 GPIO_ACTIVE_HIGH>;
linux,rs485-enabled-at-boot-time;
status = "okay";
label = "rs485";
};データがコンソールに出力されると、RS-485 シリアル ポートに干渉が発生することに気付きました。RTS/DE 信号が 5 ~ 10 ミリ秒遅延することがあります。これは 9600 bps で 3.5 文字より長いため、ホストがまだバスを駆動しているため、デバイスからの応答が文字化けすることになります。これは次のようにCANできます:
while true;do echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >/dev/kmsg;doneこれは既知の問題ですか?
こんにちは@astrand
これは Linux カーネルではよくある問題のようです。こちらは LWN.NET での議論です。printk/console は遅いデバイスです。大量のログが発生した場合、カーネルはメッセージをコンソールに同期的に書き込む必要があります。このプロセス中、関連するロックが保持され、CPU 時間が消費され、他のタスクのスケジュールと割り込み処理が遅延されます。コンソールが RS-485 シリアル ポートと異なる場合でも、システム全体のスケジュール/ソフト割り込み/タスク キューは依然として遅くなります。これにより、UART 送信完了イベント情報がドライバに到達し、その後 DE ビットをプルダウンするまでの時間が遅延されます。詳細については、そのディスカッションを参照してください。
https://lwn.net/Articles/909980/
実行時にCAN、コンソールのログレベルを低く設定するか、
echo "4 4 1 7" > /proc/sys/kernel/printk
よろしくお願いします、
志明