Tick工作原理其實就是硬件定時器的工作原理,1個系統(tǒng)tick就代表一個定時器硬件中斷。定時器的工作原理很簡單,就是內(nèi)部有一個遞減的計數(shù)器,當(dāng)減到0時產(chǎn)生一個中斷,如圖 1-1所示:
成都創(chuàng)新互聯(lián)公司是專業(yè)的烏拉特后網(wǎng)站建設(shè)公司,烏拉特后接單;提供網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行烏拉特后網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
圖 1-1定時器工作原理
假設(shè)定時器模塊的輸入頻率是1MHz,系統(tǒng)定義的1S內(nèi)tick數(shù)是100,也就是100Hz,可以計算出遞減計數(shù)器要設(shè)置的值為1MHz/100Hz=10000??梢钥闯鲞f減計數(shù)器相當(dāng)于一個分頻器,輸入端每來一個脈沖,其值就減去1,當(dāng)減到0時產(chǎn)生一個中斷,同時其值自動重載成10000,如此循環(huán)下去。
系統(tǒng)獲取時間相關(guān)接口是基于tick來工作的,但是這是有誤差的,如圖 2-1所示:
圖 2-1系統(tǒng)獲取時間
虛線表示下一個tick中斷還未產(chǎn)生,如果此時來獲取時間,獲取到的時間只是之前tick累計的時間。假設(shè)tick中斷產(chǎn)生時刻和獲取時間那一時刻之間的跨度是4ms,那么獲取的時間就有4ms的誤差,高精度時鐘就是為了消除這種誤差而誕生的。
上述誤差產(chǎn)生的根本原因是沒有將tick中斷產(chǎn)生時刻和獲取時間那一時刻之間的跨度更新到時間里去,如果計算出這段時間并加到獲取的時間里去就可以校正獲取的時間了。結(jié)合圖 1-1和圖 2-1,基本的校正原理如下所述:
1個tick時間等價于遞減計數(shù)器的初始值,假設(shè)是10000,也就是說遞減10000次相當(dāng)于過了一個tick時間
用1000 * 1000 * 1000 / 10000得到遞減一次的時間,單位是ns
用計數(shù)器初始值減去獲取時間那一時刻計數(shù)器中的值,就得到了獲取時間時刻計數(shù)器已經(jīng)遞減的次數(shù)
用遞減一次的時間 *遞減的次數(shù),就得到tick中斷產(chǎn)生時刻和獲取時間那一時刻之間的時間跨度
當(dāng)系統(tǒng)是多核時,系統(tǒng)產(chǎn)生一個由CPU0來處理的tick中斷,當(dāng)CPU0還沒有更新整個系統(tǒng)的tick數(shù)時,這時CPU1來獲取時間,按照基本原理的計算之后還要加上一個tick的時間才是正確的。
程序清單 4-1
VOID bspTickHighResolution (struct timespec *ptv)
{
REGISTER UINT32 uiCntCur, uiDone;
uiCntCur = (UINT32)timerGetCnt(4);
uiDone = GuiFullCnt - uiCntCur;
/*
*檢查是否有 TICK中斷請求
*/
if (rSRCPND & BIT_TIMER4) {
/*
*這里由于 TICK沒有及時更新,所以需要重新獲取并且加上一個 TICK的時間
*/
uiCntCur = (UINT32)timerGetCnt(4);
uiDone = GuiFullCnt - uiCntCur;
if (uiCntCur != 0) {
uiDone += GuiFullCnt;
}
}
ptv->tv_nsec += (LONG)((Gui64NSecPerCnt7 * uiDone) >> 7);
if (ptv->tv_nsec >= 1000000000) {
ptv->tv_nsec -= 1000000000;
ptv->tv_sec++;
}
}
GuiFullCnt表示遞減計數(shù)器的初始值,也就是產(chǎn)生1個tick時間的計數(shù)值;Gui64NSecPerCnt7表示遞減一次的時間,但是這個時間被擴(kuò)大了128倍,目的是為了提高計算精度
uiDone表示獲取時間時刻計數(shù)器已經(jīng)遞減的次數(shù),uiCntCur表示獲取時間時刻計數(shù)器當(dāng)前值
if (rSRCPND & BIT_TIMER4)用于特殊情況的判斷,條件成立表示系統(tǒng)的tick數(shù)還沒來得及更新,不成立表示系統(tǒng)的tick數(shù)已經(jīng)被更新
當(dāng)uiCntCur=0時,表示tick中斷剛剛產(chǎn)生,這時uiDone就已經(jīng)代表一個tick的計數(shù)值,所以就無需再加上一個tick的計數(shù)值了
最后將修正后的時間賦值給tv_nsec成員
網(wǎng)站題目:SylixOS高精度時鐘分析
轉(zhuǎn)載源于:http://aaarwkj.com/article24/pjcoce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、App設(shè)計、全網(wǎng)營銷推廣、建站公司、用戶體驗、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)