51單片機(jī)interrupt和using使用詳解
51單片機(jī)中的中斷中出現(xiàn)了using?1,這是什么意思?我也是查了幾天資料,終于弄明白了,給大家分享一下,using n是工作寄存器組切換開關(guān),工作寄存器組與BANK是一個(gè)概念;
? ? ? 51的工作寄存器R0-R7共有4組,分別是BANK0、BANK1、BANK2、BANK3,在任何時(shí)刻,只有一個(gè)工作組生效!這4個(gè)組在RAM中的位置分別是[00H,07H]、[08H,0FH]、[10H,17H]、[18H,1FH],換句話說,RAM中的00H地址、08H地址、10H地址、18H地址,這四個(gè)地址的名字都叫R0,那么,在匯編中,我們經(jīng)??吹筋愃芃OV R0,#07這樣的語句,這個(gè)#07到底別放到了RAM的哪個(gè)地址中去了呢?00H?08H?10H?18H?到底是這4個(gè)中的哪一個(gè),取決于51的PSW寄存器的RS1和RS0兩個(gè)位,若PSW.RS=2就意味著第二組工作寄存器生效,R0的地址就是10H。
51在上電后,PSW的RS兩個(gè)位默認(rèn)為0,也即51默認(rèn)使用的工作寄存器組BANK 0,在默認(rèn)狀態(tài)下,對(duì)于普通的C語言函數(shù),其傳參、申請(qǐng)局部變量、導(dǎo)出函數(shù)的返回值等功能,keil將其翻譯成匯編后,肯定要使用R0-R7;對(duì)于51的中斷服務(wù)函數(shù),雖然沒有形參,也不用返回值,但是一般肯定有局部變量,這時(shí)就需要用到R0-R7了;試想,在執(zhí)行普通函數(shù)時(shí),默認(rèn)工作寄存器組BANK 0 的R0-R7已經(jīng)被使用了,在執(zhí)行普通函數(shù)時(shí),一旦發(fā)生中斷,而中斷函數(shù)也需要使用R0-R7,怎么辦?
我們能想得到是,在執(zhí)行中斷服務(wù)函數(shù)前把R0-R7入棧,中斷服務(wù)完成后再把R0-R7出棧恢復(fù)現(xiàn)場(chǎng),這樣工作量很大;
普通函數(shù)的執(zhí)行過程中,正在使用BANK0的R0-R7,執(zhí)行過程中,突然發(fā)生了中斷,而中斷函數(shù)也想使用R0-R7,在執(zhí)行中斷服務(wù)函數(shù)前,我們切換工作寄存器組,切換的具體方法就是直接修改PSW的RS兩個(gè)比特位,而不必把BANK0入棧,本文開頭的例子中using 2 就是說,在進(jìn)入外部中斷0的服務(wù)函數(shù)前,先入棧CPU寄存器,再把工作寄存器組由0切換成2,在退出中斷服務(wù)后,先由BANK2切換回BANK0,并彈出CPU寄存器,由于BANK0和BANK2處在不同的RAM空間,互不干擾,切換回BANK0之后,就把那個(gè)普通函數(shù)的現(xiàn)場(chǎng)給恢復(fù)了。