時鐘-給設備打拍子
概述
在計算機系統中,為了使所有設備之間的通信井然有序,各通信設備間必須有統一的節奏,不能各干各的,這個節奏就被稱為定時或時鐘
時鐘并不是計算機處理速度的衡量,而是一種使設備間相互配合而避免發生沖突的節拍。時鐘只是一種時間的度量,只是一種節奏,其時間長度并不統一,各種設備都有自己的時鐘,也就是有自己的工作節拍
- 比如處理器的時鐘和外部設備的時鐘肯定不是一個數量級
- 讓處理器這種高速設備以外部設備低速時鐘工作,處理器肯定會覺得很閑
- 而讓低速的外部設備以處理器的時鐘節拍工作,外部設備也許急得不知所措
時鐘信號并不是專指處理器的時鐘,也并不特指IRQ0上的時鐘,表達的意思僅僅是設備自己的工作節拍、頻率
時鐘的分類
內部時鐘
內部時鐘是指處理器中內部元件,如運算器、控制器的工作時序,主要用于控制、同步內部工作過程的步調
內部時鐘是由晶體振蕩器產生的,簡稱晶振,它位于主板上,其頻率經過分頻之后就是主板的外頻,處理器和南北橋之間的通信就基于外頻
Intel處理器將此外頻乘以某個倍數(也稱為倍頻)之后便稱為主頻
處理器取指令、執行指令中所消耗的時鐘周期,都是基于主頻的。內部時鐘是由處理器固件結構決定的
外部器內部元件的工作速度是最快的,所有內部時鐘的時間單位粒度比較精細,通常都是納秒(ns)級
外部時鐘
外部時鐘是指處理器與外部設備或外部設備之間通信采用的一種時序,比如IO接口和處理器之間在A/D轉換時的工作時序、兩個串口設備之間進行數據傳輸時也要事先同步時鐘等
外部設備的速度對于處理器來說就很慢了,所以其時鐘的時間單位粒度較大,一般是毫秒(ms)級或秒(s)級
如何保證運行在不同時鐘節拍下的設備能夠同步通信?
應以處理器的內部時鐘為依據來設計外部設備的時鐘,既要符合處理器內部運行時序的規定,又要滿足外部設備工作時序的要求
定時計數器就是用來解決時序配合問題的
已知處理器的內部時鐘信號有晶振產生,故計時精準穩定。但晶振產生的信號頻率過高,因此必須將其送到定時計數器分頻,這才能產生所需要的各種定時信號
外部定時
軟件實現
int cycle_cnt = 90000;
while (cycle_cnt --> 0)
讓處理器執行9萬次空循環,通過這種延遲方式達到一定的定時作用
但這種空兜處理器的代價是白白消耗時鐘周期,處理器的資源是很寶貴的
硬件實現
這一類硬件稱為定時器
計時器的功能就是定時發信號。當到達了所計數的時間,計數器可以自動發一個輸出信號,可以用該信號向處理器發出中斷,這樣處理器可以執行相應的中斷處理程序。或者用該信號直接啟動某些外部設備
硬件定時器是獨立的,可以同處理器并行工作,所以用硬件定時器定時的好處是節省處理器時間
可編程定時計數器
常用可編程定時計數器有 Intel 8253/8254/82C54。8253用的是倒計時的方式
如何修改計數值?
正計時
每一次時鐘脈沖發生時,將當前計數值加1,直到與設定的目標終止值相等時,提示時間已到,典型的例子就是鬧鐘
倒計時
先設定好計數器的值,每一次時鐘脈沖發生時將計數值減1,直到為0時提示時間已到,典型的例子就是電風扇的定時
8253入門
8253結構
在8253內部有3個獨立的計數器,圖7-45
的右側的3個計數器,分別是計數器0計數器2,它們的端口分別是0x400x42
計數器又稱為通道,每個計數器都完全相同,都是16位大小
它們是獨立的,也就是這三個計數器的工作是不依賴的,可以同時工作,各干各的。原因是各個計數器都有自己的一套寄存器資源,工作時自己用自己的,互不干涉
寄存器資源包括一個16位的計數初值寄存器、一個計數器執行部件和一個輸出鎖存器。其中,計數器執行部件是計數器中真正進行計數工作的元器件,其本質是個減法計數器
計數器的三個引角: CLK、GATE、OUT
CLK
CLK 表示時鐘輸入信號,即計數器自己工作的節拍,也就是計數器自己的時鐘頻率
每當此引腳收到一個時鐘信號,減法計數器就將計數值減1
連接到此引腳的脈沖頻率最高位10MHz, 8253為2MHz
GATE
GATE表示門控輸入信號,在某些工作方式下用于控制計數器是否可以開始計數,在不同工作方式下GATE的作用不同,到時候同工作方式一同介紹
OUT
OUT表示計數器輸出信號。當定時工作結束,也就是計數值為0時,根據計數器的工作方式,會在OUT引腳上輸出相應的信號
此信號用來通知處理器或某個設備:定時完成
這樣處理器或外部設備便可以執行相應的行為動作
計數流程
計數開始之前的計數初值保存在計數初值寄存器中,計數器執行部件(減去計數器)將此初值載入后,計數器的CLK引腳每收到一個脈沖信號,計數器執行部件(減法計數器)便將計數值減1,同時將當前計數值保存在輸出鎖存器
當計數值減到0時,表示定時工作結束,此時將通過OUT引腳發出信號,此信號可以用來向處理器發出中斷請求,也可以直接啟動某個設備工作
計數器內部各個結構的功能
計數初值寄存器、計數器執行部件和輸出鎖存器都是16位寬度的寄存器,所有高8位和低8位都可以單獨訪問
計數初值寄存器
計數初值寄存器用來保存計數器的初始值,它是16位寬度,對8253初始化時寫入的計數初始值就保存在計數計數初值寄存器
它的作用是為計數器執行部件準備初始計數值,之后的計數過程與它無關。當計數器選擇了某種重復計數的工作方式后,比如工作方式2和工作方式3,還需要將此計數初值重新裝載到計數器執行部件中
計數器執行部件是計數器中真正“計數”的部件,計數的工作是由計數器執行部件完成的,所以它才是真正實際的計數器
減法計數器
8283是個倒計時計數器,原因是計數器執行部件是個16位的減法計數器,它從初值寄存器中拿到起始值,載入到自己的寄存器后便開始遞減計數(注意:計數過程中不斷變化的值稱為當前計數值,它保存在執行部件自己的寄存器中,初值寄存器中的值不受影響)
輸出鎖存器
輸出鎖存器也稱為當前計數值鎖存器,用于把當前減去計數器中的計數值保存下來,其目的就是為了讓外界可以隨時獲取當前計數器
計數器中的計數值是不斷變化的,處理器無法直接從計數器中獲取當前計數值
原因是這樣的
- 計數器的使命就是通過計數的方式實現定時功能,必須要求精準,所有絕不能為了獲取計數值而停止計數
為了獲取任意時刻的計數值,8253只有將它送到輸出寄存器,此鎖存器起到暫存寄存器的作用。這樣處理器便能從輸出鎖存器中獲取瞬時計數值
8253 計數器
計數器0的作用是產生時鐘信號,這個時鐘是指連接到主片IRQ0引腳上的那個時鐘,也就是計數器0決定時鐘中斷信號的發生頻率
參考資料
- 可編程定時計數器8253/8254
- 8253(8254)計時/計數器簡介