色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析Cortex-M FPU的Lazy Stacking機制

嵌入式那些事 ? 來源:嵌入式那些事 ? 2023-10-16 09:58 ? 次閱讀

1.浮點運算指令

浮點運算指令用于FPU單元的單精度浮點運算。浮點運算指令都是用V開頭的匯編指令。

只有在FPU開啟的狀態下,才能運行這些指令。

如果在FPU沒有開啟的狀態下,執行了浮點運算指令,系統會產生一個硬fault異常。

2.為什么FPU需要Lazy Stacking

當Cortex-M系列的芯片多了對浮點運算的支持之后,在中斷響應和退出時會增加對FPU擴展寄存器的保護。

入棧浮點寄存器組所帶來的影響有如下幾方面:

a.增加stack frame所占的存儲區域;

b.增加中斷響應延遲;

c.在OS環境下,增加上下文切換時間;

為了減少中斷響應延遲和OS環境下的上下文切換時間,引入了FPU的Lazy Stacking機制。

3.FPU Lazy Stacking簡述

Lazy Stacking機制在下面的情況下,會跳過對浮點寄存器組的入棧操作(僅預留浮點寄存器組S0~S15和FPSCR的存儲空間),以避免中斷延遲的增加:

a.中斷處理函數不使用FPU;

b.被中斷的程序未曾用到FPU;

被中斷函數使用了FPU,如果在執行中斷處理函數時也用到了FPU,在執行到中斷函數的第一條浮點指令時,內核會暫停,然后硬件自動將先前的浮點寄存器內容(S0~S15,FPSCR)壓入預留的存儲空間中。

Lazy Stacking是可以通過軟件使能和關閉的,如下述操作:

a.使能Lazy Stacking必須同時置位FPCCR寄存器的LSPEN位和ASPEN位;

b.清除FPCCR寄存器的LSPEN位可以關閉Lazy Stacking;

關于FPCCR寄存器的LSPEN位和ASPEN位的組合情況有如下說明:

FPCCR.ASPEN FPCCR.LSPEN 說明
0 0 取消自動狀態保存。中斷響應時不入棧FPU寄存器。
應用場景:
1. 應用中沒有用到OS或者多任務調度,如果沒有任何中斷異常用到FPU。
2. 在應用程序代碼中只有一個中斷用到FPU。如果有多個中斷用到FPU,那么中斷嵌套必須被禁止。可以通過把所有的中斷優先級設置位相同優先級實現。
1 0 關閉Lazy Stacking,僅打開自動狀態保存。
如果用到FPU,CONTROL.FPCA位自動置1。中斷響應時,硬件自動入棧S0~S15和FPSCR寄存器。
1 1 打開Lazy Stacking,打開自動狀態保存。
如果用到FPU,CONTROL.FPCA位自動置1。如果響應中斷時,CONTROL.FPCA為1,處理器在堆棧中預留FPU寄存器的空間,同時將FPCCR.LSPACT位置1。但是PFU寄存器并沒有馬上入棧,直到在中斷處理函數中用到FPU時再入棧。
0 1 非法配置

4.FPU Lazy Stacking用到的幾個重要標志

浮點寄存器入棧和出棧過程中用到的標志位:

標志位 說明
CONTROL.FPCA 0 = 當前上下文中沒有用到FPU
1 = 當前上下文中用到FPU
這里的上下文,即表示普通的任務上下文,也表示中斷上下文。
FPCCR.LSPACT 0 = 退出Lazy狀態(實際入棧后被硬件清零或者中斷返回時硬件清零)
1 = 進入Lazy狀態(棧幀中預留了FPU寄存器的空間,但沒有實際入棧)
EXC_RETURN[4] 0 = 棧幀中包括了FPU寄存器空間
1 = 棧幀中不包括FPU寄存器空間

5.FPU Lazy Stacking使用實例

下面的例子都是在使能了FPU的Lazy Stacking機制下進行說明的。

(1).被中斷的程序和中斷程序中都沒有使用到FPU,其示意圖如下所示:

7f2ac6e6-6a67-11ee-939d-92fbcf53809c.png

Snipaste_2020-04-10_11-46-40

(2).被中斷的程序用到了FPU,中斷程序中沒有使用到FPU,其示意圖如下所示:

7f438bf4-6a67-11ee-939d-92fbcf53809c.png

Snipaste_2020-04-10_12-38-54

(3).被中斷的程序和中斷程序中都用到了FPU,其示意圖如下所示:

7f5a885e-6a67-11ee-939d-92fbcf53809c.png

Snipaste_2020-04-10_14-05-19

6.RTOS使用Lazy Stacking

首先肯定是要使能FPU的Lazy Stacking,然后在PendSV切換任務的時候做下面的處理:

(1).上文保存階段:檢測 EXC_RETURN 的 bit4(通過LR訪問),如果該位為零,就入棧剩下的S16-S31 即可;如果該位為 1,則無需保存 FPU 寄存器,因為該任務未曾使用過 FPU。當然了這里有一個標志數據,表示當前任務是否使用了FPU,便于下次任務恢復時,確定是否需要從堆棧彈出內容到S16-S31。標志數據也壓入當前任務的堆棧進行保存。

(2).下文恢復階段:從堆棧中彈出標志數據,判斷待恢復的任務是否使用了FPU,如果使用了FPU,那么從堆棧中彈出內容到S16-S31;如果沒有使用FPU,則不需要恢復FPU寄存器。接下來需要修改當前LR寄存器的內容,如果使用了FPU,LR(EXC_RETURN)的bit4需要清零,來保證在退出PendSV時將先前壓入該任務堆棧的S0-S15和FPSCR寄存器出棧;如果沒有使用FPU,LR(EXC_RETURN)的bit4需要置1,來告訴CPU該任務棧幀中不包括FPU寄存器內容,不需要進行出棧操作。

對于S0-S15和FPSCR寄存器,如果任務使用了FPU,在進入到PendSV之前,就在任務堆棧中預留了存儲空間,當執行上文保存階段的S16-S31的入棧操作時,會首先將S0-S15和FPSCR寄存器壓入先前堆棧預留的存儲空間中,接著再將S16-S31壓入堆棧。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120232
  • SCR
    SCR
    +關注

    關注

    2

    文章

    150

    瀏覽量

    44183
  • 中斷處理
    +關注

    關注

    0

    文章

    94

    瀏覽量

    10967
  • FPU
    FPU
    +關注

    關注

    0

    文章

    42

    瀏覽量

    21311
  • Cortex-M
    +關注

    關注

    2

    文章

    229

    瀏覽量

    29752

原文標題:Cortex-M FPU的Lazy Stacking機制

文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    為什么說Cortex-M是低功耗應用的首選

    雖然Cortex-M處理器家族目標瞄準效能光譜較低端的區域,但是和大多數微控制器(MCU)采用的其他典型處理器相比,Cortex-M的效能依然算相當強悍。舉例來說,像是許多高效能微控制器所采用的Cortex-M4與
    發表于 07-28 09:44 ?3481次閱讀
    為什么說<b class='flag-5'>Cortex-M</b>是低功耗應用的首選

    你總得知道你為什么要用Cortex-M

    你總得知道你為什么要用Cortex-M無論您是資深嵌入式工程師,還是懷著滿滿好奇的嵌入式小白,總會有這樣的一些疑惑:Cortx-A、R、M到底什么區別呢?M0、M0+、
    發表于 06-09 16:50

    PIC32MK FPU與上下文切換

    with the Cortex M4F, which gives three options: never, always, and lazy (where lazy means
    發表于 08-27 15:03

    ARM Cortex-M堆棧機制介紹

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M堆棧機制。  今天給大家分享的這篇依舊是2016年之前痞子衡寫的技術文檔,花了點時間重新編排了一下
    發表于 12-16 06:26

    ARM Cortex-M內核的相關資料推薦

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是ARM Cortex-M功能模塊,不過側重點是三款安全特性處理器。  ARM Cortex-M處理器家族發展至今(2020),已有
    發表于 12-27 07:21

    Atmel Studio 6軟件中如何調試ARM Cortex-M

    Atmel Studio 6軟件中如何調試ARM Cortex-M
    的頭像 發表于 07-04 10:49 ?4239次閱讀

    關于STM32和Cortex-M內核系列介紹(1)

    Cortex-M內核系列和STM32-講座
    的頭像 發表于 07-05 01:07 ?8045次閱讀

    關于STM32與Cortex-M內核系列的介紹(2)

    Cortex-M內核系列和STM32-講座3
    的頭像 發表于 07-05 00:45 ?4524次閱讀

    關于Cortex-M 調試應用的介紹

    Cortex-M 調試應用
    的頭像 發表于 07-10 00:56 ?2618次閱讀

    米爾科技Cortex-M Prototyping System +介紹

    ARM? Cortex?-M原型系統 MPS2+,為Cortex-M 系列微處理器設計的原型驗證評估系統,包含最新的Cortex-M7 及Corte
    的頭像 發表于 11-14 10:45 ?1939次閱讀
    米爾科技<b class='flag-5'>Cortex-M</b> Prototyping System +介紹

    Cortex-M內核的MPU內存保護單元

    講講Cortex-M內核的MPU內存保護單元
    的頭像 發表于 03-04 11:17 ?3674次閱讀
    <b class='flag-5'>Cortex-M</b>內核的MPU內存保護單元

    Cortex-M可以跑Linux操作系統嗎?

    Cortex-M可以跑Linux操作系統嗎?
    發表于 12-01 11:36 ?2次下載
    <b class='flag-5'>Cortex-M</b>可以跑Linux操作系統嗎?

    no cortex-m sw device found 問題解決【轉】

    no cortex-m sw device found 問題解決【轉】
    發表于 12-02 17:36 ?33次下載
    no <b class='flag-5'>cortex-m</b> sw device found 問題解決【轉】

    Cortex-M位帶操作的原理

    Cortex-M位帶操作的原理
    的頭像 發表于 10-24 15:27 ?881次閱讀
    <b class='flag-5'>Cortex-M</b>位帶操作的原理

    如何使用Keil打開GD32 FPU及使用ARM DSP庫 ?

    GD32目前支持ARM Cortex-M和RISC-V兩種內核系列芯片,其中Cortex-M內核已經支持的有M3、M4、M23、
    的頭像 發表于 01-13 09:42 ?3550次閱讀
    如何使用Keil打開GD32 <b class='flag-5'>FPU</b>及使用ARM DSP庫 ?
    主站蜘蛛池模板: 97成人免费视频| 老妇高潮潮喷到猛进猛出| 在线观看永久免费网址| 日本人六九视频| 黑色丝袜美腿美女被躁翻了| 啊片色播电影| 在线自拍综合亚洲欧美| 97人妻无码AV碰碰视频| 一个吃奶两个添下面H| 午夜特级毛片| 日本色呦呦| 香蕉视频国产精品| 色情内射少妇兽交| 欧美精品99久久久啪啪| 久久视频精品38在线播放| 国产中文视频无码成人精品| 古装性艳史电影在线看| XXX国产麻豆HD| chinesevideos原创麻豆| 最近中文字幕2019免费版| 一受多攻高h| jk制服喷水| 国产人人为我我为人人澡| 国产产乱码一二三区别免费| 福利一区福利二区| 嘟嘟嘟在线视频免费观看高清中文 | 久久综合色超碰人人| 精品午夜视频| 国产午夜一级淫片| 好男人好资源在线观看| 男宿舍里的呻吟h| 欧美在线视频一区| 青青草原伊人| 色综合久久88色综合天天提莫| 亚洲精品国产字幕久久vr| 亚洲国产欧美在线人成aaaa20| 91进入蜜桃臀在线播放| 国产色综合久久无码有码| 蜜芽资源高清在线观看| 全彩acg无翼乌火影忍者| 神马伦理2019影院不卡片|