跳轉到內容

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 的抖動。

華夏公益教科書