PXA270 上的 RS232 通信延迟较高

2024-11-11 08:27:00
admin
原创
129
摘要:问题描述:我在 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);
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1120  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   75  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   66  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   76  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   70  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用