PXA270 上的 RS232 通信延迟较高

2024-11-11 08:27:00
admin
原创
167
摘要:问题描述:我在 PXA270 RISC PC/104 上的 RS232 通信中遇到了较长的延迟(1.5 毫秒 - 9.5 毫秒)。我想尽量减少较长的延迟,但我是嵌入式设备和 C++ 的初学者,所以我认为我遗漏了一些东西。上述延迟是指 PXA 板通过 RS232(115200 波特)从外部设备接收数据包到将自定...

问题描述:

我在 PXA270 RISC PC/104 上的 RS232 通信中遇到了较长的延迟(1.5 毫秒 - 9.5 毫秒)。我想尽量减少较长的延迟,但我是嵌入式设备和 C++ 的初学者,所以我认为我遗漏了一些东西。

上述延迟是指 PXA 板通过 RS232(115200 波特)从外部设备接收数据包到将自定义 ACK 数据包发送回外部设备的时间。我用示波器测量了 PXA 板上的延迟,一个通道位于 Rx,另一个通道位于 Tx。

PXA 板运行的是Arcom 嵌入式 Linux (AEL)。我知道这不是实时操作系统,但我仍然认为,平均 4.5ms 的延迟对于提取接收的数据包、验证其 CRC16、构造 ACK 数据包(带 CRC)并将其发送回串行线来说太高了。我还故意让 CPU 处于高负载状态(一些并行 gzip 操作),但延迟时间根本没有增加。接收数据包的最大大小为 30 字节。

一个 C++ 应用程序(另一位前同事编写)负责处理数据包的接收和确认。一个线程负责发送数据包,另一个线程负责接收数据包。

我认为 PXA 板上的 RTC 分辨率很差,AEL 无法将时序与内部 RTC 分辨率对齐。但 RTC 的频率为 32.768 kHz。分辨率足够,但仍然无法解释高延迟。顺便说一句,我认为操作系统使用内部 PXA 时钟(也具有足够的分辨率)而不是 RTC 进行计时。

因此问题一定出在 C++ 应用程序或 RS232 接口的驱动程序/操作系统设置中。

根据POSIX 操作系统的串行编程指南,以下控制标志用于 C++ 应用程序中的 RS232 通信:

// Open RS232 on COM1
mPhysicalComPort = open(aPort, O_RDWR | O_NOCTTY | O_NDELAY);
// Force read call to block if no data available
int f = fcntl(mPhysicalComPort, F_GETFL, 0);
f &= ~O_NONBLOCK;
fcntl(mPhysicalComPort, F_SETFL, f);
// Get the current options for the port...
tcgetattr(mPhysicalComPort, &options);
// ... and set them to the desired values
cfsetispeed(&options, baudRate);
cfsetospeed(&options, baudRate);
// no parity (8N1)
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
// disable hardware flow control
options.c_cflag &= ~CRTSCTS;
// raw input
options.c_lflag = 0;
// disable software flow control
options.c_iflag = 0;
// raw output
options.c_oflag = 0;
// Set byte times
options.c_cc[VMIN] = 1;
options.c_cc[VTIME] = 0;
// Set the new options for the port
tcsetattr(mPhysicalComPort, TCSAFLUSH, &options);
// Flush to put settings to work
tcflush(mPhysicalComPort, TCIOFLUSH);

我觉得我遗漏了一些非常简单的东西。我认为,如果应用程序的进程在更高的优先级下运行,这将无法解决问题。一定有一些东西可以指示 RS232 驱动程序以更高的优先级处理请求,以最大限度地减少延迟。

有人有什么想法吗?非常感谢您的帮助。


解决方案 1:

非常感谢您的评论。

我能够将延迟减少到约 0.4 毫秒。AEL手册中引用了命令setserial(8)low_latency 。然后,我在那里找到了带有以下描述的标志:

以更高的 CPU 利用率为代价,将串行设备的接收延迟降到最低。(通常,在将字符移交给线路学科之前,平均有 5-10ms 的延迟,以尽量减少开销。)默认情况下,此功能处于关闭状态,但某些实时应用程序可能会发现此功能很有用。

然后我执行了它setserial /dev/ttyS1 low_latency,延迟减少到了~0.4ms :-)

但是我想在 C++ 应用程序中实现这种行为,而不使用 setserial 全局设置此标志(此命令默认不包含在所有发行版中)。

我添加了以下代码行,其效果与 setserial 中的 low_latency 标志相同:

#include <sys/ioctl.h> 
#include <linux/serial.h>
// Open RS232 on COM1
mPhysicalComPort = open(aPort, O_RDWR | O_NOCTTY | O_NDELAY);
struct serial_struct serial;
ioctl(mPhysicalComPort, TIOCGSERIAL, &serial); 
serial.flags |= ASYNC_LOW_LATENCY; // (0x2000)
ioctl(mPhysicalComPort, TIOCSSERIAL, &serial);
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用