文/嚴(yán)成武
如果在中斷服務(wù)程序中要占用一些寄存器進(jìn)行運(yùn)算,而在主程序中這些寄存器也是很重要的,為了二者互不干擾,所以在進(jìn)入中斷服務(wù)程序時(shí)就要保存寄存器的數(shù)值,以便在從中斷返回后繼續(xù)正常的往下執(zhí)行,這種保存寄存器數(shù)值的過程就是現(xiàn)場(chǎng)保護(hù)。
在單片機(jī)運(yùn)行程序時(shí),一般要用到多個(gè)寄存器,特別是累加器、狀態(tài)寄存器等等,中斷服務(wù)程序是屬于一種處理突發(fā)性事件的程序,在正常運(yùn)行程序任意時(shí)刻都可以插入進(jìn)來的程序。所以,在進(jìn)入中斷程序時(shí),可能累加器保存著數(shù)據(jù),這時(shí)中斷程序也要用累加器,如果不保存,到退出中斷時(shí),原來的數(shù)據(jù)已經(jīng)變了,這樣就不知會(huì)發(fā)生什么狀況了。
本文以義隆電子EM78P451型號(hào)單片機(jī)為例,說明中斷現(xiàn)場(chǎng)保護(hù)實(shí)現(xiàn)的方法。在EM78P451的硬件結(jié)構(gòu)中,有3個(gè)很重要的特殊功能寄存器,分別為:
(1)累加器A。用于內(nèi)部數(shù)據(jù)傳輸。
(2)狀態(tài)寄存器R3。保存單片機(jī)的各種狀態(tài)位和選擇ROM的當(dāng)前頁(yè)。
(3)RAM選擇寄存器R4。選擇RAM的BANK區(qū)。
通常,在使用EM78P451時(shí),主程序和中斷服務(wù)程序都會(huì)用到這3個(gè)寄存器。因此,進(jìn)入中斷程序時(shí),需要先將這3個(gè)寄存器保存到普通RAM中;在退出中斷程序時(shí),要將保存的值恢復(fù)到這3個(gè)寄存器中。
由于EM78P451沒有象51系列單片機(jī)那樣的PUSH、POP指令,所以我們要用一段程序來實(shí)現(xiàn)類似的功能。
又寫作“籠羅”。《晉書·劉元海載記》:“及元海僣號(hào),人謂元達(dá)曰,‘往劉公相屈,君蔑而不顧,今稱號(hào)龍飛,君其懼乎?’元達(dá)曰,‘彼人姿度卓犖,有籠羅宇宙之志,吾固知之久矣?!庇謱懽鳌盎\落”?!墩f文·竹部》:“笯,鳥籠也?!薄冻o·九章》:“鳳皇在笯兮。王逸注云,‘笯,籠落也。’”《方言》:“笯,籠,南楚江沔之閑謂之篣。”以上“籠絡(luò)”“籠羅”“籠落”皆有“包羅、覆蓋”之義。
要實(shí)現(xiàn)將這3個(gè)寄存器保存到普通RAM中,必須要用到數(shù)據(jù)傳送指令,而EM78P451中的所有數(shù)據(jù)傳送指令都要用到累加器A。因此,我們第一步必須先保存累加器A。而EM78P451中的絕大部分?jǐn)?shù)據(jù)傳送指令在運(yùn)行的過程中會(huì)改變狀態(tài)寄存器R3的數(shù)據(jù),所以在保護(hù)好狀態(tài)寄存器R3之前禁止使用會(huì)改變狀態(tài)寄存器R3的指令 。數(shù)據(jù)傳送指令不會(huì)改變選擇寄存器R4的值,可放在最后保存。
綜上所述,我們應(yīng)首先用一條不會(huì)改變狀態(tài)寄存器R3的指令,將累加器A保存到普通RAM中;然后,再保存狀態(tài)寄存器R3;最后,保存選擇寄存器R4。
恢復(fù)現(xiàn)場(chǎng)的過程則與保護(hù)現(xiàn)場(chǎng)的過程相反。
語句1:MOV TEMP_A,A ;保存累加器A,這條指令不影響R3的值
語句2:SWAPA R3 ;將R3高低4位交換,并傳送到A
語句3:MOV TEMP_R3,A ;保存R3
語句4:MOV A,R4 ;將R 4傳送到A語句5:MOV TEMP_ R4,A ;保存R4
語句1:MOV A,TEMP_R4 ;將之前保存的R 4值傳送到A
語句2:MOV R4,A ;恢復(fù)R4的值
語句3:SWAPA TEMP_R3 ;將之前保存的R3的值,高低4位交換,并傳送到A
語句4:MOV R3,A ;恢復(fù)R3的值
語句5:SWAP TEMP_A ;將之前保存的A的值,高低4位交換,這條指令不影響R3的值
語句6:SWAPA TEMP_A ;將之前保存的A的值再高低4位交換,并恢復(fù)A的值,這條指令不影響R3的值
這樣,就完整地實(shí)現(xiàn)EM78P451單片機(jī)的中斷現(xiàn)場(chǎng)保護(hù)功能。
文章在對(duì)EM78P451單片機(jī)的中斷現(xiàn)場(chǎng)保護(hù)要求和指令功能進(jìn)行了分析之后,提出了一種簡(jiǎn)單、可靠的單片機(jī)中斷現(xiàn)場(chǎng)保護(hù)方法,并給出了具體的保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)的程序。文章使用的方法具有通用性和易用性,并在基于義隆電子EM78P451型號(hào)單片機(jī)的中斷服務(wù)程序中得到應(yīng)用,取得了良好的效果,對(duì)單片機(jī)的程序開發(fā)具有實(shí)際的參考價(jià)值。
參考文獻(xiàn)
[1]徐惠民,安德寧編著.單片微型計(jì)算機(jī)[M].北京郵電學(xué)院出版社,2013.
[2]馬忠梅編著.單片機(jī)的C語言應(yīng)用程序設(shè)計(jì)[M].北京航空航天大學(xué)出版社,2014.