【问题标题】:How to read a GPIO clock signal in Xenomai?如何在 Xenomai 中读取 GPIO 时钟信号?
【发布时间】:2013-04-19 15:13:24
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: asynchronous real-time rtos gpio xenomai


    【解决方案1】:

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

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

    很遗憾,您没有具体说明您对时钟信号的用途。我猜你是想充当某个设备的从驱动器?

    希望对我有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      相关资源
      最近更新 更多