這篇文章主要講解了“UART中斷和DMA中斷的區(qū)別有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“UART中斷和DMA中斷的區(qū)別有哪些”吧!

單片機(jī)I/O設(shè)備的控制方式主要有三種:程序循環(huán)檢測(cè)、中斷驅(qū)動(dòng)和直接內(nèi)存訪問。
1、程序循環(huán)檢測(cè)方式
程序循環(huán)檢測(cè)方式的基本思路是:在程序(一般是設(shè)備驅(qū)動(dòng)程序)當(dāng)中,通過不斷地檢測(cè)I/O設(shè)備的當(dāng)前狀態(tài),來控制一個(gè)I/O操作的完成。具體來說,在進(jìn)行I/O操作之前,要循環(huán)地去檢測(cè)該設(shè)備是否已經(jīng)就緒。如果是,就向控制器發(fā)出一條命令,啟動(dòng)這一次的I/O操作。然后,在這個(gè)操作的進(jìn)行過程中,也要循環(huán)地去檢測(cè)設(shè)備的當(dāng)前狀態(tài),看它是否已經(jīng)完成。總之,在I/O操作的整個(gè)過程中,控制I/O設(shè)備的所有工作都是由CPU來完成的。這種方式也稱為是繁忙等待方式或輪詢方式。它的缺點(diǎn)主要是:在進(jìn)行一個(gè)I/O操作的時(shí)候,要一直占用著CPU,這樣就會(huì)浪費(fèi)CPU的時(shí)間。
假設(shè)I/O地址采用的是內(nèi)存映像編址方式,現(xiàn)在需要在打印機(jī)上打印一個(gè)字符串“ABCDEFGH”。對(duì)于操作系統(tǒng)來說,要完成這個(gè)任務(wù),其實(shí)很簡(jiǎn)單,只要把這八個(gè)字符一個(gè)接一個(gè)地送到打印機(jī)設(shè)備的I/O端口地址就可以了。如圖(a)所示,這八個(gè)字符被保存在系統(tǒng)內(nèi)核的一個(gè)緩沖區(qū)當(dāng)中,并用指針p來指向它們。status_ reg 這個(gè)內(nèi)存單元對(duì)應(yīng)于打印機(jī)控制器里面的狀態(tài)寄存器, data register這個(gè)內(nèi)存單元對(duì)應(yīng)于它的數(shù)據(jù)寄存器,現(xiàn)在要做的事情,就是把這八個(gè)字符一個(gè)接一個(gè)地放到數(shù)據(jù)寄存器當(dāng)中。
它的基本思路是:逐個(gè)去打印每一個(gè)字符。在打印一個(gè)字符之前,首先用一個(gè)while語句來檢測(cè)打印機(jī)的當(dāng)前狀態(tài),看它是否已經(jīng)就緒,如果還沒有就緒,就在這里循環(huán)等待;如果已經(jīng)就緒,就把當(dāng)前的字符送入到打印機(jī)的數(shù)據(jù)寄存器當(dāng)中。在本例中,由于采用了內(nèi)存映像的編址方式,因此,在程序員眼中,狀態(tài)寄存器和數(shù)據(jù)寄存器都被看成是普通的內(nèi)存單元,對(duì)它們的訪問也是普通的賦值操作,不需要專門的I/O指令。但是這個(gè)賦值操作的功能與普通的賦值操作不同,它相當(dāng)于是給打印機(jī)發(fā)出了一個(gè)命令,讓它去打印一個(gè)字符。另外,每次打印完-一個(gè)字符后,都要重新判斷設(shè)備是否就緒,因?yàn)橄鄬?duì)于CPU來說,打印機(jī)是一個(gè)慢速設(shè)備,它在執(zhí)行打印命令時(shí),不可能像CPU那么快,而是需要一定的時(shí)間來完成。因此,當(dāng)CPU把一個(gè)字符交給它之后,必須循環(huán)等待一段時(shí)間, 才能去處理下一一個(gè)字符。
2、中斷驅(qū)動(dòng)方式
循環(huán)檢測(cè)的控制方式,需要占用大量的CPU時(shí)間。假設(shè)打印機(jī)的打印速度為100字符/秒,在循環(huán)檢測(cè)方式下,當(dāng)一個(gè)字符被寫入到打印機(jī)的數(shù)據(jù)寄存器后,CPU要等待10ms才能把下一個(gè)字符寫進(jìn)去,而這10ms的時(shí)間,就在循環(huán)等待中被白白浪費(fèi)掉了。為了解決這個(gè)問題,一種辦法就是讓CPU在這10ms的時(shí)間內(nèi),先去運(yùn)行其他的任務(wù),然后等打印機(jī)處理完上一個(gè)字符后,CPU再接著處理下一個(gè)字符。這種方法被稱為是中斷驅(qū)動(dòng)的控制方式。它的基本思路是:當(dāng)一個(gè)用戶任務(wù)需要進(jìn)行I/O操作時(shí),會(huì)去調(diào)用相應(yīng)的系統(tǒng)函數(shù),由這個(gè)函數(shù)來發(fā)起I/O操作,并將當(dāng)前任務(wù)阻塞起來,然后調(diào)度其他的任務(wù)去使用CPU。當(dāng)所需的I/O操作完成時(shí),相應(yīng)的設(shè)備就會(huì)向CPU發(fā)出一個(gè)中斷,系統(tǒng)在中斷處理程序當(dāng)中,如果發(fā)現(xiàn)還有數(shù)據(jù)需要處理,就再次啟動(dòng)I/O 操作。在中斷驅(qū)動(dòng)的控制方式下,數(shù)據(jù)的每一次讀寫還是通過CPU來完成,只不過當(dāng)I/O設(shè)備在進(jìn)行數(shù)據(jù)處理時(shí),CPU不必在那里等待,而是可以去執(zhí)行其他任務(wù)。
仍以打印字符的問題為例。如下圖所示,在中斷驅(qū)動(dòng)方式下,對(duì)于用戶程序來說,它所做的事情可能是:把需要打印的字符串放到一個(gè)緩沖區(qū)buffer中,然后調(diào)用一個(gè)系統(tǒng)調(diào)用函數(shù)print。在print 系統(tǒng)調(diào)用中,首先把用戶緩沖區(qū)中的字符串復(fù)制到系統(tǒng)內(nèi)核的字符數(shù)組p當(dāng)中,然后打開中斷。接下來是一個(gè)循環(huán)檢測(cè)語句,判斷打印機(jī)的當(dāng)前狀態(tài)是否就緒,當(dāng)打印機(jī)就緒后,就把第一個(gè)字符放到數(shù)據(jù)寄存器里面去打印。接下來,未等該字符打印完,就去調(diào)用系統(tǒng)的調(diào)度器,選擇另一個(gè)就緒任務(wù)去運(yùn)行,而當(dāng)前的這個(gè)任務(wù),就會(huì)被阻塞起來。
當(dāng)打印機(jī)完成一個(gè)字符后,將向CPU發(fā)出一個(gè)中斷。在中斷處理程序當(dāng)中,首先判斷一下,如果所有的字符都已打印完,那么就去阻塞隊(duì)列中,把用戶任務(wù)喚醒,使它處于就緒狀態(tài);如果還有字符需要打印,就直接把下一個(gè)字符復(fù)制到打印機(jī)的數(shù)據(jù)寄存器當(dāng)中,啟動(dòng)打印操作,而不需要再去循環(huán)地判斷打印機(jī)是否就緒。接下來是一些后繼處理,先向中斷控制器發(fā)出一個(gè)確認(rèn)信號(hào),然后結(jié)束中斷處理程序,返回到被中斷的那個(gè)任務(wù)。
3、直接內(nèi)存訪問方式
在中斷驅(qū)動(dòng)的控制方式下,每一次數(shù)據(jù)讀寫還是通過CPU來完成,而且每一次處理的數(shù)據(jù)量很少,如1個(gè)字節(jié),所以中斷出現(xiàn)的頻率就很高。而中斷處理需要額外的系統(tǒng)開銷,所以也會(huì)浪費(fèi)一些CPU時(shí)間。因此人們又提出了一種新的解決辦法,也就是直接內(nèi)存訪問(Direct Memory Access, DMA)的控制方式。它的基本思路是:讓DMA控制器來代替CPU,完成I/O設(shè)備與內(nèi)存之間的數(shù)據(jù)傳送,從而空出更多的CPU時(shí)間,去運(yùn)行其他的任務(wù)。
仍以打印字符的問題為例。如下圖所示,在DMA控制方式下,用戶程序所做的事情是完全相同的,即把字符串復(fù)制到一個(gè)緩沖區(qū)buffer 當(dāng)中,然后調(diào)用系統(tǒng)函數(shù)print。在print函數(shù)當(dāng)中,首先也是把buffer 當(dāng)中的字符串復(fù)制到系統(tǒng)內(nèi)核的緩沖區(qū)p當(dāng)中,然后對(duì)DMA控制器進(jìn)行編程,設(shè)置它的各個(gè)寄存器的內(nèi)容,包括內(nèi)存起始地址、需要打印的字符個(gè)數(shù)、數(shù)據(jù)傳輸?shù)姆较虻取V螅琾rint 函數(shù)就完成了任務(wù),所以就調(diào)用系統(tǒng)的調(diào)度程序,
選擇另一個(gè)就緒任務(wù)去運(yùn)行,而當(dāng)前的這個(gè)任務(wù)就會(huì)被阻塞起來。接下來,當(dāng)CPU正在執(zhí)行這個(gè)新任務(wù)的同時(shí),DMA控制器會(huì)與設(shè)備控制器進(jìn)行交互,把需要打印的字符,一個(gè)接一個(gè)地送到打印機(jī)控制器當(dāng)中。在所有的字符都打印完之后,就向CPU發(fā)出一個(gè)中斷,表明這一次的I/O操作已經(jīng)全部完成了。因此,在中斷處理程序里面,已經(jīng)沒有什么實(shí)質(zhì)性的工作,先是向中斷控制器發(fā)出一個(gè)確認(rèn)信號(hào),然后喚醒剛才被阻塞的任務(wù)。
采用DMA控制方式,較大的優(yōu)點(diǎn)是減少了中斷的次數(shù)。原本每打印一個(gè)字符,都要產(chǎn)生一次中斷,而現(xiàn)在當(dāng)所有的字符都打印完后,才會(huì)產(chǎn)生一個(gè)中斷,這樣就減少了中斷處理的開銷。
感謝各位的閱讀,以上就是“UART中斷和DMA中斷的區(qū)別有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)UART中斷和DMA中斷的區(qū)別有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享題目:UART中斷和DMA中斷的區(qū)別有哪些-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://chinadenli.net/article4/shgie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、定制開發(fā)、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化、網(wǎng)站建設(shè)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容