如何在Xenomai中读取GPIO时钟信号?

时间:2013-04-25 16:04:21

标签: asynchronous real-time rtos gpio xenomai

我在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 /系统负载,看起来不是一个好方法。有没有更好的方法呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

不幸的是,你没有说明你在做什么时钟信号。我猜你试图充当某个设备的奴隶驱动器?

我希望我能提供帮助。