日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内核时钟

發(fā)布時(shí)間:2025/6/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核时钟 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

內(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í)間

int64_t time_stamp; int64_t milliseconds_spent;/* capture initial time stamp */ time_stamp = k_uptime_get();/* do work for some (extended) period of time */ .../* compute how long the work took (also updates the time stamp) */ milliseconds_spent = k_uptime_delta(&time_stamp);

使用高精度來測量時(shí)間

該段代碼采用硬時(shí)鐘來確定兩個時(shí)間點(diǎn)之間經(jīng)歷了多少時(shí)間

uint32_t start_time; uint32_t stop_time; uint32_t cycles_spent; uint32_t nanoseconds_spent;/* capture initial time stamp */ start_time = k_cycle_get_32();/* do work for some (short) period of time */ .../* capture final time stamp */ stop_time = k_cycle_get_32();/* compute how long the work took (assumes no counter rollover) */ cycles_spent = stop_time - start_time; nanoseconds_spent = SYS_CLOCK_HW_CYCLES_TO_NS(cycles_spent);

推薦用法

請使用基于系統(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é)

以上是生活随笔為你收集整理的内核时钟的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。