亚洲 欧洲 日韩 综合色天使,久久国产Av无码一区二区老太,人妻醉酒被下药迷昏带到诊所 ,亚州老熟女A片AV色欲小说

什么叫中斷程序,中斷程序的特點(diǎn)?

現(xiàn)場(chǎng)的保護(hù)與恢復(fù),不但是前后臺(tái)多任務(wù)系統(tǒng)的中斷任務(wù)必備的組成,同樣也是FreeRTOS搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng)的核心組成部分。本文對(duì)比介紹這它們實(shí)現(xiàn)現(xiàn)場(chǎng)保護(hù)與恢復(fù)的不同方法和特點(diǎn)

一、80251CPU的寄存器

(1)STC32G單片機(jī)與Keil的C251編譯器都是基于80251CPU內(nèi)核的。當(dāng)單片機(jī)的某個(gè)任務(wù)運(yùn)行時(shí),最重要的資源就是全部寄存器。80251CPU的寄存器見下圖:

什么叫中斷程序,中斷程序的特點(diǎn)?

從圖中可以看到80251CPU的寄存器分為32位(雙字)寄存器10個(gè),16位(字)寄存器16個(gè),8位(字節(jié))寄存器16個(gè),圖中表格中的名稱就是80251匯編語言中的寄存器名稱。

80251和8051Intel經(jīng)過精心設(shè)計(jì)的兩款CPU內(nèi)核, 80251CPU中包含了一個(gè)完整的8051CPU,80251指令集中包含了一個(gè)完整的8051指令集。8051的8位累加器A和B對(duì)應(yīng)80251的R11和R10,這與80251CPU是大端數(shù)據(jù)存儲(chǔ)模式對(duì)應(yīng)。

80251的所有寄存器并不位于內(nèi)存地址空間,它們位于專門的“寄存器文件組”空間,除了“R0~R7”寄存器,其余寄存器只能用寄存器尋找模式對(duì)它們進(jìn)行賦值和讀取,不能用對(duì)內(nèi)存地址空間的尋址方式來操作它們,在上圖中用淺綠色表示。

(2)上圖中深綠色的8051的通用8位寄存器R0~R7是一組很特殊的寄存器,它是位于內(nèi)存地址空間的4組寄存器中的一組,見下圖所示:

什么叫中斷程序,中斷程序的特點(diǎn)?

8051的4組寄存器Bank0~Bank3,位于內(nèi)存DATA區(qū)域,占頭32個(gè)字節(jié)。在單片機(jī)運(yùn)行時(shí)根據(jù)程序狀態(tài)字“PSW”中的“RS1”和“RS0”兩位來決定8051指令中的“R0~R7”寄存器對(duì)應(yīng)的是哪個(gè)地址的數(shù)據(jù)。

比如加法指令“ADD A, R4”,當(dāng)RS1RS0=00時(shí),是將存在DATA空間地址04H的8位數(shù)據(jù)與A寄存器內(nèi)容相加,但是當(dāng)RS1RS0=10時(shí),卻是將存在DATA空間地址14H的8位數(shù)據(jù)與A寄存器內(nèi)容相加。

8051CPU采用這樣結(jié)構(gòu)兩個(gè)最重要的原因一是初期的51單片機(jī)運(yùn)行速度很低,二是1981年左右受工藝限制在集成電路中集成RAM很難很貴,因此對(duì)于要使用多個(gè)變量的程序沒有那么多內(nèi)存空間可以使用。采用的是4組寄存器的方法,本質(zhì)上是讓用戶在同一時(shí)刻擁有8個(gè)寄存器和24個(gè)字節(jié)的臨時(shí)寄存器變量,經(jīng)過優(yōu)化編譯,以較小的RAM空間實(shí)現(xiàn)大數(shù)據(jù)處理的需求。

(3)重要:在80251指令中涉及“R0~R7”寄存器的操作,并不唯一對(duì)于8個(gè)內(nèi)存地址,而是依賴于PSW中的字段“RS1RS0”的值將DATA空間的4組地址映射為“R0~R7”寄存器。

(4)在80251CPU中,8位、16位和32位寄存器不是獨(dú)立的,而是像金字塔一樣組成的。

下圖為80251通用寄存器的組成方法

什么叫中斷程序,中斷程序的特點(diǎn)?

比如32位的DR4寄存器由兩個(gè)16位的寄存器WR4和WR6組成,而16位的WR6寄存器由兩個(gè)8位的寄存器R6和R7組成。每一組的寄存器中一個(gè)發(fā)生變化,則這一組的寄存器都按組成方式變化。

(5)重要提示:從上面的組成圖可以看出,DR0和DR4、WR0~WR6寄存器依賴“R0~R7”寄存器,即使你沒有改變它們,但只要PSW中的字段“RS1RS0”的值發(fā)生變化,那么R0~R7就會(huì)被映射到不同的DATA區(qū)域,它們的值就會(huì)發(fā)生變化。

因此為了避免這種歧義,Keil的C251編譯器在對(duì)C語言程序進(jìn)行編譯的時(shí)候不會(huì)對(duì)PSW的字段“RS1RS0”進(jìn)行設(shè)置(其他字段在各種操作時(shí)由硬件設(shè)置)。

由于80251有很多的寄存器和DATA空間了,特別建議用戶如果沒有特別的目的不要用匯編語言去設(shè)置“RS1RS0”字段。

(6)由于80251指令集完整包含8051指令集,因此為了保證8051指令也能正確地運(yùn)行,80251CPU的特殊寄存器在SFR區(qū)域中也有一個(gè)對(duì)應(yīng)的映射。標(biāo)準(zhǔn)的80251CPU映射見下圖,具體的采用80251內(nèi)核的單片機(jī)的映射應(yīng)參考其技術(shù)手冊(cè)。

什么叫中斷程序,中斷程序的特點(diǎn)?

二、FreeRTOS任務(wù)切換時(shí)的現(xiàn)場(chǎng)保護(hù)與恢復(fù)

(7)當(dāng)前任務(wù)現(xiàn)場(chǎng)是指任務(wù)程序執(zhí)行到切換點(diǎn)時(shí)程序進(jìn)一步正確執(zhí)行時(shí)所需要的資源。FreeRTOS主要依靠定時(shí)器0的1KHz的中斷來掃描和調(diào)度任務(wù),因此當(dāng)前執(zhí)行的實(shí)時(shí)任務(wù)的切換點(diǎn)就是定時(shí)器0的中斷點(diǎn)。

定時(shí)器0中斷發(fā)生時(shí),24位的PC值(用戶下一條要執(zhí)行的程序地址)和PSW1程序狀態(tài)字已經(jīng)被組合位4個(gè)字節(jié)32位由硬件壓入堆棧了,其余的中斷服務(wù)程序由移植的FreeRTOS程序來完成。其中涉及中斷現(xiàn)場(chǎng)保護(hù)和恢復(fù)功能用匯編語言寫在“portasm.h”文件中。

(8)寄存器現(xiàn)場(chǎng)的保存與恢復(fù)。STC官方移植的FreeRTOS定時(shí)器0中斷現(xiàn)場(chǎng)的寄存器保護(hù)與恢復(fù)的程序見下圖:

什么叫中斷程序,中斷程序的特點(diǎn)?

上圖中第81行到第90行依次將9個(gè)32位的寄存器壓入堆棧保存,在將8051的程序狀態(tài)字PSW壓入堆棧保存。

在中斷退出時(shí)或者任務(wù)恢復(fù)時(shí),第97行到第106行程序?qū)⑦@些寄存器原樣從堆棧中恢復(fù)。

(9)關(guān)于R0~R7寄存器的討論。注意第88行和第89行是將R0~R7寄存器用對(duì)應(yīng)的32位寄存器DR0和DR4推入堆棧的,然后把PSW推入堆棧,這樣按照前面對(duì)R0~R7寄存器映射的討論,不管當(dāng)前任務(wù)用戶對(duì)字段“RS1RS0”的設(shè)置如何,這3條指令都已把當(dāng)前任務(wù)的正在使用的R0~R7寄存器現(xiàn)場(chǎng)保存了,無論它們處于哪個(gè)Bank。

要點(diǎn):對(duì)于STC官方移植的FreeRTOS,不需要像8051單片機(jī)一樣,在第90行后面加“PSW=0”這樣的語句來對(duì)字段“RS1RS0”進(jìn)行設(shè)置了。

(10)任務(wù)切換時(shí)對(duì)于任務(wù)堆棧的保存與恢復(fù)。

80251的系統(tǒng)SPX堆棧運(yùn)行在也只能運(yùn)行在EDATA內(nèi)存區(qū)域中,任務(wù)切換點(diǎn)的現(xiàn)場(chǎng)不但包括寄存器,還包括整個(gè)堆棧里面的內(nèi)容。比如在進(jìn)行函數(shù)訪問和嵌套時(shí),函數(shù)的返回地址就被LCALL或者ECALL指令保存在堆棧中,另外,可重入函數(shù)的參數(shù)和局部變量也放在了堆棧中,最后,為了實(shí)現(xiàn)某些算法,編程者需要把某些變量和數(shù)據(jù)臨時(shí)存放在堆棧中,當(dāng)然,還包括中斷發(fā)生時(shí)被壓入堆棧的寄存器數(shù)據(jù)。

由于STC官方移植的FreeRTOS運(yùn)行的內(nèi)存模式為“XSmall”模式,在這個(gè)模式下,用戶定義的任務(wù)的堆棧也放在了EDATA區(qū)域中。因此FreeRTOS采取了哪個(gè)任務(wù)運(yùn)行,就將SPX堆棧運(yùn)行在那個(gè)任務(wù)的任務(wù)堆棧中的方法,任務(wù)切換時(shí)只需要保存和恢復(fù)SPX的值,整個(gè)任務(wù)堆棧的內(nèi)容就被保存和恢復(fù)了。下圖是任務(wù)堆棧保存與恢復(fù)的程序:

什么叫中斷程序,中斷程序的特點(diǎn)?

其中DR60包括了SPX,第49行將其賦值到DR0,第50行將當(dāng)前任務(wù)的任務(wù)表地址賦值給DR4,然后第51行和第52行分兩個(gè)16位用間接尋址的方式保存SPX的值,實(shí)現(xiàn)了任務(wù)堆棧的保存。第59行到第62行是恢復(fù)任務(wù)SPX的值,完成恢復(fù)任務(wù)的功能。

采用這種將用戶任務(wù)堆棧設(shè)置在EDATA空間的方法,由于只保存和恢復(fù)SPX寄存器的值,不用進(jìn)行堆棧內(nèi)容復(fù)制,所以任務(wù)切換速度極快。但也注定STC官方移植的FreeRTOS V1.02版本只能運(yùn)行在“XSmal”模式。

三、C251中斷時(shí)的現(xiàn)場(chǎng)保護(hù)與恢復(fù)

在實(shí)際的FreeRTOS項(xiàng)目中,除了系統(tǒng)的定時(shí)器0中斷外,還有其他的中斷,在這些中斷中,如何保存中斷保存和恢復(fù)當(dāng)前任務(wù)現(xiàn)場(chǎng),如何協(xié)調(diào)這些中斷與FreeRTOS任務(wù)調(diào)度之間的關(guān)系,對(duì)于保障RTOS程序的正確運(yùn)行很重要。

(11)C251無局部變量中斷服務(wù)函數(shù)。下圖為一個(gè)典型的例子:

什么叫中斷程序,中斷程序的特點(diǎn)?

這個(gè)例子里,實(shí)際的中斷服務(wù)程序寫在另一個(gè)程序文件中,這里就只有一個(gè)函數(shù)訪問語句,在中斷函數(shù)里沒有使用局部變量。下面是對(duì)應(yīng)的編譯后的匯編語言列表:

什么叫中斷程序,中斷程序的特點(diǎn)?

對(duì)比前面FreeRTOS的定時(shí)器0系統(tǒng)中斷,一個(gè)是沒有保存DR12,另一個(gè)是DR56中,只保存了DPTR部分,沒有保存DPXL8位寄存器部分。

這是C251的約定:首先DR12(包括WR12、WR14、R12~R15)寄存器,保留給中斷函數(shù)中的局部變量使用,其他地方對(duì)C語言的編譯都不會(huì)使用,用戶編程時(shí)可以把它作為臨時(shí)變量使用;其次,DPXL的值由Keil的C251編程環(huán)境在單片機(jī)啟動(dòng)時(shí)設(shè)置,用戶程序和C251編譯器自己都不得改變它。

(12)C251有局部變量中斷服務(wù)函數(shù)。下圖為一個(gè)典型的例子:

什么叫中斷程序,中斷程序的特點(diǎn)?

這是CAN1的中斷服務(wù)程序,里面有兩個(gè)8位的變量“isr”和“store”,下圖是編譯后的中斷現(xiàn)場(chǎng)保存程序:

什么叫中斷程序,中斷程序的特點(diǎn)?

從上圖中可以看到比無變量情況,增加了“PUSH R15”指令。這是因?yàn)镃251編譯器將R15作為“store”變量使用。由于本中斷程序使用了“R15”,所以將用戶任務(wù)的“R15”作為現(xiàn)場(chǎng)保存,待中斷任務(wù)完成后再與其他寄存器一起恢復(fù)出來。

(13)C251簡(jiǎn)單中斷服務(wù)函數(shù)。下圖為一個(gè)典型的例子:

什么叫中斷程序,中斷程序的特點(diǎn)?

這是定時(shí)器1的中斷程序,它只是將P66的LED燈的電平翻轉(zhuǎn)。下圖是對(duì)應(yīng)的編譯后匯編語言列表:

什么叫中斷程序,中斷程序的特點(diǎn)?

從圖中可以看到,除了硬件中斷本身推入堆棧的24位PC和PSW1外,沒有再保存任何寄存器,包括PSW。這是因?yàn)椤癈PL P66”這條指令,不涉及任何寄存器,也不改變?nèi)魏蜳SW中的標(biāo)志位,所以不需要保存和恢復(fù)硬件中斷外的其他現(xiàn)場(chǎng)。

(14)結(jié)論。對(duì)于C251編譯器,如果用戶打開高級(jí)別優(yōu)化選項(xiàng),那么編譯器就會(huì)分析中斷程序的內(nèi)容,自動(dòng)地決定要保存或恢復(fù)多少中斷現(xiàn)場(chǎng)。

(15)下面是C51編譯器對(duì)STC8H8K單片機(jī)鍵盤掃描范例中的中斷程序:

什么叫中斷程序,中斷程序的特點(diǎn)?

其對(duì)應(yīng)的編譯結(jié)果為:

什么叫中斷程序,中斷程序的特點(diǎn)?

對(duì)比上面C251和這里C51保存中斷現(xiàn)場(chǎng)的程序,這里在保存寄存器現(xiàn)場(chǎng)中明顯第加入了“MOV PSW, #00”指令,而C251在任何情況下都沒有這條指令,這是為什么?限于篇幅,后文將給出詳細(xì)的原因分析。

本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 sumchina520@foxmail.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。
如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.qjsdgw.cn/141701.html