以下のアーキテクチャを使用しています。root@ti-omap3-am3517-evm:~# cat /proc/cpuinfo プロセッサ: ARMv7 プロセッサ rev 7 (v7l) BogoMIPS: 597.64 0x1 CPU部:0xc08 CPUリビジョン:7
ハードウェア : OMAP3517/AM3517 EVM リビジョン : 0020 シリアル : 0000000000000000
Linux カーネル バージョン 2.6.32 root@ti-omap3-am3517-evm:~# uname -a Linux ti-omap3-am3517-evm 2.6.32.8 を使用しています
私たちが直面している問題 (HW FIFO オーバー フロー) は、シリアル ドライバー (driver/serial/8250.c) uart_rx_char() にあります。シリアル ポートには 64 バイトの FIFO があり、32 バイトを受信すると割り込みを生成するように構成されています。
460800 ボー レートでシリアル ポートとの間でデータを読み書きしています。回帰テストは、シリアル ポートとの間でデータを送受信する 7 ~ 8 時間にわたって実行されます。数時間後、HWFIFO オーバー フローが発生し、その理由がわかりません。次の 2 つのいずれかが発生していると想定しています。
1) システム内の他の割り込み (Ethernet/ i2c および MMC (リグレッション テストでは MMC と i2c を使用しません) は、シリアル割り込みがスキップされるまでに時間がかかりすぎるため、シリアル割り込みがスキップされます。 ISR は、HW FIFO を実行する機会を取得します。FIFO はすでにいっぱいです。
2) もう 1 つの仮定は、ISR を 1 ミリ秒 (1 ミリ秒) 未満で処理する必要があるということです。つまり、460800 ビット/秒 => 460800/1000 ミリ秒 ~= 460 ビット/ミリ秒 ~= 52 バイト/ミリ秒であり、シリアル ポートを構成したためです。 32 バイトごとに割り込みを生成するには、ISR を完了するのに 32/50 ミリ秒 ~= 0.64 ミリ秒かかります。
上記のポイント1とポイント2を確認するにはどうすればよいですか?任意のポインタをいただければ幸いです。
また、8250.c (シリアル ドライバ) はかなり古く、堅牢であり、このように動作しないはずです。
さらに情報が必要な場合はお知らせください。
8250.c ドライバーは、この Web リンクにあります。 http://lxr.free-electrons.com/source/drivers/serial/8250.c?v=2.6.32;a=アーム
もう 1 つの質問は、ターゲット ボードで使用されているシリアル ポートが ST16654 ベースで、次の構成になっているということです。
[PORT_16654] = {
.name = "ST16654",
.fifo_size = 64,
.tx_loadsz = 32,
.fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
UART_FCR_T_TRIG_10,
.flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP
}
コードを確認したところ、rx トリガーが 16 バイトに設定されているように見えますが、tx トリガーは 32 バイトに設定されています ( http://lxr.free-electrons.com/source/include/linux/serial_reg.h で定義されていますか? v=2.6.32;a=arm#L62 )。
なぜそうなのか、誰にも手がかりがありますか?