3.1調(diào)用子程序過程主程序調(diào)用子程序過程應(yīng)包括保護(hù)斷點、跳至子程序首址、保護(hù)現(xiàn)場、子程序處理、恢復(fù)現(xiàn)場、恢復(fù)斷點(子程序返回)6步。這六步都是用軟件指令完成的。其中前兩步保護(hù)斷點和跳至子程序首址由調(diào)用指令CALL完成。保護(hù)斷點其實就是把斷點地址推入堆棧中保護(hù)起來,要注意的是保護(hù)的斷點應(yīng)是緊跟著調(diào)用指令的下一條指令地址,而不是調(diào)用指令本身地址,否則會引起重復(fù)調(diào)用“死循環(huán)”,這點必須提醒學(xué)生注意。LCALL與ACALL是MCS-51單片機的兩條調(diào)用指令,分別稱為長調(diào)用和絕對調(diào)用,兩指令主要區(qū)別在于LCALL后面操作數(shù)直接就是16位二進(jìn)制的子程序入口地址;而ACALL后面操作數(shù)只是11位二進(jìn)制數(shù),子程序入口地址是把這11位數(shù)作為低位地址,再加上ACALL的下一條指令地址(即斷點地址)的高5位作為高位地址,從而形成16位的子程序入口地址。由此可知,兩條調(diào)用指令的調(diào)用范圍是不一樣的,LCALL為64KB程序存貯器任何范圍,而ACALL在高5位地址不變的同一頁2KB范圍內(nèi)。
本文引用地址:http://m.butianyuan.cn/article/201611/315913.htm由于主程序與子程序可能會使用相同的寄存器和存貯單元存放數(shù)據(jù),如果兩者這些數(shù)據(jù)無關(guān),那么子程序在使用這些相同寄存器和存貯單元之前,就必須先把主程序存放在這些區(qū)間里的數(shù)據(jù)現(xiàn)場保護(hù)起來,子程序在使用這些區(qū)間結(jié)束后,再把主程序現(xiàn)場恢復(fù)出來,以便子程序返回主程序后,主程序繼續(xù)使用這些區(qū)間?,F(xiàn)場保護(hù)與恢復(fù)一般采用堆棧推入PUSH指令與堆棧彈出POP指令實現(xiàn),當(dāng)然也可采用改變工作寄存器R0~R7區(qū)間指針等方法實現(xiàn)。子程序返回只需用RET指令就可把保護(hù)在堆棧中的斷點恢復(fù)出來,繼續(xù)執(zhí)行主程序。
此外,主程序與子程序是密切聯(lián)系的,它們之間存在著入口參數(shù)與出口參數(shù)傳遞問題,也就是主程序如何把輸入?yún)?shù)傳給子程序,子程序又如何把處理結(jié)果的輸出參數(shù)帶回給主程序,兩者參數(shù)傳遞一般可采用寄存器或存貯單元、堆棧、數(shù)據(jù)指針等方法實現(xiàn)。
子程序再調(diào)用子程序叫做子程序嵌套,由于MCS-51單片機只能把內(nèi)部RAM 00~7FH 128字節(jié)單元作為堆棧使用,斷點地址保護(hù)到堆棧中需占2字節(jié)單元,所以子程序最多可能嵌套64級,當(dāng)然實際使用中子程序嵌套一般2~3級,否則程序結(jié)構(gòu)就顯得太復(fù)雜了。
3.2 中斷過程
中斷過程遠(yuǎn)比調(diào)用子程序過程要復(fù)雜,它包括中斷請求(或申請)、中斷排隊、中斷響應(yīng)、中斷服務(wù)(或處理)和中斷返回5大步。這5大步是由硬件和軟件結(jié)合完成的。
中斷請求由中斷源向CPU提出。MCS-51單片機只有T/C0定時/計數(shù)器0溢出、T/C1定時/計數(shù)器1溢出、TXD/RXD串行口發(fā)送與接收一幀完、INT0外部中斷0和INT1外部中斷1等5個硬件中斷源,其中前三個為內(nèi)部中斷源,后兩個為外部中斷源。
由于CPU在某一時刻只能響應(yīng)一個中斷請求,為處理執(zhí)行主程序時同時來了多個中斷請求和正在處理某一中斷時又來了新的中斷請求這兩種情況,計算機采用硬件或軟件給各個中斷源按優(yōu)先權(quán)大小進(jìn)行中斷排隊,從多個中斷申請中選出一個級別最高中斷請求而響應(yīng)之,這一過程稱為中斷排隊。MCS-51單片機用戶可用指令設(shè)置高、低兩個優(yōu)先級,而且同級中還有5個固定的隱含優(yōu)先級,從高到低的優(yōu)先級順序分別是INT0、T/C0、INT1、T/C1、TXD/RXD。這樣,在執(zhí)行主程序時,同時來了兩個以上中斷請求,則先按高低兩級選擇高優(yōu)先級,如只有一個高級就直接選之,如有兩個以上都是同級,則按同級隱含優(yōu)先級,選擇其中一個高級別。如正在執(zhí)行一個低優(yōu)先級,又來了一個高優(yōu)先級(即正在執(zhí)行的中斷級別低于新來的中斷級別),則高優(yōu)先級中斷低優(yōu)先級,這就形成了兩級中斷嵌套。如正在執(zhí)行低的又來了另一低的或者正在執(zhí)行高的又來了一個低的或高的(即正在執(zhí)行的中斷級別高于或等于新來的中斷級別),則不予理睬,不會引起中斷嵌套,也就是說同級隱含原則在不同時來了同級中斷時無效??梢?,MCS-51單片機最多形成兩級中斷嵌套。
CPU在執(zhí)行任何機器指令時,在每一個機器周期TCY都要抽點時間(MCS-51單片機為S5P2狀態(tài)節(jié)拍)來采集查詢有無中斷請求,如沒有,則繼續(xù)執(zhí)行原程序機器指令,如有中斷請求,則先從中選出級別最高者,在中斷響應(yīng)條件成立時,去處理響應(yīng)此中斷請求。
MCS-51單片機的中斷響應(yīng)必要條件是中斷屏蔽總開關(guān)EA和中斷請求相應(yīng)的屏蔽分開關(guān)都必須閉合,只有這樣,中斷請求信號才能送到CPU。此外,還不能碰到以下3種情況,即有優(yōu)先級更高的中斷請求同時提出或者正在執(zhí)行同級或高級中斷,正在執(zhí)行的指令還沒有執(zhí)行完、正在執(zhí)行RETI或訪問中斷屏蔽寄存器IE和中斷排隊寄存器IP,這3種情況是中斷響應(yīng)的充分條件。這1種情況中斷排隊輪不到它響應(yīng);第2種情況必須等到現(xiàn)行指令執(zhí)行完,再響應(yīng)中斷,指令周期分為1、2、4TCY三種機器周期,計算機每個TCY出現(xiàn)僅查看一次中斷請求,因此,2TCY和4TCY機器指令有可能沒有執(zhí)行完。如果執(zhí)行指令沒執(zhí)行完就去響應(yīng)中斷,則中斷處理返回后,計算機很難把分?jǐn)嚅_執(zhí)行的同一條指令連貫起來;第3種情況處理與第2種情況類似,但它除了要把現(xiàn)行的RETI指令或訪問IE、IP指令執(zhí)行完處,還需再執(zhí)行下一條指令,方能響應(yīng)中斷。利用這個原理,很容易實現(xiàn)單步STEP操作(調(diào)試程序時使用)。
中斷服務(wù)和中斷返回又由關(guān)(禁止)同級和低級中斷、中斷請求撤除、保護(hù)斷點、跳至中斷服務(wù)程序入口、保護(hù)現(xiàn)場、中斷處理、恢復(fù)現(xiàn)場、開(允許)同級和低級中斷、恢復(fù)斷點(中斷返回)等9小步組成。這9步中斷服務(wù)過程與前面介紹的6步調(diào)用子程序過程類似,只是增加了開、關(guān)同級和低級中斷請求以及中斷請求撤除3步,其余6步完全一致。開、關(guān)同級和低級中斷目的是使不同時來中斷請求的同級隱含排隊原則無效,此時只能實現(xiàn)高級嵌套低級的兩級中斷嵌套。在中斷處理的返回前清除原中斷請求原因是防止同一次中斷申請被重復(fù)響應(yīng)。
中斷服務(wù)過程的前4步是由硬件自動實現(xiàn)的,這點完全不同于調(diào)用子程序過程。當(dāng)然TXD/RXD中斷請求與INT0、INT1電平觸發(fā)中斷請求還需用戶分別用軟件和硬件清除中斷請求。MCS-51單片機的中斷服務(wù)程序入口地址是固定的,它們分別是INT0為0003H、T/C0為000BH、INT1為0013H、T/C1為001BH、TXD/RXD為0023H。斷點現(xiàn)場保護(hù)與恢復(fù)也是通過堆棧推入與彈出或改變工作寄存器區(qū)來實現(xiàn)的。
中斷處理完后,就應(yīng)返回斷點繼續(xù)執(zhí)行主程序,開同級和低級中斷、恢復(fù)斷點2步可用中斷返回指令RETI實現(xiàn),注意子程序返回指令RET只能實現(xiàn)恢復(fù)斷點,而不能開同級和低級中斷。
評論