我在 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/系统引入抖动的周期性任务读取文件(即我的同步信号)加载,看起来不是一个好方法。有更好的方法吗?
谢谢!