<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 51單片機中斷過(guò)程與主程序調用子程序過(guò)程的比較

51單片機中斷過(guò)程與主程序調用子程序過(guò)程的比較

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò ) 收藏
3.1調用子程序過(guò)程

主程序調用子程序過(guò)程應包括保護斷點(diǎn)、跳至子程序首址、保護現場(chǎng)、子程序處理、恢復現場(chǎng)、恢復斷點(diǎn)(子程序返回)6步。這六步都是用軟件指令完成的。其中前兩步保護斷點(diǎn)和跳至子程序首址由調用指令CALL完成。保護斷點(diǎn)其實(shí)就是把斷點(diǎn)地址推入堆棧中保護起來(lái),要注意的是保護的斷點(diǎn)應是緊跟著(zhù)調用指令的下一條指令地址,而不是調用指令本身地址,否則會(huì )引起重復調用“死循環(huán)”,這點(diǎn)必須提醒學(xué)生注意。LCALL與ACALL是MCS-51單片機的兩條調用指令,分別稱(chēng)為長(cháng)調用和絕對調用,兩指令主要區別在于LCALL后面操作數直接就是16位二進(jìn)制的子程序入口地址;而ACALL后面操作數只是11位二進(jìn)制數,子程序入口地址是把這11位數作為低位地址,再加上ACALL的下一條指令地址(即斷點(diǎn)地址)的高5位作為高位地址,從而形成16位的子程序入口地址。由此可知,兩條調用指令的調用范圍是不一樣的,LCALL為64KB程序存貯器任何范圍,而ACALL在高5位地址不變的同一頁(yè)2KB范圍內。

本文引用地址:http://dyxdggzs.com/article/201611/315913.htm

由于主程序與子程序可能會(huì )使用相同的寄存器和存貯單元存放數據,如果兩者這些數據無(wú)關(guān),那么子程序在使用這些相同寄存器和存貯單元之前,就必須先把主程序存放在這些區間里的數據現場(chǎng)保護起來(lái),子程序在使用這些區間結束后,再把主程序現場(chǎng)恢復出來(lái),以便子程序返回主程序后,主程序繼續使用這些區間?,F場(chǎng)保護與恢復一般采用堆棧推入PUSH指令與堆棧彈出POP指令實(shí)現,當然也可采用改變工作寄存器R0~R7區間指針等方法實(shí)現。子程序返回只需用RET指令就可把保護在堆棧中的斷點(diǎn)恢復出來(lái),繼續執行主程序。

此外,主程序與子程序是密切聯(lián)系的,它們之間存在著(zhù)入口參數與出口參數傳遞問(wèn)題,也就是主程序如何把輸入參數傳給子程序,子程序又如何把處理結果的輸出參數帶回給主程序,兩者參數傳遞一般可采用寄存器或存貯單元、堆棧、數據指針等方法實(shí)現。

子程序再調用子程序叫做子程序嵌套,由于MCS-51單片機只能把內部RAM 00~7FH 128字節單元作為堆棧使用,斷點(diǎn)地址保護到堆棧中需占2字節單元,所以子程序最多可能嵌套64級,當然實(shí)際使用中子程序嵌套一般2~3級,否則程序結構就顯得太復雜了。

3.2 中斷過(guò)程

中斷過(guò)程遠比調用子程序過(guò)程要復雜,它包括中斷請求(或申請)、中斷排隊、中斷響應、中斷服務(wù)(或處理)和中斷返回5大步。這5大步是由硬件和軟件結合完成的。

中斷請求由中斷源向CPU提出。MCS-51單片機只有T/C0定時(shí)/計數器0溢出、T/C1定時(shí)/計數器1溢出、TXD/RXD串行口發(fā)送與接收一幀完、INT0外部中斷0和INT1外部中斷1等5個(gè)硬件中斷源,其中前三個(gè)為內部中斷源,后兩個(gè)為外部中斷源。

由于CPU在某一時(shí)刻只能響應一個(gè)中斷請求,為處理執行主程序時(shí)同時(shí)來(lái)了多個(gè)中斷請求和正在處理某一中斷時(shí)又來(lái)了新的中斷請求這兩種情況,計算機采用硬件或軟件給各個(gè)中斷源按優(yōu)先權大小進(jìn)行中斷排隊,從多個(gè)中斷申請中選出一個(gè)級別最高中斷請求而響應之,這一過(guò)程稱(chēng)為中斷排隊。MCS-51單片機用戶(hù)可用指令設置高、低兩個(gè)優(yōu)先級,而且同級中還有5個(gè)固定的隱含優(yōu)先級,從高到低的優(yōu)先級順序分別是INT0、T/C0、INT1、T/C1、TXD/RXD。這樣,在執行主程序時(shí),同時(shí)來(lái)了兩個(gè)以上中斷請求,則先按高低兩級選擇高優(yōu)先級,如只有一個(gè)高級就直接選之,如有兩個(gè)以上都是同級,則按同級隱含優(yōu)先級,選擇其中一個(gè)高級別。如正在執行一個(gè)低優(yōu)先級,又來(lái)了一個(gè)高優(yōu)先級(即正在執行的中斷級別低于新來(lái)的中斷級別),則高優(yōu)先級中斷低優(yōu)先級,這就形成了兩級中斷嵌套。如正在執行低的又來(lái)了另一低的或者正在執行高的又來(lái)了一個(gè)低的或高的(即正在執行的中斷級別高于或等于新來(lái)的中斷級別),則不予理睬,不會(huì )引起中斷嵌套,也就是說(shuō)同級隱含原則在不同時(shí)來(lái)了同級中斷時(shí)無(wú)效??梢?jiàn),MCS-51單片機最多形成兩級中斷嵌套。

CPU在執行任何機器指令時(shí),在每一個(gè)機器周期TCY都要抽點(diǎn)時(shí)間(MCS-51單片機為S5P2狀態(tài)節拍)來(lái)采集查詢(xún)有無(wú)中斷請求,如沒(méi)有,則繼續執行原程序機器指令,如有中斷請求,則先從中選出級別最高者,在中斷響應條件成立時(shí),去處理響應此中斷請求。

MCS-51單片機的中斷響應必要條件是中斷屏蔽總開(kāi)關(guān)EA和中斷請求相應的屏蔽分開(kāi)關(guān)都必須閉合,只有這樣,中斷請求信號才能送到CPU。此外,還不能碰到以下3種情況,即有優(yōu)先級更高的中斷請求同時(shí)提出或者正在執行同級或高級中斷,正在執行的指令還沒(méi)有執行完、正在執行RETI或訪(fǎng)問(wèn)中斷屏蔽寄存器IE和中斷排隊寄存器IP,這3種情況是中斷響應的充分條件。這1種情況中斷排隊輪不到它響應;第2種情況必須等到現行指令執行完,再響應中斷,指令周期分為1、2、4TCY三種機器周期,計算機每個(gè)TCY出現僅查看一次中斷請求,因此,2TCY和4TCY機器指令有可能沒(méi)有執行完。如果執行指令沒(méi)執行完就去響應中斷,則中斷處理返回后,計算機很難把分斷開(kāi)執行的同一條指令連貫起來(lái);第3種情況處理與第2種情況類(lèi)似,但它除了要把現行的RETI指令或訪(fǎng)問(wèn)IE、IP指令執行完處,還需再執行下一條指令,方能響應中斷。利用這個(gè)原理,很容易實(shí)現單步STEP操作(調試程序時(shí)使用)。

中斷服務(wù)和中斷返回又由關(guān)(禁止)同級和低級中斷、中斷請求撤除、保護斷點(diǎn)、跳至中斷服務(wù)程序入口、保護現場(chǎng)、中斷處理、恢復現場(chǎng)、開(kāi)(允許)同級和低級中斷、恢復斷點(diǎn)(中斷返回)等9小步組成。這9步中斷服務(wù)過(guò)程與前面介紹的6步調用子程序過(guò)程類(lèi)似,只是增加了開(kāi)、關(guān)同級和低級中斷請求以及中斷請求撤除3步,其余6步完全一致。開(kāi)、關(guān)同級和低級中斷目的是使不同時(shí)來(lái)中斷請求的同級隱含排隊原則無(wú)效,此時(shí)只能實(shí)現高級嵌套低級的兩級中斷嵌套。在中斷處理的返回前清除原中斷請求原因是防止同一次中斷申請被重復響應。

中斷服務(wù)過(guò)程的前4步是由硬件自動(dòng)實(shí)現的,這點(diǎn)完全不同于調用子程序過(guò)程。當然TXD/RXD中斷請求與INT0、INT1電平觸發(fā)中斷請求還需用戶(hù)分別用軟件和硬件清除中斷請求。MCS-51單片機的中斷服務(wù)程序入口地址是固定的,它們分別是INT0為0003H、T/C0為000BH、INT1為0013H、T/C1為001BH、TXD/RXD為0023H。斷點(diǎn)現場(chǎng)保護與恢復也是通過(guò)堆棧推入與彈出或改變工作寄存器區來(lái)實(shí)現的。

中斷處理完后,就應返回斷點(diǎn)繼續執行主程序,開(kāi)同級和低級中斷、恢復斷點(diǎn)2步可用中斷返回指令RETI實(shí)現,注意子程序返回指令RET只能實(shí)現恢復斷點(diǎn),而不能開(kāi)同級和低級中斷。



評論


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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>