<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 淺談51單片機(jī)的RETI指令

          淺談51單片機(jī)的RETI指令

          作者: 時(shí)間:2012-12-05 來(lái)源:網(wǎng)絡(luò) 收藏
          最近在基于編程的過(guò)程中出現(xiàn)了個(gè)很奇怪的問(wèn)題“程序執(zhí)行中在寄存器EA=1,ET0=1,TR0=1條件下,單TF0=1時(shí)并沒(méi)有執(zhí)行中斷”。在有過(guò)單片機(jī)中斷編程經(jīng)歷者都知道當(dāng)EA=1,ET0=1的條件下,滿(mǎn)足TF0=1時(shí),如果在此期間沒(méi)有更高優(yōu)先級(jí)的中斷執(zhí)行的情況下定時(shí)器中斷0必定會(huì)產(chǎn)生中斷響應(yīng)。而在我所編寫(xiě)的程序中僅使用了定時(shí)器中斷0,一個(gè)中斷也就談不上存在優(yōu)先級(jí)問(wèn)題。經(jīng)過(guò)我對(duì)自己程序的檢查并對(duì)各教材中斷程序?qū)Ρ劝l(fā)現(xiàn)我的程序中的一個(gè)問(wèn)題:由于中斷的不可控性決定其跳出中斷返回主程序的不確定,而由于程序需要中斷跳出后能跳到指定的地址。為了解決這個(gè)問(wèn)題我在中斷結(jié)束的地方直接用了無(wú)條件跳轉(zhuǎn)指令“LJMP ADR16”其中ADR16是我想在中斷結(jié)束后程序所運(yùn)行的地址,而沒(méi)有經(jīng)過(guò)指令“RETI”。問(wèn)題找到了這就意味著我的程序和其他程序不同的地方就是沒(méi)有執(zhí)行“RETI”而直接跳出。

          為了解決問(wèn)題所在我查閱了很多單片機(jī)方面的資料,教材。幾乎所有的教材對(duì)指令“RETI”的作用千篇一律都是:“中斷程序完成后,一定要執(zhí)行一條,執(zhí)行這條指令后,CPU將會(huì)把堆棧中保存著的地址取出,送回PC,那么程序就會(huì)從主程序的中斷處繼續(xù)往下執(zhí)行了?!比绻癛ETI”的作用僅僅在于“把堆棧中保存著的地址取出送回PC”;那么我用指令“POP DPH”和“POP DPL”兩條指令取代其做用不就可以達(dá)到同樣的推出地址的效果么?這樣可以解決由于只有進(jìn)堆棧指令(硬件自動(dòng)生成)沒(méi)有出堆棧所導(dǎo)致的堆棧溢出錯(cuò)誤,但是并不能解決文章開(kāi)始所提到的“進(jìn)不了中斷”問(wèn)題。這讓我更加相信書(shū)上所介紹的關(guān)于指令“RETI”作用并不完全。經(jīng)過(guò)查閱各種資料文獻(xiàn),我發(fā)現(xiàn)了個(gè)以往在介紹單片機(jī)硬件,以及寄存器上教材,老師,沒(méi)有提及的“‘優(yōu)先級(jí)生效’觸發(fā)器“的概念。資料指出“根據(jù)8051的結(jié)構(gòu)特點(diǎn),其中斷系統(tǒng)中含有兩個(gè)不可尋址的“優(yōu)先級(jí)生效”觸發(fā)器。一個(gè)用于指出CPU是否正在執(zhí)行高優(yōu)先級(jí)的中斷服務(wù)程序,這個(gè)觸發(fā)器為1時(shí),系統(tǒng)將屏蔽所有的中斷請(qǐng)求;另一個(gè)則指出CPU是否正在執(zhí)行低優(yōu)先級(jí)中斷服務(wù)程序,該觸發(fā)器為1時(shí),將阻止除高優(yōu)先級(jí)以外的一切中斷請(qǐng)求。由此可見(jiàn),若要響應(yīng)同級(jí)甚至是低級(jí)中斷請(qǐng)求,必須使得該“優(yōu)先級(jí)生效”觸發(fā)器清零。但該觸發(fā)器又是不可尋址的,所以無(wú)法用軟件直接清零?!眴?wèn)題是不是在這里呢?而“優(yōu)先級(jí)生效”觸發(fā)器清零過(guò)程是怎樣執(zhí)行的呢?是在硬件自動(dòng)執(zhí)行的那么是在什么時(shí)候執(zhí)行的呢?帶著問(wèn)題我去解決問(wèn)題。假設(shè)我可以將程序滿(mǎn)足跳出中斷后跳到自己原來(lái)指定地址“ADR16”又滿(mǎn)足執(zhí)行指令“RETI”。經(jīng)過(guò)反復(fù)思考我用“DEC SP”;“DEC SP”;“MOV DPTR,#ADR16”;“PUSH DPL”;“PUSH DPL”“PUSH DPH”四條指令代替,問(wèn)題得到了解決。

          總結(jié):中斷指令“RETI”做為中斷跳出指令除了將堆棧中保存著的地址取出,送回PC;使程序從主程序的中斷處繼續(xù)往下執(zhí)行。的作用外還有將“優(yōu)先級(jí)生效”觸發(fā)器清零。自己做的程序也是出現(xiàn)了這個(gè)錯(cuò)誤,由于對(duì)“優(yōu)先級(jí)生效”觸發(fā)器清零,導(dǎo)致第二次進(jìn)不了中斷(相當(dāng)于同優(yōu)先級(jí)申請(qǐng))。

          后記:在解決這個(gè)問(wèn)題時(shí)候我所用的知識(shí)是課本上的,而又不完全是課本上的。在這個(gè)過(guò)程中我用已學(xué)的知識(shí)解決了自己的問(wèn)題,并進(jìn)一步推出中斷過(guò)程的一些新的知識(shí),我認(rèn)為新知識(shí)的學(xué)習(xí)有很大程度的要靠自己在已學(xué)過(guò)知識(shí)的基礎(chǔ)上通過(guò)運(yùn)用,總結(jié),推導(dǎo)等過(guò)程獲得新知識(shí)。著也是當(dāng)代大學(xué)生運(yùn)用知識(shí),獲取新知識(shí)的一種能力。

          51單片機(jī)相關(guān)文章:51單片機(jī)教程




          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();