1

我在 ARM PC(Xenomai 2.5.6 - Linux Kernel 2.6.35.9)中安装了 Xenomai,我需要读取 10 kHz 时钟信号。该信号与我的一个 GPIO 电连接,该 GPIO 映射到系统文件。如果我在用户空间创建一个任务并在测量时间时打开-读取-关闭文件,我会得到 650 µs 的平均延迟(即,这是一个完整的打开-读取-关闭周期的时间)。这产生了约 1.5 kHz 的采样率。

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)

我在 Internet 上的某个地方读到,强制我的任务在内核空间而不是用户空间中运行可以使其执行速度更快,但我不确定这是否足够,也不知道我正在尝试什么在这里做是完全正确的。

我来自电子工程背景,我一直被告知不要异步处理同步信号(如时钟信号),并使用可能会根据 CPU/系统引入抖动的周期性任务读取文件(即我的同步信号)加载,看起来不是一个好方法。有更好的方法吗?

谢谢!

4

1 回答 1

1

以下是我对可能解决方案的想法。你是对的,你不应该异步处理同步信号。因此,您应该避免在用户空间中打开 fd 以从 GPIO 读取信号电平。

相反,您应该在更合适的内核空间中处理它。进入内核空间后,您可以将 GPIO 设置为 irq,以在上升/下降沿触发并通过 Xenomai 实时处理。延迟不会消失,但对于 10 KHz 时钟速度应该没问题。

不幸的是,您没有指定您正在使用时钟信号做什么。我猜你正试图充当某些设备的从驱动器?

无论如何,我希望我有所帮助。

于 2013-12-20T07:16:11.527 回答