1.浮點(diǎn)運(yùn)算指令
浮點(diǎn)運(yùn)算指令用于FPU單元的單精度浮點(diǎn)運(yùn)算。浮點(diǎn)運(yùn)算指令都是用V開(kāi)頭的匯編指令。
只有在FPU開(kāi)啟的狀態(tài)下,才能運(yùn)行這些指令。
如果在FPU沒(méi)有開(kāi)啟的狀態(tài)下,執(zhí)行了浮點(diǎn)運(yùn)算指令,系統(tǒng)會(huì)產(chǎn)生一個(gè)硬fault異常。
2.為什么FPU需要Lazy Stacking
當(dāng)Cortex-M系列的芯片多了對(duì)浮點(diǎn)運(yùn)算的支持之后,在中斷響應(yīng)和退出時(shí)會(huì)增加對(duì)FPU擴(kuò)展寄存器的保護(hù)。
入棧浮點(diǎn)寄存器組所帶來(lái)的影響有如下幾方面:
a.增加stack frame所占的存儲(chǔ)區(qū)域;
b.增加中斷響應(yīng)延遲;
c.在OS環(huán)境下,增加上下文切換時(shí)間;
為了減少中斷響應(yīng)延遲和OS環(huán)境下的上下文切換時(shí)間,引入了FPU的Lazy Stacking機(jī)制。
3.FPU Lazy Stacking簡(jiǎn)述
Lazy Stacking機(jī)制在下面的情況下,會(huì)跳過(guò)對(duì)浮點(diǎn)寄存器組的入棧操作(僅預(yù)留浮點(diǎn)寄存器組S0~S15和FPSCR的存儲(chǔ)空間),以避免中斷延遲的增加:
a.中斷處理函數(shù)不使用FPU;
b.被中斷的程序未曾用到FPU;
被中斷函數(shù)使用了FPU,如果在執(zhí)行中斷處理函數(shù)時(shí)也用到了FPU,在執(zhí)行到中斷函數(shù)的第一條浮點(diǎn)指令時(shí),內(nèi)核會(huì)暫停,然后硬件自動(dòng)將先前的浮點(diǎn)寄存器內(nèi)容(S0~S15,F(xiàn)PSCR)壓入預(yù)留的存儲(chǔ)空間中。
Lazy Stacking是可以通過(guò)軟件使能和關(guān)閉的,如下述操作:
a.使能Lazy Stacking必須同時(shí)置位FPCCR寄存器的LSPEN位和ASPEN位;
b.清除FPCCR寄存器的LSPEN位可以關(guān)閉Lazy Stacking;
關(guān)于FPCCR寄存器的LSPEN位和ASPEN位的組合情況有如下說(shuō)明:
FPCCR.ASPEN | FPCCR.LSPEN | 說(shuō)明 |
---|---|---|
0 | 0 |
取消自動(dòng)狀態(tài)保存。中斷響應(yīng)時(shí)不入棧FPU寄存器。 應(yīng)用場(chǎng)景: 1. 應(yīng)用中沒(méi)有用到OS或者多任務(wù)調(diào)度,如果沒(méi)有任何中斷異常用到FPU。 2. 在應(yīng)用程序代碼中只有一個(gè)中斷用到FPU。如果有多個(gè)中斷用到FPU,那么中斷嵌套必須被禁止。可以通過(guò)把所有的中斷優(yōu)先級(jí)設(shè)置位相同優(yōu)先級(jí)實(shí)現(xiàn)。 |
1 | 0 |
關(guān)閉Lazy Stacking,僅打開(kāi)自動(dòng)狀態(tài)保存。 如果用到FPU,CONTROL.FPCA位自動(dòng)置1。中斷響應(yīng)時(shí),硬件自動(dòng)入棧S0~S15和FPSCR寄存器。 |
1 | 1 |
打開(kāi)Lazy Stacking,打開(kāi)自動(dòng)狀態(tài)保存。 如果用到FPU,CONTROL.FPCA位自動(dòng)置1。如果響應(yīng)中斷時(shí),CONTROL.FPCA為1,處理器在堆棧中預(yù)留FPU寄存器的空間,同時(shí)將FPCCR.LSPACT位置1。但是PFU寄存器并沒(méi)有馬上入棧,直到在中斷處理函數(shù)中用到FPU時(shí)再入棧。 |
0 | 1 | 非法配置 |
4.FPU Lazy Stacking用到的幾個(gè)重要標(biāo)志
浮點(diǎn)寄存器入棧和出棧過(guò)程中用到的標(biāo)志位:
標(biāo)志位 | 說(shuō)明 |
---|---|
CONTROL.FPCA |
0 = 當(dāng)前上下文中沒(méi)有用到FPU 1 = 當(dāng)前上下文中用到FPU 這里的上下文,即表示普通的任務(wù)上下文,也表示中斷上下文。 |
FPCCR.LSPACT |
0 = 退出Lazy狀態(tài)(實(shí)際入棧后被硬件清零或者中斷返回時(shí)硬件清零) 1 = 進(jìn)入Lazy狀態(tài)(棧幀中預(yù)留了FPU寄存器的空間,但沒(méi)有實(shí)際入棧) |
EXC_RETURN[4] |
0 = 棧幀中包括了FPU寄存器空間 1 = 棧幀中不包括FPU寄存器空間 |
5.FPU Lazy Stacking使用實(shí)例
下面的例子都是在使能了FPU的Lazy Stacking機(jī)制下進(jìn)行說(shuō)明的。
(1).被中斷的程序和中斷程序中都沒(méi)有使用到FPU,其示意圖如下所示:
Snipaste_2020-04-10_11-46-40
(2).被中斷的程序用到了FPU,中斷程序中沒(méi)有使用到FPU,其示意圖如下所示:
Snipaste_2020-04-10_12-38-54
(3).被中斷的程序和中斷程序中都用到了FPU,其示意圖如下所示:
Snipaste_2020-04-10_14-05-19
6.RTOS使用Lazy Stacking
首先肯定是要使能FPU的Lazy Stacking,然后在PendSV切換任務(wù)的時(shí)候做下面的處理:
(1).上文保存階段:檢測(cè) EXC_RETURN 的 bit4(通過(guò)LR訪(fǎng)問(wèn)),如果該位為零,就入棧剩下的S16-S31 即可;如果該位為 1,則無(wú)需保存 FPU 寄存器,因?yàn)樵撊蝿?wù)未曾使用過(guò) FPU。當(dāng)然了這里有一個(gè)標(biāo)志數(shù)據(jù),表示當(dāng)前任務(wù)是否使用了FPU,便于下次任務(wù)恢復(fù)時(shí),確定是否需要從堆棧彈出內(nèi)容到S16-S31。標(biāo)志數(shù)據(jù)也壓入當(dāng)前任務(wù)的堆棧進(jìn)行保存。
(2).下文恢復(fù)階段:從堆棧中彈出標(biāo)志數(shù)據(jù),判斷待恢復(fù)的任務(wù)是否使用了FPU,如果使用了FPU,那么從堆棧中彈出內(nèi)容到S16-S31;如果沒(méi)有使用FPU,則不需要恢復(fù)FPU寄存器。接下來(lái)需要修改當(dāng)前LR寄存器的內(nèi)容,如果使用了FPU,LR(EXC_RETURN)的bit4需要清零,來(lái)保證在退出PendSV時(shí)將先前壓入該任務(wù)堆棧的S0-S15和FPSCR寄存器出棧;如果沒(méi)有使用FPU,LR(EXC_RETURN)的bit4需要置1,來(lái)告訴CPU該任務(wù)棧幀中不包括FPU寄存器內(nèi)容,不需要進(jìn)行出棧操作。
對(duì)于S0-S15和FPSCR寄存器,如果任務(wù)使用了FPU,在進(jìn)入到PendSV之前,就在任務(wù)堆棧中預(yù)留了存儲(chǔ)空間,當(dāng)執(zhí)行上文保存階段的S16-S31的入棧操作時(shí),會(huì)首先將S0-S15和FPSCR寄存器壓入先前堆棧預(yù)留的存儲(chǔ)空間中,接著再將S16-S31壓入堆棧。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121205 -
SCR
+關(guān)注
關(guān)注
2文章
150瀏覽量
44322 -
中斷處理
+關(guān)注
關(guān)注
0文章
94瀏覽量
11016 -
FPU
+關(guān)注
關(guān)注
0文章
42瀏覽量
21383 -
Cortex-M
+關(guān)注
關(guān)注
2文章
229瀏覽量
29843
原文標(biāo)題:Cortex-M FPU的Lazy Stacking機(jī)制
文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
為什么說(shuō)Cortex-M是低功耗應(yīng)用的首選
![為什么說(shuō)<b class='flag-5'>Cortex-M</b>是低功耗應(yīng)用的首選](https://file1.elecfans.com//web2/M00/A6/C8/wKgZomUMQGiAAGM_AAEW_x_tsbU948.jpg)
你總得知道你為什么要用Cortex-M
PIC32MK FPU與上下文切換
ARM Cortex-M堆棧機(jī)制介紹
ARM Cortex-M內(nèi)核的相關(guān)資料推薦
Atmel Studio 6軟件中如何調(diào)試ARM Cortex-M
米爾科技Cortex-M Prototyping System +介紹
![米爾科技<b class='flag-5'>Cortex-M</b> Prototyping System +介紹](https://file.elecfans.com/web1/M00/AA/61/o4YBAF2pd5eASIgpAAtD_mL9XAM707.png)
no cortex-m sw device found 問(wèn)題解決【轉(zhuǎn)】
![no <b class='flag-5'>cortex-m</b> sw device found 問(wèn)題解決【轉(zhuǎn)】](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何使用Keil打開(kāi)GD32 FPU及使用ARM DSP庫(kù) ?
![如何使用Keil打開(kāi)GD32 <b class='flag-5'>FPU</b>及使用ARM DSP庫(kù) ?](https://file1.elecfans.com/web2/M00/BC/62/wKgZomWh6m-ARph4AABDONJls0g088.png)
評(píng)論