C 如何在QNX中生成脉冲计时器

C 如何在QNX中生成脉冲计时器,c,timer,real-time,qnx,C,Timer,Real Time,Qnx,我正在使用QNX生成一个频繁的事件。事件的频率需要通过控制回路不时调整。我试着用usleep while(1) { //performe event //calculate phase shift usleep(FREQUENCE - drift); // Frequnce is in the range of 1-4 ms } 这是可行的,但会产生较大的频率抖动。我认为这是因为usleep阻止CPU执行其他任务。QNX是一个操作系统,因此还需要执行一些其他任务 所以我想做的

我正在使用QNX生成一个频繁的事件。事件的频率需要通过控制回路不时调整。我试着用usleep

while(1)
{
   //performe event
   //calculate phase shift
   usleep(FREQUENCE - drift); // Frequnce is in the range of 1-4 ms
}
这是可行的,但会产生较大的频率抖动。我认为这是因为usleep阻止CPU执行其他任务。QNX是一个操作系统,因此还需要执行一些其他任务

所以我想做的是改用定时器。据我所知,计时器允许在进程睡眠时执行其他进程

不幸的是,我是QNX新手,所以我不知道如何使用定时器。我只找到了一些例子的链接,这些例子生成了一个频繁的计时器信号,但之后没有调整频率。 谢谢你的帮助


PS:我假设脉冲计时器是正确的,因为它是根据“频率”是什么间隔等待的计时器?大致上,平均而言。“是以秒为单位,毫秒还是以秒为单位?”马丁·詹姆斯(Martin James)在4到1毫秒之间。我想使用1毫秒,但使用usleep时,抖动会高达1毫秒。QNX的系统滴答时间是100毫秒。是的。。。你能容忍多少抖动?如果它与操作系统计时器间隔的顺序相同,那么肯定有问题。我猜想您需要一个专用的硬件定时器,连同它的中断和驱动程序来处理这个问题。我猜您已经将FREQUENCE线程的优先级提高到了max?注意:通常,Sleep()CAL不会阻止在其他线程/进程中执行代码(它们通过释放一个内核显式地允许执行)。使用QNX中的API调用访问硬件计时器。将该计时器的中断设置为包含:1)从全局变量设置计时器间隔。2) 执行定时事件3)重置“中断挂起”标志并返回。全局变量为,因此应用程序的其余部分可以调整计时器间隔。注:当系统滴答时间为100usec时,计时器的最佳精度为+/-100usec,其间隔为“频率”?大致上,平均而言。“是以秒为单位,毫秒还是以秒为单位?”马丁·詹姆斯(Martin James)在4到1毫秒之间。我想使用1毫秒,但使用usleep时,抖动会高达1毫秒。QNX的系统滴答时间是100毫秒。是的。。。你能容忍多少抖动?如果它与操作系统计时器间隔的顺序相同,那么肯定有问题。我猜想您需要一个专用的硬件定时器,连同它的中断和驱动程序来处理这个问题。我猜您已经将FREQUENCE线程的优先级提高到了max?注意:通常,Sleep()CAL不会阻止在其他线程/进程中执行代码(它们通过释放一个内核显式地允许执行)。使用QNX中的API调用访问硬件计时器。将该计时器的中断设置为包含:1)从全局变量设置计时器间隔。2) 执行定时事件3)重置“中断挂起”标志并返回。全局变量为,因此应用程序的其余部分可以调整计时器间隔。注:当系统滴答时间为100usec时,计时器的最佳精度为+/-100usec