我正在Linux上通过串口实现协议.该协议基于请求应答方案,因此吞吐量受到将数据包发送到设备并获得答案所需的时间的限制.这些设备大多是基于arm的,运行Linux> = 3.0.我遇到了麻烦,将往返时间减少到10ms以下(115200波特,8个数据位,无奇偶校验,每个消息7个字节).
什么IO接口会给我最低的延迟:使用ioctl手动选择,轮询,epoll或轮询?阻塞或非阻塞IO是否会影响延迟?
我尝试使用setserial设置low_latency标志.但它似乎没有效果.
还有其他我可以尝试减少延迟的事情吗?由于我控制所有设备,甚至可以修补内核,但它首选不要.
----编辑----
串口控制器使用的是16550A.
作为编译器项目的一部分,我必须为x86编写GNU汇编代码来比较浮点值.我试图找到有关如何在线进行此操作的资源,据我所知,它的工作原理如下:
假设我要比较的值是浮点堆栈上的唯一值,那么fcomi指令将比较这些值并设置CPU标志,以便je可以使用...指令.
我问,因为这只会有效.例如:
.section .data
msg: .ascii "Hallo\n\0"
f1: .float 10.0
f2: .float 9.0
.globl main
.type main, @function
main:
flds f1
flds f2
fcomi
jg leb
pushl $msg
call printf
addl $4, %esp
leb:
pushl $0
call exit
Run Code Online (Sandbox Code Playgroud)
即使我认为应该打印"Hallo"也不会打印,如果你切换f1和f2,它仍然不会是一个逻辑上的矛盾.jne并且jl但是似乎做工精细.
我究竟做错了什么?
PS:fcomip只弹出一个值还是同时弹出?
可以说我有一个java包commands,其中包含所有继承自的类,ICommand我能以某种方式得到所有这些类吗?我正在锁定以下内容:
Package p = Package.getPackage("commands");
Class<ICommand>[] c = p.getAllPackagedClasses(); //not real
Run Code Online (Sandbox Code Playgroud)
有可能吗?
我正在使用PostgreSQL C API.阅读文档时,它指出当PQgetResult返回NULL时,查询结束,如果PQisBusy没有返回0,PQgetResult将阻塞.但是如果没有更多输入,PQisBusy返回1,所以我不能调用PQgetResult并获得NULL.因此我不知道查询是否结束.有没有其他方法可以知道查询是否完成?我误解了异步API吗?
- - 编辑 - - -
C代码的基本思想是:
PQsendQuery(conn, query)
while(true)
{
PQconsumeInput(conn)
if(PQisBusy(conn) == 0)
{
PGresult* res = PQgetResult(conn);
if(res)
{
//print result
}
else
{
//res == NULL
//indicates query is over
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果将被打印,但循环永远不会终止.因为PQisBusy只返回0一次.
assembly ×1
asynchronous ×1
c ×1
c++ ×1
compare ×1
java ×1
linux ×1
low-latency ×1
package ×1
postgresql ×1
reflection ×1
serial-port ×1
sql ×1
throughput ×1
x86 ×1