|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
某些地方,reti可以代替ret 嗎 ? |
| 作者:俺從頭來(lái) 欄目:技術(shù)交流 |
到底有什么本質(zhì)區(qū)別? 不在中斷處理程序中的子程序的返回能用reti嗎? * - 本貼最后修改時(shí)間:2006-12-15 17:48:52 修改者:俺從頭來(lái) |
| 2樓: | >>參與討論 |
| 作者: andrew.xu 于 2006/12/3 14:49:00 發(fā)布:
應(yīng)該不能,reti會(huì)對(duì)中斷邏輯做調(diào)整 |
|
| 3樓: | >>參與討論 |
| 作者: liudewei 于 2006/12/3 15:34:00 發(fā)布:
本質(zhì)上一樣,從匯編邏輯上它們不一樣。 ret是正常的上下級(jí)調(diào)用返回,是可預(yù)知的,而reti是不可預(yù)知性的中斷返回,它從被打斷主程序或低級(jí)中斷程序的處理返回。 |
|
| 4樓: | >>參與討論 |
| 作者: tyw 于 2006/12/3 15:44:00 發(fā)布:
轉(zhuǎn)貼個(gè)東東,參考一下 RETI = RET指令+通知CPU中斷服務(wù)已結(jié)束. 2006-11-8 20:22 一點(diǎn)不通基于51單片機(jī)中斷跳出指令“RETI”淺議 基于51單片機(jī)中斷跳出指令“RETI”淺議 最近在基于51單片機(jī)編程的過(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的條件下,滿足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í)行一條RETI指令,執(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è)我可以將程序滿足跳出中斷后跳到自己原來(lái)指定地址“ADR16”又滿足執(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í)的一種能力。 * - 本貼最后修改時(shí)間:2006-12-3 15:50:41 修改者:tyw |
|
| 5樓: | >>參與討論 |
| 作者: computer00 于 2006/12/3 16:00:00 發(fā)布:
reti要清除一些跟中斷相關(guān)的標(biāo)志,否則直接用ret返回, 下次的同優(yōu)先級(jí)或者低優(yōu)先級(jí)的中斷就沒(méi)辦法產(chǎn)生了,相當(dāng)于還在中斷服務(wù)程序中。只有有reti返回,才能退出中斷服務(wù)程序. 51只有兩級(jí)中斷,中斷服務(wù)程序在運(yùn)行時(shí),同級(jí)的或著低級(jí)中斷不能打斷它. |
|
| 6樓: | >>參與討論 |
| 作者: maychang 于 2006/12/3 16:38:00 發(fā)布:
樓主沒(méi)有注意到RETI要修改中斷優(yōu)先級(jí)寄存器 這個(gè)寄存器,程序不能訪問(wèn)(對(duì)使用者不透明),所以常被忽略。 |
|
| 7樓: | >>參與討論 |
| 作者: 俺從頭來(lái) 于 2006/12/4 9:49:00 發(fā)布:
先謝謝各位~~ 謝謝andrew.xu,liudewei,tyw,00和maychang. 好像有點(diǎn)明白,待有時(shí)間仔細(xì)研究各位的帖子。。。 |
|
| 8樓: | >>參與討論 |
| 作者: 俺從頭來(lái) 于 2006/12/4 10:38:00 發(fā)布:
再問(wèn) 。。 中斷返回時(shí),清中斷標(biāo)志和改變“優(yōu)先級(jí)生效”觸發(fā)器是同一個(gè)操作嗎 還是覺(jué)得“有的”ret可以用reti代替: 如果一個(gè)子程序不在中斷處理程序中,那么它的返回應(yīng)該可以用RETI返回啊,這時(shí)的“優(yōu)先級(jí)生效”觸發(fā)器肯定為0。 * - 本貼最后修改時(shí)間:2006-12-4 10:44:15 修改者:俺從頭來(lái) |
|
| 9樓: | >>參與討論 |
| 作者: computer00 于 2006/12/4 11:09:00 發(fā)布:
清中斷不在reti時(shí)發(fā)生。 對(duì)于硬件清中斷標(biāo)志的中斷,在響應(yīng)中斷時(shí)就會(huì)清中斷標(biāo)志;對(duì)于軟件清中斷標(biāo)志的,必須軟件清除,硬件不會(huì)自動(dòng)清除。 到處都用reti,豈不要亂套了?例如在中斷里面調(diào)用一個(gè)函數(shù),結(jié)果被這個(gè)函數(shù)把reti搶了去。 反正你又不是做CPU設(shè)計(jì)的,管這么多干啥,它說(shuō)在哪用,你就在哪用得了,不用理會(huì)這個(gè)。 |
|
| 10樓: | >>參與討論 |
| 作者: 俺從頭來(lái) 于 2006/12/4 11:49:00 發(fā)布:
hehe~~~ 有一個(gè)用在產(chǎn)品的程序,在一處子程序中返回時(shí),由于疏忽,錯(cuò)用了RETI。 但沒(méi)有發(fā)現(xiàn)異常。。。 有點(diǎn)奇怪。 應(yīng)該是這段程序沒(méi)有處在中斷處理程序中吧、、 |
|
| 11樓: | >>參與討論 |
| 作者: hotpower 于 2006/12/5 20:59:00 發(fā)布:
哈哈~~~在主循環(huán)中沒(méi)問(wèn)題,有時(shí)是故意寫(xiě)成RETI把敵人搞暈倒~~~ |
|
| 12樓: | >>參與討論 |
| 作者: sfd123 于 2006/12/11 15:40:00 發(fā)布:
明白了,謝謝啊 |
|
| 13樓: | >>參與討論 |
| 作者: whb565938 于 2006/12/11 15:45:00 發(fā)布:
這都不會(huì)還出來(lái)混 |
|
| 14樓: | >>參與討論 |
| 作者: cnchip 于 2006/12/11 16:09:00 發(fā)布:
“它說(shuō)在哪用,你就在哪用得了,不用理會(huì)這個(gè)”。! 幫著強(qiáng)調(diào)一下。。 |
|
| 15樓: | >>參與討論 |
| 作者: wshftyc 于 2006/12/15 14:40:00 發(fā)布:
越說(shuō)越暈 |
|
| 16樓: | >>參與討論 |
| 作者: 楊真人 于 2006/12/15 15:44:00 發(fā)布:
小程序尚且如此混亂,大程序豈不亂成一團(tuán)? 回復(fù)主題:reti可以代替ret 嗎 ? 如果可以,RETI和RET當(dāng)中任意一個(gè)可以消失!然而真的可以么?返回地址可能不相同有考慮到嗎? |
|
| 17樓: | >>參與討論 |
| 作者: 俺從頭來(lái) 于 2006/12/15 16:56:00 發(fā)布:
謝謝大家 前兩天,看了各大俠的回帖,感覺(jué)明白。 但剛剛又被樣真人整暈了! 返回地址當(dāng)然一樣,不是嗎 |
|
| 18樓: | >>參與討論 |
| 作者: highway 于 2006/12/15 16:58:00 發(fā)布:
我在老外的程序中看到,壓入堆棧2個(gè)字節(jié)后,然后RETI:) |
|
| 19樓: | >>參與討論 |
| 作者: HWM 于 2006/12/15 20:37:00 發(fā)布:
18樓:你所看到的是“特定地址中斷返回”。 |
|
| 20樓: | >>參與討論 |
| 作者: 楊真人 于 2006/12/15 23:34:00 發(fā)布:
問(wèn)得出這樣的問(wèn)題本身就暈了。 別人只想把你弄醒. |
|
| 21樓: | >>參與討論 |
| 作者: 楊真人 于 2006/12/15 23:40:00 發(fā)布:
建議 建議樓主先學(xué)學(xué)流程圖,精通以后再學(xué)狀態(tài)機(jī). |
|
| 22樓: | >>參與討論 |
| 作者: 俺從頭來(lái) 于 2006/12/16 8:54:00 發(fā)布:
。 俺還在入門(mén)ing階段,所以經(jīng)常發(fā)些個(gè)自己很暈但你們大牛看來(lái)不值一問(wèn)的菜問(wèn)題,還請(qǐng)眾位以后多多指教。 本來(lái)這些個(gè)簡(jiǎn)單的東東在初學(xué)課本時(shí)就應(yīng)該熟練的,可是,俺大學(xué)虛度了,F(xiàn)在就只能厚著臉皮到這里發(fā)帖了、、 關(guān)于這個(gè)問(wèn)題,我想我比較清楚了。 謝謝眾大俠 |
|
| 23樓: | >>參與討論 |
| 作者: 楊真人 于 2006/12/17 13:19:00 發(fā)布:
感情上你可以完全用GOTO而不用GOSUB 之不過(guò)如果你不知道GO哪里,那是你自己的問(wèn)題. |
|
| 24樓: | >>參與討論 |
| 作者: 平常人 于 2006/12/17 21:35:00 發(fā)布:
有些單片機(jī),RETI和RET從堆棧彈出的字節(jié)數(shù)目不一樣,混用要出錯(cuò) |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |