定時器和中斷的關係,以及爲什麼應該儘量減少使用延時函數

1.關於定時器和中斷兩者的關係,以及爲什麼應該儘量選擇定時器,減少使用延時函數。

  在很長一段時間,我都以爲中斷服務函數裏的內容執行完成後,才能再一次開始計時,直到昨天晚上請教了我們副教授,我才知道原來定時器是定時器,中斷時中斷,進入中斷服務函數執行裏面內容以及執行完成後退出中斷服務函數,這些都是獨立於定時器的。

      舉個簡單的例子,我們設定TMOD = 0x01, TH0 = -9 (對於11.0592MHZ,是標準2.5ms);但是我們中斷服務函數裏的內容要3ms才能執行完成,那麼我們不可能再有機會執行主函數的內容(對於單任務的單片機是這樣的),因爲我們2.5ms進一次中斷服務函數,3ms完成一次中斷服務函數的內容,這兩個東西都是同時進行的,我們還沒完成3ms的任務,又會被打斷重新進入中斷服務函數重新執行。

     只要初始化了定時器,它就會不停的開始加,不會因爲你單片機正在處理的任何事情而中斷工作。

     中斷會打斷CPU正在做的事情,轉而處理中斷服務函數裏的事情,這裏就涉及到一個問題,對於某些時序很嚴格的工作,比如說單總線的通信,以及IIC等通信,在傳輸數據的時候是不能被打斷的,否則數據就傳輸失敗(傳輸一個字節的數據必須連續,傳輸多個字節的時候如果中途要處理更緊急的事情可以在傳輸完某個字節後暫時離開,同時對總線做一些處理,處理完後再回來繼續傳輸剩下的的字節,這也是比較特殊的情況)。所以對於一些對時序要求嚴格的程序,我們可以暫時關閉中斷,執行完後再打開中斷,但是是關閉所有中斷還是關閉部分中斷,取決於工程裏面任務的優先級,比如說板子着火了和傳輸數據比,哪個更緊急?? 但是無論如何,關閉中斷是不會對定時器產生影響的,定時器還能用。

    其實我想表達的核心呢,還是想說中斷和定時器不能一概而論,就算沒有開啓中斷, 定時器也可以用來計時,並且定時器不會因爲進入了中斷函數就停止計時。

    接下來我就能接着上面的核心,解釋爲什麼應該儘量避免延時函數,而選擇定時器了。先舉個例子,我們一節課45分鐘,假如上到40分鐘的時候老師突然出去接電話,並且唧唧歪歪了十分鐘,回來的時候已經下課5分鐘了,如果是延時函數,老師回來會繼續講五分鐘然後下課,但是如果是定時器,老師一看已經下課五分鐘了,會直接下課。每次,無論你在幹什麼,定時器都會工作,但是延時函數是隻有你執行它的時候,它才工作。

    舉個單片機工作的個例子,比如說我們的LED流水燈每50ms流動一次,我們如果用延時函數,那麼我們這50ms的間隙只能做無用功,等50ms後再流動一次,繼續做無用功,51單片機是us級的設備,讀一條指令大概1us,執行一次流水燈流動也就1us左右,卻要浪費一整個單片機。如果用定時器就不一樣了,我們可以邊執行其他程序,邊等待。

                                                                             勵志成爲一名卓越的工程師的萌新的第一篇博客                                                                                                       

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