理解嵌入式開發中的一些硬體相關的概念
阿新 • • 發佈:2019-01-29
I/O埠
前面提到了外設(晶片)),現在是對外設進行分類的時候了。大體上外設分為兩類,一類是儲存器外設,而另一類是非儲存器外設,後者常被稱之為I/O裝置,這裡的I/O是Input/Output的簡寫,即輸入、輸出。可見,I/O外設是一個非常寬泛的概念。對於儲存器外設,其特點是,它所佔用的空間是連續的一片。比如,SDRAM記憶體就是屬於儲存器外設,如果其容量是8M位元組,那麼其佔用的地址空間也會是8M的。與儲存器外設所不同的是,I/O外設所點用的地址一般都很少。比如一個I/O外設可能存在多個控制暫存器,這些控制暫存器從處理器來看就是多個I/O埠(地址),向這個地址寫資料就是向外設所對應的暫存器寫資料,反之,也可以是讀。比如,一個串列埠晶片可能存在多個暫存器,一個用來查詢晶片的狀態,一個用來設定晶片的功能,另一個用來讀取晶片從串列埠線所收到的資料,最後,還有一個用來向晶片寫資料以向串列埠線上傳送資料。對於這一串列埠晶片的暫存器,從處理器的角度來看,都是獨立的I/O埠。I/O埠存在讀、寫性問題,有的埠是隻讀的,有的埠是隻寫的,還有的埠是即可讀也可寫,其讀寫性是由外設晶片的暫存器所決定的,在晶片的資料手冊中能找到。需要指出的是,有些儲存器外設也存在I/O埠,以對其進行一定的控制。從I/O埠這一名字來看,對於處理器來說,就是對從外面讀入資料或是向外面輸出資料的一個介面總稱。
中斷
中斷從硬體的角度來看就是一個能產生高、低電平的一根訊號線,但理解它需要從處理器的角度出發。我們說過了,處理器從微觀上看,所做的工作是按順序進行的,其對程式的處理只能是一條指令一條指令的執行。如果存在需要對外設晶片進行訪問,而有可能從處理器發出讀、寫命令後,由於外設通常比處理器慢很多,所以外設晶片需要一些時間來準備好所需的資料。在這種情況下,如果處理器一直等外設晶片的返回資料再執行後續的指令的話,將耗費寶貴的時間,這些時間完全可以用來做其它的工作。別忘了,從巨集觀上看來處理器常常是多工的,任務是指作業系統所提供的排程單位。當一個任務因為等待外設晶片的資料而阻塞時,我們可以切換到另外的任務,從而提高處理效率。這就有一個問題,當處理器去處理另一個任務時,如果外設晶片的資料好了的話,如果告訴處理器呢?對了!就是通過中斷訊號。中斷訊號的高、低電平可以用來表示是否有中斷需要處理器注意以處理特定的事件(比如,外設資料準備好了的事件)。由此看來,中斷的引入能大大的提高處理器的運用效率。為了使用處理器上的中斷,一開始我們需要初始化好處理器的中斷控制器,比如安裝好所需的中斷服務程式或稱之為ISR(Interrupt Service Routine),然後,開啟中斷遮蔽位。中斷服務程式中需要做如下的操作:
- 從外設讀入或向外設寫資料。讀還是寫通常需要讀取外設的中斷狀態暫存器來決定。
- 清除外設的中斷訊號。我們知道,中斷訊號是由外設晶片驅動的,為了告訴外設晶片,處理器已經處理完了所需做的工作,那麼處理器需要通過一定的方式通知外設晶片。這種方式就是向外設晶片的暫存器中的某一位寫入一個數據,比如,可能是寫入1表示清中斷,也可能是寫入0表示清中斷,這通常在外設的資料手冊中能查到。當外設收到了處理器的清中斷請求後,其就會驅動中斷線使其無效。比如,一個外設的中斷線是當其為低電平表示有中斷,將其從低電平變為高電平就是驅動為無效。
- 清除處理器的中斷訊號標識。處理器中往往也會儲存外部中斷訊號是否發生過,當我們處理完了外設晶片的中斷時,我們也需要清除處理器上的標識,從而為下一次中斷做準備。需要注意的是,清外設的中斷必須發生在請處理器中斷標識之前!