這篇文章主要講解了“UART中斷和DMA中斷的區別有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“UART中斷和DMA中斷的區別有哪些”吧!
單片機I/O設備的控制方式主要有三種:程序循環檢測、中斷驅動和直接內存訪問。
1、程序循環檢測方式
程序循環檢測方式的基本思路是:在程序(一般是設備驅動程序)當中,通過不斷地檢測I/O設備的當前狀態,來控制一個I/O操作的完成。具體來說,在進行I/O操作之前,要循環地去檢測該設備是否已經就緒。如果是,就向控制器發出一條命令,啟動這一次的I/O操作。然后,在這個操作的進行過程中,也要循環地去檢測設備的當前狀態,看它是否已經完成??傊?,在I/O操作的整個過程中,控制I/O設備的所有工作都是由CPU來完成的。這種方式也稱為是繁忙等待方式或輪詢方式。它的缺點主要是:在進行一個I/O操作的時候,要一直占用著CPU,這樣就會浪費CPU的時間。
假設I/O地址采用的是內存映像編址方式,現在需要在打印機上打印一個字符串“ABCDEFGH”。對于操作系統來說,要完成這個任務,其實很簡單,只要把這八個字符一個接一個地送到打印機設備的I/O端口地址就可以了。如圖(a)所示,這八個字符被保存在系統內核的一個緩沖區當中,并用指針p來指向它們。status_ reg 這個內存單元對應于打印機控制器里面的狀態寄存器, data register這個內存單元對應于它的數據寄存器,現在要做的事情,就是把這八個字符一個接一個地放到數據寄存器當中。
它的基本思路是:逐個去打印每一個字符。在打印一個字符之前,首先用一個while語句來檢測打印機的當前狀態,看它是否已經就緒,如果還沒有就緒,就在這里循環等待;如果已經就緒,就把當前的字符送入到打印機的數據寄存器當中。在本例中,由于采用了內存映像的編址方式,因此,在程序員眼中,狀態寄存器和數據寄存器都被看成是普通的內存單元,對它們的訪問也是普通的賦值操作,不需要專門的I/O指令。但是這個賦值操作的功能與普通的賦值操作不同,它相當于是給打印機發出了一個命令,讓它去打印一個字符。另外,每次打印完-一個字符后,都要重新判斷設備是否就緒,因為相對于CPU來說,打印機是一個慢速設備,它在執行打印命令時,不可能像CPU那么快,而是需要一定的時間來完成。因此,當CPU把一個字符交給它之后,必須循環等待一段時間, 才能去處理下一一個字符。
2、中斷驅動方式
循環檢測的控制方式,需要占用大量的CPU時間。假設打印機的打印速度為100字符/秒,在循環檢測方式下,當一個字符被寫入到打印機的數據寄存器后,CPU要等待10ms才能把下一個字符寫進去,而這10ms的時間,就在循環等待中被白白浪費掉了。為了解決這個問題,一種辦法就是讓CPU在這10ms的時間內,先去運行其他的任務,然后等打印機處理完上一個字符后,CPU再接著處理下一個字符。這種方法被稱為是中斷驅動的控制方式。它的基本思路是:當一個用戶任務需要進行I/O操作時,會去調用相應的系統函數,由這個函數來發起I/O操作,并將當前任務阻塞起來,然后調度其他的任務去使用CPU。當所需的I/O操作完成時,相應的設備就會向CPU發出一個中斷,系統在中斷處理程序當中,如果發現還有數據需要處理,就再次啟動I/O 操作。在中斷驅動的控制方式下,數據的每一次讀寫還是通過CPU來完成,只不過當I/O設備在進行數據處理時,CPU不必在那里等待,而是可以去執行其他任務。
仍以打印字符的問題為例。如下圖所示,在中斷驅動方式下,對于用戶程序來說,它所做的事情可能是:把需要打印的字符串放到一個緩沖區buffer中,然后調用一個系統調用函數print。在print 系統調用中,首先把用戶緩沖區中的字符串復制到系統內核的字符數組p當中,然后打開中斷。接下來是一個循環檢測語句,判斷打印機的當前狀態是否就緒,當打印機就緒后,就把第一個字符放到數據寄存器里面去打印。接下來,未等該字符打印完,就去調用系統的調度器,選擇另一個就緒任務去運行,而當前的這個任務,就會被阻塞起來。
當打印機完成一個字符后,將向CPU發出一個中斷。在中斷處理程序當中,首先判斷一下,如果所有的字符都已打印完,那么就去阻塞隊列中,把用戶任務喚醒,使它處于就緒狀態;如果還有字符需要打印,就直接把下一個字符復制到打印機的數據寄存器當中,啟動打印操作,而不需要再去循環地判斷打印機是否就緒。接下來是一些后繼處理,先向中斷控制器發出一個確認信號,然后結束中斷處理程序,返回到被中斷的那個任務。
3、直接內存訪問方式
在中斷驅動的控制方式下,每一次數據讀寫還是通過CPU來完成,而且每一次處理的數據量很少,如1個字節,所以中斷出現的頻率就很高。而中斷處理需要額外的系統開銷,所以也會浪費一些CPU時間。因此人們又提出了一種新的解決辦法,也就是直接內存訪問(Direct Memory Access, DMA)的控制方式。它的基本思路是:讓DMA控制器來代替CPU,完成I/O設備與內存之間的數據傳送,從而空出更多的CPU時間,去運行其他的任務。
仍以打印字符的問題為例。如下圖所示,在DMA控制方式下,用戶程序所做的事情是完全相同的,即把字符串復制到一個緩沖區buffer 當中,然后調用系統函數print。在print函數當中,首先也是把buffer 當中的字符串復制到系統內核的緩沖區p當中,然后對DMA控制器進行編程,設置它的各個寄存器的內容,包括內存起始地址、需要打印的字符個數、數據傳輸的方向等。之后,print 函數就完成了任務,所以就調用系統的調度程序,
選擇另一個就緒任務去運行,而當前的這個任務就會被阻塞起來。接下來,當CPU正在執行這個新任務的同時,DMA控制器會與設備控制器進行交互,把需要打印的字符,一個接一個地送到打印機控制器當中。在所有的字符都打印完之后,就向CPU發出一個中斷,表明這一次的I/O操作已經全部完成了。因此,在中斷處理程序里面,已經沒有什么實質性的工作,先是向中斷控制器發出一個確認信號,然后喚醒剛才被阻塞的任務。
采用DMA控制方式,最大的優點是減少了中斷的次數。原本每打印一個字符,都要產生一次中斷,而現在當所有的字符都打印完后,才會產生一個中斷,這樣就減少了中斷處理的開銷。
感謝各位的閱讀,以上就是“UART中斷和DMA中斷的區別有哪些”的內容了,經過本文的學習后,相信大家對UART中斷和DMA中斷的區別有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。