中文字幕无码不卡一区二区三区_少妇被又大又粗又爽毛片久久黑人_91精品国产在热久久无毒不卡_久久久久久亚洲综合网站

技術(shù)熱線: 4007-888-234
設(shè)計開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應(yīng)用測試 完善的開發(fā)代碼案例庫分享

技術(shù)支持

從全面的產(chǎn)品導(dǎo)入到強大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機資訊,行業(yè)消息以及公司新聞動態(tài)

PIC16F87X單片機中斷系統(tǒng)應(yīng)用須關(guān)注的問題

更新時間: 2019-03-22
閱讀量:2847

摘要:美國微芯公司研制的PIC系列單片機,其硬件結(jié)構(gòu)和指令系統(tǒng)采用了與眾不同的設(shè)計手法。在架構(gòu)上和概念上對傳統(tǒng)單片機進(jìn)行了一些突破性的變革,但也給這類單片機的應(yīng)用帶來了一些特殊問題。本文針對PIC16F87X系列單片機中斷的特點,及其在應(yīng)用過程中應(yīng)該注意的幾個問題進(jìn)行必要的說明。內(nèi)容包括中斷源、中斷邏輯、中斷相關(guān)的寄存器、中斷的延時、中斷的現(xiàn)場保護(hù)以及注意事項等。 四、 中斷的處理

前在世界一些著名的單片機產(chǎn)品系列中,PIC16F87X系列單片機是芯片內(nèi)部包含有外圍設(shè)備模塊數(shù)量最多的單片機品種之一。PIC16F874和PIC16F877單片機的芯片內(nèi)部集成了15個外圍設(shè)備模塊;PIC16F873和PIC16F876單片機的芯片內(nèi)部集成了12個外圍設(shè)備模塊。在最近推出的該系列的新型號中, PIC16F870單片機的芯片內(nèi)部集成了10個外圍設(shè)備模塊;PIC16F871單片機的芯片內(nèi)部集成了13個外圍設(shè)備模塊;PIC16F872單片機的芯片內(nèi)部也集成了10個外圍設(shè)備模塊(比PIC16F870多了1個USART模塊,少了1個SSP模塊)。 

  這些外圍設(shè)備模塊在啟用時以及在工作過程中,都或多或少地需要CPU參與控制、協(xié)調(diào)或交換數(shù)據(jù)等各種服務(wù)工作。由于CPU的運行速度非常高,而各個外圍設(shè)備模塊的工作速度卻非常低,況且這些外圍設(shè)備模塊也不是頻繁地要求CPU對其服務(wù)。因此,通常采取一種讓眾多外圍設(shè)備模塊共享1個CPU,并且能夠及時得到CPU服務(wù)的調(diào)度方法——中斷。 

一、 PIC16F87X的中斷源

  PIC系列單片機是當(dāng)今世界上很有影響力的精簡指令集(RISC)微控制器,具有豐富的中斷功能。其中功能強大的中、高擋型號的中斷源有18種之多。在PIC單片機家族中,排位屬于中上水平的PIC16F87X子系列單片機具備的中斷源多達(dá)14種。其中,單片機的型號不同,中斷源的種類、個數(shù)也不同,如表1所列。其不足之處是:中斷矢量只有1個,并且各個中斷源之間也沒有優(yōu)先級別之分,不具備非屏蔽中斷。 

表1 PIC16F87X單片機的中斷源及其數(shù)量

中斷源種類

中斷源志位

中斷源蔽位

873/ 876

874/ 877

870

871

872

外部觸發(fā)中斷INT

INTF

INTE

TMR0溢出中斷

T0IF

T0IE

RB端口電平變化中斷

RBIF

RBIE

TMR1溢出中斷

TMR1IF

TMR1IE

TMR2中斷

TMR2IF

TMR2IE

CCP1中斷

CCP1IF

CCP1IE

CCP2中斷

CCP2IF

CCP2IE




SCI同步發(fā)送中斷

TXIF

TXIE


SCI同步接收中斷

RCIF

RCIE


SSP中斷

SSPIF

SSPIE



SSP I2C總線碰撞中斷

BCLIF

BCLIE



并行端口中斷

PSPIF

PSPIE




A/D轉(zhuǎn)換中斷

ADIF

ADIE

E2PROM中斷

EEIF

EEIE




13種

14種

10種

11種

10種

從表1中可以看出,各中斷源基本上都是與各個外圍設(shè)備模塊相對應(yīng)的。其中,多數(shù)外圍設(shè)備模塊對應(yīng)著1個中斷源(比如定時器/計數(shù)器TMR0模塊),有的外圍設(shè)備模塊對應(yīng)著2個中斷源(比如通用同步/接收/發(fā)送器SCI模塊),也有的外圍設(shè)備模塊沒有中斷源與之對應(yīng)(比如輸入/輸出端口RA和RC模塊),還有的中斷源沒有外圍設(shè)備模塊與之對應(yīng)(比如外部觸發(fā)中斷源INT)。 

二、 PIC16F87X的中斷硬件邏輯

  在PIC16F87X的子系列中,具體型號不同,中斷邏輯電路也存在著差異,中斷源的種類和個數(shù)也不同:最多的具備14種中斷源;最少的具備10種中斷源(詳見表1)。其中并行端口模塊和并行端口中斷源,只有40腳封裝的型號(PIC16F871、PIC16F874和PIC16F877)才會具備;而對于28腳封裝的型號(PIC16F870、PIC16F872、PIC16F873和PIC16F876)則不具備。
  PIC16F87X系列單片機中斷系統(tǒng)的邏輯電路如圖1所示。每一種中斷源對應(yīng)著1個中斷標(biāo)志位(記為XXXF,F(xiàn)是Flag的第1個英文字母)和1個中斷屏蔽位或者叫中斷使能位(記為XXXE,E是Enable的第1個英文字母)。中斷源產(chǎn)生的中斷標(biāo)志信號是否得以向前傳遞,將受控于對應(yīng)的中斷屏蔽位。每一個中斷標(biāo)志位都對應(yīng)著1個觸發(fā)器。當(dāng)中斷源申請CPU中斷時,與之對應(yīng)的觸發(fā)器就由硬件自動置位,而該觸發(fā)器的清零是由用戶安排程序來實現(xiàn)的;每一個中斷屏蔽位也對應(yīng)著1個觸發(fā)器。該觸發(fā)器的置位和清零均是由用戶程序完成的。
  圖1描繪的邏輯電路是1個由簡單的門電路構(gòu)成的組合邏輯電路。將全部14個中斷源按2個梯隊并列排開,第1梯隊中只安排了3個中斷源,其余的中斷源全部安排到第2梯隊中。這樣做是為了與早期的PIC系列單片機型號相兼容(前些年研制出的單片機型號片內(nèi)配置的外圍設(shè)備模塊數(shù)量較少,相應(yīng)的中斷源的數(shù)量自然也就少,比如PIC16C61只有第1梯隊中的3個中斷源)。近期研制的一些PIC單片機新型號是在原有的單片機芯片基礎(chǔ)之上進(jìn)行一些功能擴(kuò)展而得來的。 

所有的中斷源都受全局中斷屏蔽位(也可以稱為總屏蔽位)GIE的控制。第1梯隊的中斷源不僅受全局中斷屏蔽位的控制,還要受各自中斷屏蔽位的控制;第2梯隊的中斷源不僅受到全局中斷屏蔽位和各自中斷屏蔽位的控制,還要額外受到1個外設(shè)中斷屏蔽位PEIE的控制。

三、 中斷相關(guān)的寄存器

  與中斷功能有關(guān)的特殊功能寄存器共有5個:中斷控制寄存器INTCON、第1外圍設(shè)備中斷標(biāo)志寄存器PIR1、第1外圍設(shè)備中斷屏蔽寄存器(又稱中斷使能寄存器)PIE1、第2外圍設(shè)備中斷標(biāo)志寄存器PIR2和第2外圍設(shè)備中斷屏蔽寄存器PIE2。如表2所列,5個寄存器中共有40位,其中使用了30位。分別與圖1中的中斷邏輯電路的輸入邏輯信號成嚴(yán)格對應(yīng)關(guān)系,也與邏輯表達(dá)式成嚴(yán)格對應(yīng)關(guān)系。這5個寄存器都具有在RAM數(shù)據(jù)存儲器中統(tǒng)一編碼的地址。也就是說,PIC單片機可以把這5個特殊寄存器當(dāng)作普通寄存器單元來訪問(即讀出或?qū)懭氩僮鳎_@樣有利于減少指令集的指令類型和指令數(shù)量,也便于學(xué)習(xí)、記憶和編程。

  單片機復(fù)位后,由硬件自動對全局中斷屏蔽位進(jìn)行設(shè)置GIE=0,將屏蔽所有的中斷源。中斷返回指令“RETFIE”執(zhí)行后,也由硬件自動對總屏蔽位進(jìn)行設(shè)置GIE=1,重新開放所有的中斷源。不論各種中斷屏蔽位和全局中斷屏蔽位GIE處于何種狀態(tài)(是開放還是禁止),當(dāng)某一中斷源的中斷條件滿足時,都會發(fā)出中斷請求,相應(yīng)的中斷標(biāo)志位都會被置位(=1)。但是,是否能夠得到CPU的響應(yīng),則要根據(jù)該中斷源所涉及到的中斷屏蔽位的狀態(tài)而定。CPU響應(yīng)中斷后,由硬件自動對全局中斷屏蔽位進(jìn)行清零(GIE=0),屏蔽所有的中斷源,以免發(fā)生重復(fù)中斷響應(yīng),然后,由硬件自動把當(dāng)前的程序計數(shù)器PC值(即程序斷點地址)壓入堆棧(實際為硬件堆棧),并且把PC寄存器置以中斷向量地址(0004H),從而轉(zhuǎn)向并開始執(zhí)行中斷服務(wù)程序。進(jìn)入中斷服務(wù)程序后,程序中必須安排指令,檢查發(fā)出請求的中斷源(如果同時開放多個中斷源的話)。這可以通過檢查各個中斷源的標(biāo)志位來實現(xiàn)。一旦確定出發(fā)出申請的中斷源,就用軟件把該中斷源的標(biāo)志位人為地清零,否則,執(zhí)行中斷返回指令“RETFIE”。重開中斷后,由于中斷標(biāo)志位仍為“1”而引起CPU重復(fù)響應(yīng)同一個中斷請求。中斷服務(wù)程序的末尾必須放置1條中斷返回指令“RETFIE”。執(zhí)行該條指令后,不僅可以重開中斷,而且還可以由硬件自動將保留在堆棧頂部的斷點地址彈出,并放回到程序計數(shù)器PC中,使CPU返回和繼續(xù)執(zhí)行被中斷的主程序。 

1 中斷的延時響應(yīng)和延時處理
  1次中斷過程,從中斷源發(fā)出請求到得到CPU的響應(yīng)必然存在一定的延遲時間。

 在圖2中,第1行是系統(tǒng)時鐘脈沖信號,每4個時鐘周期對應(yīng)1個指令周期。第2行就是指令周期信號。該信號只有在RC振蕩模式下,從OSC2腳上可以向片外送出。第3行是單片機外部引腳INT送入的中斷脈沖信號。外部中斷信號INT是用邊沿觸發(fā)的。假設(shè)預(yù)先設(shè)定的是INT中斷信號上升沿有效的話,則該信號的上升沿將會在1個時鐘周期后引發(fā)中斷標(biāo)志位INTF被置位。第4行代表INTF信號。每個指令周期內(nèi)的第2個時鐘脈沖上升沿時,該信號被抽檢1次。一旦檢測到INTF信號被設(shè)置為“1”,則CPU會在接下來的1個指令周期內(nèi),將全局中斷屏蔽位GIE清零。第5行是全局中斷屏蔽位GIE。在GIE信號被清零的下一個指令周期內(nèi),程序計數(shù)器PC被置入中斷向量0004H,見圖2中第6行。同時在該指令周期內(nèi)完成到中斷服務(wù)程序的跳轉(zhuǎn),并且實現(xiàn)提取該子程序的首條指令,即指令(0004H),見圖2中第7行。在其后的1個指令周期內(nèi),正式開始執(zhí)行中斷服務(wù)程序的第1條指令,見圖2中第8行。自INT引腳輸入有效信號,到中斷服務(wù)程序的第1條指令得到執(zhí)行,大約需要3~4個指令周期的延時。更精確的延遲時間取決于中斷事件的發(fā)生時機。
  以上描述的只是1次中斷從申請到得到CPU的響應(yīng)的延遲時間。下面分析從CPU響應(yīng)1次中斷到該中斷得到有效處理的延遲時間。由于具有中斷功能的PIC系列單片機(低檔產(chǎn)品PIC16C5X和PIC12C5X系列不具備中斷功能),采用的是“多源中斷”的設(shè)計方案(即1個中斷向量對應(yīng)著多個中斷源),只有惟一的1個中斷向量,或者說只有1個中斷服務(wù)程序入口地址。這就意味著,此類單片機的中斷服務(wù)程序只能編寫1個。這類單片機的硬件結(jié)構(gòu)得到了簡化,那么,相應(yīng)的軟件設(shè)計上就得多開銷一些。在1個中斷服務(wù)程序中,若想對多個中斷源作出處理,就必須在進(jìn)入中斷服務(wù)程序后,首先執(zhí)行調(diào)查具體中斷源的一條或多條指令,其后才能對查到的中斷源作出有針對性的服務(wù)。如此以來,就形成了1次中斷從CPU響應(yīng)到進(jìn)入針對性處理的延遲時間。該時間有長有短,它會隨著被開放的中斷源的個數(shù)的增加而增加。最好情況是只有1個中斷源被開放,這時不需要檢測中斷源就可以立即進(jìn)入針對性處理;最壞情況是所有中斷源全部開放,此時用在檢測中斷源上的時間會最長。
  另外,PIC單片機中采用的是硬件堆棧結(jié)構(gòu)。其好處是既不占用程序存儲器

空間,也不占用數(shù)據(jù)存儲器空間,同時也不需用戶去操作堆棧指針;但此時也帶來1個不可回避的弱點,即不具備像其他單片機指令系統(tǒng)中的壓棧(PUSH)和出棧(POP)指令那樣,實現(xiàn)中斷現(xiàn)場的保護(hù)會麻煩一些,并且占用的處理時間也相應(yīng)多一點。
  2 中斷的現(xiàn)場保護(hù)問題
  中斷現(xiàn)場的保護(hù)是中斷技術(shù)中一個很重要的環(huán)節(jié)。在進(jìn)入中斷服務(wù)程序期間,只有返回地址,即程序計數(shù)器PC的值被自動壓入堆棧。若需要保留其他寄存器的內(nèi)容,就得由程序員另想辦法。由于PIC單片機的指令系統(tǒng)中沒有像其他單片機那樣的PUSH(入棧)和POP(出棧)之類的指令,所以要用1段用戶程序來實現(xiàn)類似的功能。因為是用1段程序來實現(xiàn)現(xiàn)場保護(hù),而程序的執(zhí)行有可能會影響到W寄存器和STATUS寄存器,所以,首先應(yīng)該把這2個寄存器保護(hù)起來,然后再去保存其他用戶認(rèn)為有必要保護(hù)的寄存器。并且在PIC單片機中,中斷現(xiàn)場數(shù)據(jù)不是保留到芯片的堆棧存儲區(qū)中,而是保留在用戶自己選擇的一些文件寄存器(即RAM數(shù)據(jù)存儲器單元)中,當(dāng)然一般應(yīng)該選擇通用寄存器來保護(hù)現(xiàn)場。下面給出的是1段原廠家最新提供的實現(xiàn)保護(hù)中斷現(xiàn)場的范例程序片段。
  ;將W、STATUS和PCLATH寄存器的內(nèi)容保存到臨時備份寄存器中
 ?。?]MOVWFW_TEMP   ;復(fù)制W到它的臨時備份寄存器W_TEMP中
 ?。?]SWAPFSTATUS,W ;將STATUS寄存器高低半字節(jié)交換后放入W
 ?。?]CLRFSTATUS ;不管當(dāng)前處在哪個體,都設(shè)置體0作當(dāng)前體
 ?。?]MOVWFSTATUS_TEMP ;保存STATUS到體0上的臨時寄存器STATUS_TEMP
 ?。?]MOVF PCLATH, W ;把寄存器PCLATH內(nèi)容復(fù)制到W中
  [6]MOVWFPCLATH_TEMP ;經(jīng)W將PCLATH內(nèi)容轉(zhuǎn)到臨時寄存器PCLATH_TEMP
 ?。?]CLRFPCLATH ;不管當(dāng)前處在哪頁,都把PCLATH設(shè)置成指向頁0(中斷服務(wù)程序的核心部分)
 ?。?]MOVFPCLATH_TEMP, W ;經(jīng)過W轉(zhuǎn)移
  [9]MOVWFPCLATH ;恢復(fù)PCLATH內(nèi)容
 ?。?0]SWAPFSTATUS_TEMP,W ;將STATUS_TEMP寄存器高低半字節(jié)交換后放入W 

[11]MOVWFSTATUS ;把W內(nèi)容移動到STATUS寄存器,(同時也把當(dāng)前體恢復(fù)到原先的體上)
 ?。?2]SWAPFW_TEMP,F ;將W_TEMP內(nèi)容高低半字節(jié)交換后放回
  [13]SWAPFW_TEMP,W ;再次將W_TEMP內(nèi)容高低半字節(jié)交換后放入W
  這段程序適用于PIC16CXX系列中各款型號的單片機。在這段例程之前,假設(shè)預(yù)先對于待保留的各個寄存器都分別定義了相應(yīng)的臨時備份寄存器。用后綴“_TEMP”表示臨時備份寄存器,例如“W”的臨時備份寄存器記為“W_TEMP”。對于這些臨時備份寄存器究竟需要定義多少個,定義在通用寄存器區(qū)域中的哪個位置,都是值得考究的問題。并且單片機的型號不同,其內(nèi)部的通用寄存器區(qū)域的分布也不同,因此這就使得臨時備份寄存器定義的數(shù)量和位置也不能相同。
  例如,對于PIC16F873/874來說,要求寄存器W_TEMP必須在文件寄存器(即RAM數(shù)據(jù)存儲器)的體0和體1上各定義1個,并且這2個W_TEMP寄存器單元必須具有相同的體內(nèi)地址碼(比如,在體0上把W_TEMP定義在20H單元,則在體1上就把另一個W_TEMP定義在A0H單元);而其他寄存器的臨時備份寄存器(如STATUS_TEMP和PCLATH_TEMP)都僅僅需要在體0上定義1個即可。 

又例如,對于PIC16F87X子系列中的其他5款型號來說,情況有所不同。其文件寄存器各個體的頂端部分有16個地址空間,都會尋址到相同的16個物理單元上。這16個單元不需要體選尋址,或者說,尋址這16個單元與體選碼無關(guān),即與當(dāng)前所處的體無關(guān)。因此,將各個臨時備份寄存器都安排在這個位置(W_TEMP也只需要定義1個即可)最為合適。這樣做可以使得現(xiàn)場保護(hù)和現(xiàn)場恢復(fù)變得非常容易。中斷是一種隨機發(fā)生的事件。進(jìn)入中斷服務(wù)程序后,第1個要保存的應(yīng)該是工作寄存器W。原因是PIC單片機沒有在“不同寄存器”之間進(jìn)行直接傳遞的指令,這樣的功能得用W作中轉(zhuǎn)(需要2條指令)才能實現(xiàn),所以應(yīng)該先把W寄存器騰空(對應(yīng)程序中第1條指令)。急于騰空W寄存器,又不能破壞當(dāng)前狀態(tài)寄存器STATUS中的體選碼,還不能影響當(dāng)前狀態(tài)寄存器STATUS內(nèi)的標(biāo)志位,可又無法確定主程序所處的RAM數(shù)據(jù)存儲器當(dāng)前體是哪一個,就只好在主程序所有可能選擇到的每一個RAM數(shù)據(jù)存儲器體上的相同位置,都定義1個W_TEMP臨時備份寄存器。
  一旦把工作寄存器W騰空后,緊接著就應(yīng)將狀態(tài)寄存器STATUS的內(nèi)容轉(zhuǎn)移到W中。完成這一操作的指令也不能影響到STATUS寄存器內(nèi)部原有的標(biāo)志位,原因是STATUS寄存器的內(nèi)容在此之前還沒有安全地保護(hù)起來。經(jīng)過仔細(xì)分析得知,PIC16系列單片機的指令系統(tǒng)中有3條“MOV”傳送指令。但是,只有1條“MOVF f,W”是以RAM單元為源寄存器,以W為目標(biāo)寄存器的;而這條指令的操作過程又偏偏會影響“Z”標(biāo)志位。因此,該指令就不能使用了,只好用1條既有高、低半字節(jié)交換功能又有傳遞功能的“SWAPFSTATUS,W”來勉強頂替(對應(yīng)程序中第2條指令)。不過在此只利用它的傳遞功能,其交換功能帶來的多余操作還得記下來,等到工作完成之后還得把它倒換回來。
STATUS寄存器的內(nèi)容已經(jīng)保存到W中時,就可以大膽地將其清0了,以便把定義著STATUS_TEMP和PCLATH_TEMP的體0設(shè)置為當(dāng)前體(對應(yīng)程序中第3條指令)。經(jīng)過以上幾步特別需要謹(jǐn)慎的操作過后,就可以輕而易舉地將寄存器STATUS和PCLATH的內(nèi)容保存到各自的臨時備份寄存器中了(對應(yīng)程序中第4~6條指令)。 

在單片機初始加電時,自動將PCLATH清0,以避免其內(nèi)容出現(xiàn)隨機值,也就是為了避免在以后的程序運行過程中CPU發(fā)生不可預(yù)料的跳轉(zhuǎn),而造成程序的“跑飛”。由此可見,寄存器PCLATH對于程序的安全運行是至關(guān)重要的,不可輕視。程序一旦進(jìn)入服務(wù)程序后,PCLATH的當(dāng)前值為何就無從考證,實際上就失去了對于PCLATH內(nèi)容的知情權(quán)。只好像單片機初始上電那樣將其清0,重新把它強行“拉入”知情范圍(對應(yīng)程序中第7條指令)。
  PCLATH的內(nèi)容在2種情況下會影響到程序的走向:第1種情況是當(dāng)執(zhí)行GOTO和CALL這2條跳轉(zhuǎn)指令時,11位地址碼來源于指令碼中,決定程序存儲器頁面的(PC值的)最高2位,來源于PCLATH<4:3>,即這種情況下只有PCLATH的2位影響程序走向。單單就這一種情況而言,只要用戶程序不超過第0頁(或稱頁0)的2KB范圍,對于程序員來說,PC值的最高2位可以忽略,因而PCLATH寄存器PCLATH<4:3>的2位也可以忽略。第2種情況是,以PCL為目標(biāo)的算術(shù)運算、邏輯運算或傳送操作指令(PIC16系列單片機的指令系統(tǒng)中具備14條這樣的指令),在操作過程中,自動用PCLATH寄存器的低5位裝載PC的高5位PC<12:8>,影響程序走向的PCLATH內(nèi)容就多達(dá)5位。即使對于用戶程序不超過(第0頁范圍內(nèi)的)2KB的情況,也至少會有3位影響到程序的走向。對于程序員來說,PCLATH的內(nèi)容就不可忽略,必須保護(hù)。 

總而言之,對于寄存器PCLATH的保護(hù)和處理(對應(yīng)程序中陰影標(biāo)出的部分指令,即第5~9條)并不是什么情況下都是必需的,但是在編寫中斷服務(wù)程序時,統(tǒng)一安排這些指令也沒有任何壞處。只要主程序和中斷服務(wù)程序中都不需要修改PCLATH寄存器的內(nèi)容,就可以不保護(hù)它。具體地說,只有當(dāng)同時滿足以下2個條件時,陰影標(biāo)出的部分指令(即第5~9條)才可以省略。
 ?。?)在主程序和中斷服務(wù)程序中不都存在跨頁跳轉(zhuǎn)。例如:用戶程序沒有使用第0頁2KB空間之外的程序存儲器,或者用戶程序雖然超出了2KB的范圍,但是,在主程序和中斷服務(wù)程序中沒有同時用到GOTO或CALL指令,都能滿足該條。
 ?。?) 在主程序和中斷服務(wù)程序中沒有同時使用以PCL為目標(biāo)的操作指令(比如查表)。
保護(hù)現(xiàn)場的操作次序與恢復(fù)現(xiàn)場的操作次序應(yīng)該相反。程序中的第8~11條就是按照相反的順序恢復(fù)寄存器PCLATH和 STATUS內(nèi)容的。但是,不要忘記保護(hù)現(xiàn)場時采用“SWAPF STATUS,W”指令產(chǎn)生的多余的交換操作,在此只好再采用同樣的方法將其交換回來(對應(yīng)程序中第10條指令)。最后2條指令,將W_TEMP內(nèi)容的高、低半字節(jié)交換了2遍,才被恢復(fù)到工作寄存器W中。如果只用1條傳送指令“MOVF W_TEMP,W”又會產(chǎn)生1個新的問題:“MOVF W_TEMP,W”指令會影響“Z”標(biāo)志位,會破壞此前已經(jīng)被恢復(fù)的寄存器STATUS的內(nèi)容,這是我們所不希望的,也是不能容忍的。因此,在程序中利用了2條不影響標(biāo)志位的SWAP指令(即第12,13兩條指令)。雖然麻煩一點,但可以使這個問題得到圓滿的解決。 

最后必須進(jìn)一步強調(diào)的是,并不是所有情況下編寫的中斷服務(wù)程序中都需要現(xiàn)場保護(hù),或者都需要像以上范例程序那樣進(jìn)行現(xiàn)場保護(hù)。有些情況下僅僅保護(hù)W、STATUS和PCLATH這3個寄存器還不夠。不過在此程序片段的基礎(chǔ)上,再增加或者減少需要保護(hù)的寄存器的個數(shù)都是輕而易舉的事。不要忘記,在保護(hù)任何文件寄存器之前都必須先把工作寄存器W保護(hù)起來才行得通。
  3 需要注意的幾個問題
  (1)中斷標(biāo)志位的狀態(tài)與該中斷源是否產(chǎn)生中斷無關(guān)。換句話說,不管是否允許其中斷,只要滿足中斷的條件,中斷標(biāo)志位就會被置位。另外,也可以利用軟件將中斷標(biāo)志位置“1”或清“0”。
  (2)當(dāng)開放某一中斷源時,該中斷源就是通過中斷標(biāo)志位向CPU申請中斷的。無論什么原因,只要將中斷標(biāo)志位置位,就會產(chǎn)生中斷。如果用軟件強行將中斷標(biāo)志位置位,也會產(chǎn)生中斷。
 ?。?)如果在中斷被屏蔽(或禁止)的情況下,中斷標(biāo)志位被置位,只要不被清除就會一直潛伏下來,那么,一旦解除屏蔽,就會立即產(chǎn)生中斷。
 ?。?)如果在中斷被禁止的情況下,中斷標(biāo)志位已經(jīng)被置位,但是,假如在允許其中斷之前將它清除,那么,即使解除禁止,它也不會產(chǎn)生中斷。
 ?。?)當(dāng)CPU相應(yīng)的任何一個中斷時,全局中斷屏蔽位GIE將會自動清0;當(dāng)中斷返回時它又會自動恢復(fù)為1。如果在中斷處理期間用軟件將已經(jīng)復(fù)位的GIE重新置位,這時再出現(xiàn)中斷請求,就可以形成中斷嵌套。也就是說,如果在響應(yīng)某一中斷期間又響應(yīng)了其他中斷請求,就形成了中斷嵌套。發(fā)生中斷嵌套時,前一中斷處理過程被暫停而進(jìn)入后一中斷處理,當(dāng)后一中斷過程被處理完畢之后,才會繼續(xù)處理前一中斷。照此方式,還可以形成多級嵌套,甚至自身嵌套。不過嵌套的級數(shù)絕對不能超過硬件堆棧的深度。 

(6) 對于中斷響應(yīng)和處理時間有嚴(yán)格要求的應(yīng)用,保護(hù)現(xiàn)場的指令安排也應(yīng)考慮延時問題。
 ?。?)如果同時發(fā)生多個中斷請求,得到優(yōu)先處理的中斷完全取決于在中斷服務(wù)程序中檢查中斷源的順序。原因是各個中斷源之間不存在優(yōu)先級別之分。
如果清除中斷標(biāo)志位的指令安排在中斷服務(wù)程序的尾部,就有可能丟失響應(yīng)在處理中斷期間該中斷源第2次中斷請求的機會。


定日县| 五常市| 南昌市| 云阳县| 固始县| 舒兰市| 时尚| 安岳县| 永善县| 张家川| 铜鼓县| 泗阳县| 泸西县| 册亨县| 嘉鱼县| 自贡市| 海城市| 嘉义县| 常山县| 江达县| 靖州| 津市市| 得荣县| 长宁县| 乌兰浩特市| 积石山| 临泉县| 赤峰市| 鸡泽县| 高清| 正定县| 霍山县| 嘉黎县| 区。| 石柱| 吉水县| 德钦县| 融水| 军事| 连江县| 靖远县|