内核时钟
內(nèi)核時(shí)鐘
內(nèi)核時(shí)鐘是所有時(shí)間相關(guān)服務(wù)的基礎(chǔ)
概念
內(nèi)核支持兩種不同的時(shí)鐘,分別如下:
①32位的硬件時(shí)鐘:是以周期為單位來度量時(shí)間的一個高精度的計(jì)數(shù)器。一個周期的長度取決于內(nèi)核所使用的板卡硬件,其典型的度量值為納秒
②64位的系統(tǒng)時(shí)鐘:?是一個通過嘀嗒來測量內(nèi)核自初始化以來經(jīng)歷了多少時(shí)間的計(jì)數(shù)器,嘀嗒的時(shí)長是可配置的,其典型值為1~100毫秒
? ? 內(nèi)核同時(shí)提供了各種將時(shí)鐘使用的時(shí)間單位轉(zhuǎn)換為標(biāo)準(zhǔn)的時(shí)間單位的變量(如秒,毫秒,納秒等等),也可用于兩種不同時(shí)間單位之間的轉(zhuǎn)換
系統(tǒng)時(shí)鐘被內(nèi)核中大部分時(shí)間相關(guān)的服務(wù)所使用,包括內(nèi)核定時(shí)器對象和其它內(nèi)核對象類型支持的超時(shí)服務(wù)。為了方便使用,內(nèi)核的API允許使用毫秒來定義時(shí)間長度,并自動將毫秒時(shí)間轉(zhuǎn)換為對應(yīng)的嘀嗒數(shù)
硬時(shí)鐘可以用于更高精度的計(jì)時(shí),可以完成比系統(tǒng)時(shí)鐘精度更高的時(shí)間相關(guān)服務(wù)
時(shí)鐘的局限性
系統(tǒng)時(shí)鐘的嘀嗒計(jì)數(shù)是從硬時(shí)鐘的周期數(shù)衍生出來的。由內(nèi)核決定多少個時(shí)鐘周期和期望的嘀嗒頻率相對應(yīng),然后配置硬件在指定的周期后產(chǎn)生一個中斷;每個中斷對應(yīng)一個嘀嗒周期
note:配置一個較短的嘀嗒時(shí)間長度可以保證一個較小時(shí)間顆粒度,但同時(shí)增加也了大量的工作,讓內(nèi)核處理更高頻率的嘀嗒中斷。設(shè)置嘀嗒時(shí)間長度為0,則會關(guān)閉?兩個內(nèi)核時(shí)鐘及其相關(guān)的服務(wù)
任何通過內(nèi)核API指定的毫秒時(shí)間間隔代表的是可發(fā)生的最小延時(shí),所以實(shí)際經(jīng)歷的時(shí)間可能比設(shè)置的要更長
例如:當(dāng)嘗試獲取一個信號量并指定一個100ms超時(shí)延時(shí)時(shí),那么在這100ms結(jié)束之前內(nèi)核將不會終止該操作并報(bào)告錯誤。然而,該操作可能需要超過100ms的時(shí)間才能完成,并且可能在多出的時(shí)間里操作成功或者在超時(shí)結(jié)尾失敗
在一個內(nèi)核對象操作中,多出的額外時(shí)間的長度由如下因素決定:
①在將毫秒轉(zhuǎn)換為嘀嗒數(shù)時(shí)的舍入,將引入額外的時(shí)間。例如:如果使用了一個時(shí)長為10ms的嘀嗒,則25ms的延時(shí)將舍入為30ms
②因?yàn)樵谘訒r(shí)計(jì)時(shí)之前需要等待下一次的嘀嗒中斷,所以這種情況將引入額外的事件。例如:如果采用了一個時(shí)長為10ms的嘀嗒,則設(shè)定20ms的延時(shí)需要內(nèi)核等待3個嘀嗒發(fā)生(而不是2個),因?yàn)榈谝粋€嘀嗒可能在任何時(shí)刻,而計(jì)時(shí)點(diǎn)到嘀嗒中斷很可能小于10ms;所以只有在第一個嘀嗒發(fā)生之后,內(nèi)核可以通過后續(xù)的兩個嘀嗒來確定延時(shí)了20ms
實(shí)現(xiàn)
使用標(biāo)準(zhǔn)精度來測量時(shí)間
該段代碼采用系統(tǒng)時(shí)鐘來確定兩個時(shí)間點(diǎn)之間經(jīng)歷了多少時(shí)間
使用高精度來測量時(shí)間
該段代碼采用硬時(shí)鐘來確定兩個時(shí)間點(diǎn)之間經(jīng)歷了多少時(shí)間
推薦用法
①請使用基于系統(tǒng)時(shí)鐘的服務(wù)來執(zhí)行不需要高精度的時(shí)間相關(guān)處理,如軟件定時(shí)器對象或者線程睡眠
②請使用基于硬時(shí)鐘的服務(wù)來執(zhí)行需要精度高于系統(tǒng)時(shí)鐘的時(shí)間相關(guān)處理,如忙等待,或時(shí)間顆粒度更小的時(shí)間相關(guān)的處理
note:當(dāng)硬時(shí)鐘頻率很高時(shí),32位計(jì)數(shù)器很容易溢出并從零開始循環(huán)。所以采用高精度的時(shí)間測量時(shí),需要考慮這種超過一個計(jì)數(shù)周期的情況
配置
相關(guān)的配置選項(xiàng):
- CONFIG_SYS_CLOCK_TICKS_PER_SEC
APIs
下面的內(nèi)核時(shí)鐘APIs都定義在kernel.h中:
- k_uptime_get()
- k_uptime_get_32()
- k_uptime_delta()
- k_uptime_delta_32()
- k_cycle_get_32()
- SYS_CLOCK_HW_CYCLES_TO_NS
- K_NO_WAIT
- K_MSEC
- K_SECONDS
- K_MINUTES
- K_HOURS
- K_FOREVER?
總結(jié)