PXA270 上的 RS232 通信延迟较高

2024-11-11 08:27:00
admin
原创
21
摘要:问题描述:我在 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);
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用