跳转到内容

D 编程/RTAI/LXRT

来自 Wikibooks,开放世界的开放书籍

为了使任务计时与 RTAI 一致,您有两种可能性

  • 周期性计时器模式
  • 一次性计时器模式

您可以在 RTAI 调度程序概述 中阅读有关此内容的信息。为了显示差异

周期性模式
使用 8254 芯片。它以 1193180 Hz 的固定频率运行。如果要制作一个 1 kHz 的循环事件,它可以将计时器周期设置为 100 µs。在循环任务中始终调用 rt_sleep_until() 与下一次。结果是 1 kHz 任务,抖动为 100 µs。
一次性模式
内部时钟与 CPU 时钟同步。对于每个计时器事件,RTAI 都必须为下一个事件重新编程计时器。这是一个开销,但具有最高时间分辨率的优点。

要使用 LXRT 创建循环任务,首先像往常一样创建一个新线程。

threadHandle = rt_thread_create( &threadFunc )

然后像这样实现线程

void threadFunc()
  {
    RT_TASK *handler;
    handler = rt_task_init( 0, 0, 0, 0);
    if (handler==null){
      // error handling
    }    
    rt_allow_nonroot_hrt();
    mlockall(MCL_CURRENT | MCL_FUTURE);
    
    //rt_set_periodic_mode();
    rt_set_oneshot_mode();
    
    RTIME period = nano2count( 1_000_000_000l );
    start_rt_timer(period);
    
    rt_make_hard_real_time();
    RTIME currentTime = rt_get_time_ns();
    while( stopCondition )
    {
      currentTime += period;
      rt_sleep_until( currentTime );
      
      // the work to do ...
    }
    
    stop_rt_timer();
    rt_make_soft_real_time();
    rt_task_delete(handler);
  }

使用这种设置,您可以实现小于 10 µs 的抖动。

华夏公益教科书