新聞中心

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

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

        作者: 時間:2016-11-18 來源:網絡 收藏
        3.1調用子程序過程

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

        本文引用地址:http://www.104case.com/article/201611/315913.htm

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

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

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

        3.2 中斷過程

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

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

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

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

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

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

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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 台江县| 杨浦区| 永寿县| 乌鲁木齐县| 通渭县| 宁阳县| 天津市| 嘉善县| 奎屯市| 宝清县| 万安县| 城口县| 安顺市| 东源县| 平安县| 保亭| 库尔勒市| 寿阳县| 丰原市| 略阳县| 祁东县| 江西省| 尤溪县| 浮山县| 宁南县| 郧西县| 金秀| 太康县| 揭东县| 高碑店市| 磐石市| 榆林市| 密山市| 县级市| 临猗县| 阳原县| 舒城县| 临桂县| 布拖县| 秀山| 河北省|