识别微秒范围内的 POSIX 读取暂停

Posted

技术标签:

【中文标题】识别微秒范围内的 POSIX 读取暂停【英文标题】:Recognizing POSIX-read pauses in microseconds range 【发布时间】:2011-10-06 13:34:34 【问题描述】:

我必须在 C++/Linux 中实现 J1708 协议。我想在用户空间中完全实现这一点,但我不知道这是否可能。

问题在于消息仅通过位时间分开。位时间对应于波特率:1/baudrate,在 J1708 上,波特率为 9600bps,大约为 104.17 微秒。该协议上的每条消息都由以 2 位时间 (208.34us) 分隔的字符组成,即所谓的“字符间位时间”。消息由不确定数量的字符组成,如果有 10 位时间 (1041.7us) 的暂停,则消息结束/完成。

我的想法是通过 POSIX 终端接口以阻塞模式读取字节并计算识别消息结束之间的时间。 有没有机会通过我的方法实现这一点,或者有人有更好的主意吗?

SAE J1708 参考:http://read.pudn.com/downloads133/ebook/567787/saej1708v002.pdf

【问题讨论】:

【参考方案1】:

这非常依赖于硬件!你能保证吗:

您的 UART 未处于 FIFO 模式。如果是,那么几个字符将被缓冲 硬件,所以你可以告别你的时间假设。

没有其他任务(用户空间或内核)会中断您的读取并持续超过 1 毫秒?

每个字符都会导致不同的读取事件?它类似于第一个假设(没有硬件 FIFO),但在驱动程序方面。

鉴于波特率较慢,也许您可​​以实现 1 和 3。

我认为用像 linux 这样的操作系统来实现这一点要么是不可能的,要么是非常低效的(即你把所有的处理时间都花在轮询硬件上)。

这种“协议”最好由 FPGA 或微控制器处理。即通过 pic 演示板,在 PIC 板上解码您的消息,并将它们发送到您的 linux 处理器。

【讨论】:

我理解你的想法,但就目前的硬件而言,我必须对这个......内核驱动程序和中断服务例程中的混乱时间怎么样?

以上是关于识别微秒范围内的 POSIX 读取暂停的主要内容,如果未能解决你的问题,请参考以下文章

C++ 仅读取进程范围内的内存地址

提升::posix_time。如何在同一应用程序中同时表示微秒和纳秒日期时间

POSIX 共享内存写入/读取

使用 POSIX API 读取文件

spark sql怎么去获取hive 表一定日期范围内的数据

Posix PIPE 上的非阻塞读取和阻塞写入