我在ARM PC(Xenomai 2.5.6 - Linux内核2.6.35.9)中安装了Xenomai,我需要读取10 kHz时钟信号。信号电气连接到我的一个GPIO,它映射到一个系统文件。如果我在用户空间中创建任务并在测量时间时打开 - 读取 - 关闭文件,我得到平均延迟650μs(即,这是完全打开 - 读取 - 关闭循环的时间)。这产生~1.5kHz的采样率。
while(1) // Task's infinite loop
{
t1 = rt_timer_read();
if((fd = open("test_file",O_RDONLY)) > 0)
{
read(fd,&buff,1);
close(fd);
}else{
errors++;
}
t2 = rt_timer_read();
t += t2-t1;
rt_task_wait_period(NULL);
}
输出:
[RT:] Start reading files: 05:19:05.804.754
[RT:] End reading files: 05:19:13.338.078
[RT:] Average time (10000 open-read-close cycles): 00000671.901 (microseconds)
[RT:] Errors found: 0
[RT:] (sig_handler) Signal received! (signo = 2)
我在互联网的某个地方读过,强迫我的任务在内核空间而不是用户空间运行会使它更快地执行,但我不确定这是否足够,也不是我的我试图在这里做是完全正确的。
我来自电子工程背景,我一直被告知不要异步处理同步信号(如时钟信号),并使用周期性任务读取文件(即我的同步信号),这可能会引入抖动,具体取决于CPU /系统负载,看起来不是一个好方法。有没有更好的方法呢?
谢谢!
答案 0 :(得分:1)
以下是我对可能解决方案的看法。你是对的,你不应该异步处理同步信号。因此,应避免在用户空间中打开fd以从GPIO读取信号电平。
相反,您应该在更合适的内核空间中处理此问题。进入内核空间后,您可以将GPIO设置为irq,以便在上升沿/下降沿触发,并通过Xenomai实时处理。延迟不会消失,但10 KHz时钟速度应该没问题。
不幸的是,你没有说明你在做什么时钟信号。我猜你试图充当某个设备的奴隶驱动器?
我希望我能提供帮助。