資料介紹
上期我們已經(jīng)學(xué)習(xí)了將程序放在地址空間中,并在向量表中顯示保存位置的內(nèi)容。本期將介紹在執(zhí)行程序及產(chǎn)生中斷時CPU內(nèi)會發(fā)生什么變化。
引導(dǎo)程序的運行―程序計數(shù)器
一般來說,程序就是計算機將所要進行的處理按順序排列的指令集。在單片機中,將程序保存在地址空間(存儲器 空間)中(上期曾介紹過),并由CPU來執(zhí)行(處理)指令。假設(shè)地址空間中的一個地址保存一條指令,先執(zhí)行某個地址中的指令(如“將值置位到CPU中”處理),接著執(zhí)行下一個地址中的指令,接下來再執(zhí)行下一個地址中的指令……,像這樣通過連續(xù)執(zhí)行指令,便可執(zhí)行程序。
那么,CPU是如何判斷執(zhí)行指令的順序呢?在單片機中,程序被執(zhí)行的時候“程序計數(shù)器(PC)”的值也同時被更新。存放在CPU內(nèi)的指令地址中,程序計數(shù)器存儲有下一條CPU將要執(zhí)行的指令所在的地址。執(zhí)行了某個地址的指令后,下一個該執(zhí)行哪個地址中的指令呢?這個答案由程序計數(shù)器來告訴你。
一般來說,程序被保存在連續(xù)的地址中, 再由CPU按順序執(zhí)行存放在各個地址中的指令。圖1為程序計數(shù)器的示意圖。圖中,假定(1)執(zhí)行地址1000h中的指令,(2)執(zhí)行地址1000h中的指令后,程序計數(shù)器的値自動增加一個量并顯示出下一個地址1001h,接下來,(3)CPU執(zhí)行地址1001h中的指令。
圖1:程序計數(shù)器
那么,CPU執(zhí)行最初的指 令時是一種什么狀況呢?單片機在接通電源或是復(fù)位時,如上期所說明的,保存在向量表的復(fù)位地址中的値(程序的起始地址)將被轉(zhuǎn)移到程序計數(shù)器中,該地址中的指令便得到執(zhí)行(請參照上期的圖2)。
?關(guān)于地址空間及向量表的內(nèi)容,請參照本系列的第五期:
改變程序的運行路徑―轉(zhuǎn)移指令
編寫程序時,在執(zhí)行完某個指令的處理后有時必須先執(zhí)行保存“(非連續(xù))的下一個地址”中的指令。此時,程序計數(shù)器的值將被改寫,而所用的指令被稱為“轉(zhuǎn)移指令”。
圖2所示是轉(zhuǎn)移指令的示意圖。圖2示例中,(1)地址1000h中存放有轉(zhuǎn)移指令,即將(2)程序計數(shù)器的值改寫為下一個應(yīng)執(zhí)行的地址 (1100h)的指令。即CPU執(zhí)行完1000h地址的指令(轉(zhuǎn)移指令)后,接下來不是執(zhí)行1001h地址的指令,而是執(zhí)行(3)1100h地址的指令。
圖2:轉(zhuǎn)移指令
另外,在轉(zhuǎn)移指令中,能夠利用“從當(dāng)前的程序計數(shù)器的值向前(更大的地址)/向后(更小的地址)移動”的方法來設(shè)定程序計數(shù)器的值 。
信息的暫時存放處―堆棧
執(zhí)行程序時,在運算過程中僅僅依靠CPU內(nèi)的數(shù)據(jù)保存位置(CPU內(nèi)部寄存器)是不夠的,有時需在主存儲器中暫時存放信息。這種信息的暫時存放位置被稱為“堆棧”,而存放“下一個(暫時)存放的信息地址”的就是“堆棧指針(SP)”。如果一開始就設(shè)定好堆棧的地址,那么堆棧指針將自動更新,且總是指示“下一個(暫時)存放的信息地址”。
?CPU內(nèi)部寄存器等單片機的結(jié)構(gòu)請參照。
如果執(zhí)行“將該信息存放(有時也用 “堆積”)在堆棧”的指令,那么被指定的信息將會被寫入堆棧指針?biāo)付ǖ牡刂分校叶褩V羔樀闹狄矊⒈桓聻樾碌牡刂罚ㄒ话銥橐粋€小地址)。該情形如圖3所示。如果(1)CPU將信息存放在堆棧指針?biāo)傅牡刂分校瑒t(2)堆棧指針的値將被更新,然后(3)堆棧指針指向下一個存放信息的位置。
圖3:將信息存放在堆棧中"
將存放在堆棧中的信息返回CPU時,也將用到堆棧指針。圖4所示的是將信息返回時的情形。(1)更新堆棧指針的値(更新為 一個大的地址),(2)將暫時存放在堆棧中的信息返送回CPU。此時,(3)堆棧指針指向下一個寫入地址(先前將信息返回CPU后空出的地址)。
圖4:將信息從堆棧返回
但是堆棧中并非可無限制地保存信息。由于堆棧能使用的范圍僅限于可改寫的被稱為RAM的存儲器。如果信息存放量過多而導(dǎo)致堆棧超出了RAM的區(qū)域,程序?qū)o法正常運行。
理解中斷處理
本期是《活學(xué)活用單片機基礎(chǔ)篇 學(xué)習(xí)“外設(shè)功能”》系列的最后一期。下面我們將以前介紹過的內(nèi)容進行一個總結(jié),并以此來理解單片機是如何運行(處理)的。
我們將以發(fā)生中斷時的處理為例來進行思考(圖5)。中斷處理就是指在執(zhí)行某個程序的過程中,由于某種原因(產(chǎn)生中斷)而導(dǎo)致開始執(zhí)行完全不同的程序。我們以來自外設(shè)功能之一的獨立的看門狗計時器(WDT、所謂的Watch Dog即看門狗的意思)的中斷為例來進行分析。在程序正常運行時獨立的看門狗定時器將什么也不做,但是在程序失去控制,且沒有按必要的步驟進行處理時就會產(chǎn)生中斷。使失去控制的程序停下并讓系統(tǒng)穩(wěn)定停止的處理是由通過中斷開始的程序來執(zhí)行的。中斷處理的流程請參照本系列第四期《中斷功能》的圖2。
?關(guān)于中斷的結(jié)構(gòu)和處理流程請參照本系列第四期的內(nèi)容。
?關(guān)于看門狗定時器請參照本系列的第二期的內(nèi)容。
圖5:中斷處理的流程
1、首先,在產(chǎn)生中斷時,必須使運行中的程序入棧。
2、在中斷處理 “入棧”時,將信息存放在堆棧指針指向的地址(堆棧)中。進行中斷處理時存放在堆棧中的信息就是正 在執(zhí)行的原先的程序(被中斷的程序)時的程序計數(shù)器的值,即原先的程序執(zhí)行到哪一步的信息(地址)。另外,顯示CPU內(nèi)部狀態(tài)的信息和暫時保存的值也存放 在堆棧中。
3、如果CPU內(nèi)部的信息存放在堆棧中且完成“交付”準(zhǔn)備(入棧)后,將執(zhí)行中斷程序。中斷程序與正在執(zhí)行的程序不同且所保 存的地址空間也不同,所以程序計數(shù)器的值與原先程序也完全不同。中斷程序的起始位置將被寫入向量表中。起始位置該寫在向量表中的哪一項取決于所產(chǎn)生 的中斷。
例如,如果存在不可屏蔽中斷(NMI,即CPU不能屏蔽的中斷),那就從寫有NMI項的地址開始進行處理(請參照本系列第五期《程序設(shè)計(上)》的圖 2及圖3)。
?使用向量表進行處理的流程在本系列的第五期中進行解說。
4、如上所述,向量表的NMI項中的值(地址)將轉(zhuǎn)移到程序計數(shù)器中, 并從該處開始執(zhí)行。此外,如將數(shù)值設(shè)為0而產(chǎn)生錯誤時,或者欲存取到無存儲器的位置時,CPU本身將產(chǎn)生中斷并從向量表中讀取開始處理的地址。此例中, 由于在檢測到程序失控時是通過獨立的看門狗定時器進行中斷處理的,所以中斷程序?qū)⑹瓜到y(tǒng)停止下來。
5、如為一般的周期性中斷,那么,中斷處理一結(jié)束,且在入棧時將存放在堆棧中的“執(zhí)行原先執(zhí)行程序時的信息”返回到CPU。最后返回程序計數(shù)器的值,并結(jié)束從中斷返回的處理“出棧”。
開始中斷程序時,通過來自外部的信號或從CPU本身發(fā)出的指令來開始入棧。出棧時使用“來自中斷的出棧指令”,因此編程人員無需考慮“堆棧 中存放有什么信息又是按什么順序來存放的?”等問題,僅需一條指令便可進行出棧處理。
結(jié)合上期《程序設(shè)計(上)》的內(nèi)容,從執(zhí)行程序的觀點來分析 ,本期對于CPU中到底產(chǎn)生了什么變化進行了說明。程序存放在地址空間中,且在向量表中保存有起始地址,而且還有將信息暫時存放的被稱為堆棧的內(nèi)容等 等……,在進行嵌入式編程時,必須同時考慮這些內(nèi)部動作后再進行編程。如果可通過程序?qū)τ诟?xì)微的部分發(fā)出指示,且能發(fā)揮出該單片機的能力的話,編程將變得更加容易。
本系列共分6期,本期為最后一期。盡管每一期都只介紹非常基礎(chǔ)的內(nèi)容,對于那些內(nèi)容,我們也盡量做到即使對于完全不具備相關(guān)知識的讀者也能看得懂。所以,請您也反復(fù)閱讀,我們相信您一定會完全理解其內(nèi)容的。?
(mbbeetchina)
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 中斷服務(wù)子程序是如何被執(zhí)行的 ?
- 單片機中斷系統(tǒng)(51為例)
- C51教程 第四個51程序:中斷控制--外部中斷0
- 探討高頻高速信號線在PCB的板邊時會發(fā)生什么情況?資料下載
- 32位CPU中執(zhí)行單元總體結(jié)構(gòu)資料下載
- 使用C51實現(xiàn)單片機中斷的資料和程序講解
- 單片機中斷的基本概念及中斷系統(tǒng)有什么優(yōu)點
- 51單片機的中斷系統(tǒng)詳細(xì)資料概述
- 51單片機中斷的資料和使用程序免費下載
- 51單片機中斷系統(tǒng)的詳細(xì)資料和程序免費下載
- 使用單片機進行中斷的應(yīng)用資料和程序免費下載
- Setup軟件安裝可執(zhí)行程序工具免費下載 11次下載
- LED燈中斷C語言程序資料免費下載 8次下載
- PLL電路的研究及在信號產(chǎn)生中的應(yīng)用資料 16次下載
- DDS在二相碼產(chǎn)生中的應(yīng)用
- 軟硬件交互的角度將中斷的知識梳理 2104次閱讀
- PLC中斷的概念 2245次閱讀
- 中斷指令及程序的講解 5077次閱讀
- 在標(biāo)準(zhǔn)C語言中編譯出來的可執(zhí)行程序 1934次閱讀
- 鴻蒙內(nèi)核源碼分析:引起中斷的事件或原因 1902次閱讀
- ARM異常中斷的原因及處理措施 8162次閱讀
- 單片機的中斷程序如何運行 1.1w次閱讀
- 在處理PIC單片機的中斷服務(wù)程序時需要注意哪些問題 2688次閱讀
- 探究硬中斷和軟中斷的原理和區(qū)別 1w次閱讀
- 淺析硬中斷和軟中斷的區(qū)別 5596次閱讀
- 中斷的含義是什么?如何設(shè)置ARM處理器的中斷? 7496次閱讀
- MM32如何使用比較器產(chǎn)生中斷 8142次閱讀
- 單片機中斷系統(tǒng)介紹_51單片機中斷系統(tǒng)結(jié)構(gòu) 1.2w次閱讀
- ZedBoard之中斷原理及過程詳解 4842次閱讀
- 單片機與程序設(shè)計(下) 2919次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關(guān)電源基礎(chǔ)知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發(fā)板設(shè)計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論