一、背景
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.kernel和gravity.irq,單位是ns。
(2)如果CONFIG_XENO_OPT_TIMING_KSCHEDLAT或者CONFIG_XENO_OPT_TIMING_IRQLAT有設置爲非0,則gravity.kernel或gravity.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的延時。