悟空學Linux專欄----第23篇

  沙僧最近比較鬱悶,他的老闆知道他最近學了高精度定時器,就要他實現一個精度誤差小於100us的高精度定時器。可是沙僧上課都在睡覺,那裏會高精度定時器,所以他跑去找悟空幫忙。

  悟空聽沙僧說完之後,想也沒想就答應了沙僧。悟空心想高精度定時器的精度能夠達到ns級別,實現100us應該很簡單。悟空按照達人先生教的方法,很快實現了高精度定時器,爲了測試誤差,悟空直接在高精度定時器的“struct hrtimer”結構體中的function掛鉤函數中實現了誤差延時打印。然而這個測試結果讓悟空嚇了一跳,因爲測試出來的誤差竟然有900us,這個結果和低分辨率的定時器的時間誤差沒有多大區別。

  悟空的第一反應就是自己在做夢,所以悟空狠狠的踢了沙僧一腳,踢完之後悟空知道自己不是在做夢了,雖然沙僧只是稍微動了一下又繼續睡了,但是悟空感到了自己的腳很疼。悟空無法理解,明明達人老師說了高精度定時器能夠實現ns級別的定時,但是測試的結果竟然有這麼大的誤差,難道自己學了這麼久的高精度定時器又和低分辨率的定時器一樣白學了嗎?

  悟空的第二反應就是夜訪達人,所以悟空拿着自己寫的程序,飛快的來到了達人的門前。

  悟空:老師,爲什麼我寫的高精度定時器的誤差測試竟然有900us啊?

  達人看了悟空的程序之後,對悟空:你這個程序違背了一個“潛規則”,就是你不能在高精度定時器的“function”函數中加入“printk”打印函數。因爲高精度定時器的執行體“function”函數其實是在中斷中執行的,而Linux儘量避免在中斷中調用“printk”函數,因爲調用這個函數會大大延長中斷執行體的執行時間。但是Linux並沒有禁止在中斷中執行“printk”函數,只是儘量避免,所以這個被稱爲一條潛規則。

  悟空:老師這是不是和八戒給你送禮,你就對八戒特別關照是一樣的道理啊。

  達人:這個…這個...哦對了,其實延時這麼大還有一個原因,就是系統的關中斷時間,也會影響延時的。

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