我们正在使用以下架构。root@ti-omap3-am3517-evm:~# cat /proc/cpuinfo 处理器:ARMv7 处理器 rev 7 (v7l) BogoMIPS:597.64 特点:swp half thumb fastmult vfp edsp neon vfpv3 CPU 实现者:0x41 CPU 架构:7 CPU 变体: 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 #71 PREEMPT Mon Nov 5 15:37:19 EST 2012 armv7l unknown
我们面临的问题(HW FIFO 溢出)是串行驱动程序(驱动程序/串行/8250.c)uart_rx_char()。串口有 64 字节的 FIFO,配置为在接收到 32 字节时产生中断。
我们正在以 460800 波特率从/向串行端口读取/写入数据。回归测试在我们向/从串行端口发送和接收数据的 7-8 小时内运行。几个小时后,我们看到 HWFIFO 溢出发生,我们不知道为什么会发生。我们假设以下两种情况之一正在发生。
1)串行中断被跳过,因为系统中的其他中断(以太网/ i2c和MMC(其中我们在回归测试期间不使用MMC和i2c)花费太长时间以至于跳过串行中断并且到串行中断的时间ISR 有机会运行 HW FIFO 已满。
2)另一个假设是我们必须在不到 1 毫秒(一毫秒)内处理 ISR,例如每秒 460800 位 => 460800/1000 毫秒 ~= 460 位/毫秒 ~= 52 字节/毫秒,因为我们已经配置了串行端口每 32 个字节产生一次中断,它给了我们 32/50 ms ~= 0.64 ms 的时间来完成 ISR。
如何确认我上面提到的第 1 点和第 2 点?任何指针将不胜感激。
我们还假设 8250.c(串行驱动程序)相当老旧且功能强大,它不应该像我们的那样运行。
如果您需要更多信息,请与我们联系。
8250.c 驱动程序可在此网络链接中找到。 http://lxr.free-electrons.com/source/drivers/serial/8250.c?v=2.6.32;a=arm
我还有一个问题是,我们的目标板上使用的串口是基于 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)。
有谁知道为什么会这样?