xenomai系統中timer校準簡要分析

一、背景

  Xenomai爲了提升系統的響應速度、減少響應延時在各個維度上都做了許多工作。

  其中爲了減少定時器上的延時在定時器上實時了一個叫做gravity的校準,以儘可能的消除timer響應路徑上的延時,確保定時器的響應時間更加接近用戶的期望到期時間。

二、gravity的默認值

  Xenomai初始化階段會調用xnclock_init()函數來設置默認的gravity值,邏輯如下:

static inline void xnarch_get_latencies(struct xnclock_gravity *p)
{
		unsigned int ulat;
#if CONFIG_XENO_OPT_TIMING_SCHEDLAT != 0
		ulat = CONFIG_XENO_OPT_TIMING_SCHEDLAT;
#elif defined(CONFIG_ARCH_HISI)
		ulat = 4000;
#else
		ulat = 4000;
#endif
		p->user = xnclock_ns_to_ticks(&nkclock, ulat);
		p->kernel = xnclock_ns_to_ticks(&nkclock, CONFIG_XENO_OPT_TIMING_KSCHEDLAT);
		p->irq = xnclock_ns_to_ticks(&nkclock, CONFIG_XENO_OPT_TIMING_IRQLAT);
}

xnarch_get_latencies(&gravity);
gravity.user += nktimerlat;
if (gravity.kernel == 0)
		gravity.kernel = gravity.user;
if (gravity.irq == 0)
		gravity.irq = nktimerlat;

  簡單描述一下上述代碼設置默認gravity值的邏輯:
    (1)內核中有CONFIG_XENO_OPT_TIMING_SCHEDLAT、CONFIG_XENO_OPT_TIMING_KSCHEDLAT、CONFIG_XENO_OPT_TIMING_IRQLAT三個配置項以提供給用戶來配置gravity.user、gravity.kernelgravity.irq,單位是ns。
    (2)如果CONFIG_XENO_OPT_TIMING_KSCHEDLAT或者CONFIG_XENO_OPT_TIMING_IRQLAT有設置爲非0,則gravity.kernelgravity.irq的值分別爲

xnclock_ns_to_ticks(&nkclock, CONFIG_XENO_OPT_TIMING_KSCHEDLAT)

xnclock_ns_to_ticks(&nkclock, CONFIG_XENO_OPT_TIMING_IRQLAT);


   而如果CONFIG_XENO_OPT_TIMING_SCHEDLAT設置爲非0,gravity.user的值設置爲

xnclock_ns_to_ticks(CONFIG_XENO_OPT_TIMING_SCHEDLAT) + nktimerlat;

   (3)否則內核配置爲0時,各個gravity的計算方式如下:

gravity.kernel == gravity.user = xnclock_ns_to_ticks(&nkclock, 4000) + nktimerlat;
gravity.irq = nktimerlat。


    (4)上面的nktimerlat值是多少呢?是怎麼計算的呢?這個值是在xnclock_init()中通過mach_arm_calibrate(void)來計算出一個校準值。

三、默認gravity的問題

  如果沒有手動配置CONFIG_XENO_OPT_TIMING_SCHEDLAT、CONFIG_XENO_OPT_TIMING_KSCHEDLAT、CONFIG_XENO_OPT_TIMING_IRQLAT項,xenomai會默認計算一套gravity值,旨在降低響應延時。
  然而這個默認值gravity是在xenomai啓動過程中計算的,無法真實的反應系統啓動以後的延遲情況。因而可能引發的問題是用戶設置的定時器提前到期。
  這方面的一個真實案例就是xenomai提供的默認latency測試用例中結果中出現負值、或者出現irq的響應延時比任務模式要大的情況。

四、如何拿捏gravity

  首先,如果在開發、調試階段,開發人員需要測試系統中真實的timer響應延時,則可以通過寫/proc/xenomai/clock/coreclk文件將gravity.kernel、gravity.user和gravity.irq清0。這樣timer的響應延遲就是系統當前真實的延時。
  其次,如果是在生產工程環境,可以在負載穩定時,通過/usr/xenomai/sbin/autotune對各個gravity進行校準以降低timer的延時。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章