我在ARM PC上安装了Xenomai (Xenomai2.5.6- Linux Kernel 2.6.35.9),我需要读取10 kHz的时钟信号。该信号被电连接到我的一个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)我在互联网上读到,强制我的任务在内核空间而不是用户空间运行将使它能够更快地执行,但我不确定这是否足够,也不确定我在这里尝试做的事情是否完全正确。
我来自电子工程背景,在那里我总是被告知不要异步处理同步信号(如时钟信号),以及读取文件(即我的同步信号)。信号)使用可能会根据CPU/系统负载引入抖动的周期性任务,看起来不是一种好方法。有没有更好的方法呢?
谢谢!
发布于 2013-12-20 15:16:12
以下是我对可能的解决方案的想法。你是对的,你不应该异步处理同步信号。因此,您应该避免在用户空间中打开fd来从GPIO读取信号电平。
相反,您应该在内核空间中处理它,因为它更合适。进入内核空间后,您可以将GPIO设置为在上升/下降沿触发的irq,并通过Xenomai实时处理它。延迟不会消失,但对于10 KHz的时钟速度应该是可以的。
不幸的是,您没有指定您正在对时钟信号做什么。我猜你是想充当某个设备的从属驱动器?
不管怎样,我希望我能帮上忙。
https://stackoverflow.com/questions/16219607
复制相似问题