任務調度器——任務切換

一、開啟任務調度器

函數原型:

void vTaskStartScheduler( void )

作用:用于啟動任務調度器,任務調度器啟動后, FreeRTOS 便會開始進行任務調度

內部實現機制(以動態創建為例):

(1)首先,判斷動態創建任務 or 靜態創建任務

(2)創建空閑任務

(3)如果使能軟件定時器,則創建軟件定時器任務

(4)關閉中斷,防止調度器開啟之前或過程中,受中斷干擾,會在運行第一個任務時打開中斷?

5)初始化全局變量,并將任務調度器的運行標志設置為已運行?

(6)初始化任務運行時間統計功能的時基定時器

(7)調用函數 xPortStartScheduler()

xPortStartScheduler() :

(1)檢測用戶在 FreeRTOSConfig.h 文件中對中斷的相關配置是否有誤

(2)配置 PendSV 和 SysTick 的中斷優先級為最低優先級

(3)調用函數 vPortSetupTimerInterrupt()配置 SysTick(主要配置定時器的中斷周期

(4)初始化臨界區嵌套計數器為 0

(5)調用函數 prvEnableVFP()使能 FPU(M4與M7內核才有FPU)

(6)調用函數 prvStartFirstTask()啟動第一個任務

二、啟動第一個任務

????????要運行任務,必須把任務的寄存器的值加載到CPU的寄存器中,任務A的寄存器值,在一開始創建任務時就保存在任務堆棧里邊

注:

1、中斷產生時,硬件自動xPSR,PC(R15),LR(R14),R12,R3-R0出/入棧(保存和恢復);
R4~R11需要手動出/入棧(保存和恢復)

2、進入中斷后硬件會強制使用MSP指針 ,此時LR(R14)的值將會被自動被更新為特殊的EXC_RETURN

2.1 開啟第一個任務函數:prvStartFirstTask?()

__asm void prvStartFirstTask( void )
{/* 八字節對齊 */PRESERVE8/* 將向量表偏移量寄存器地址存儲到R0 */ldr r0, =0xE000ED08/* 向量表偏移量寄存器存儲著向量表的起始地址 *//* 將向量表起始地址存儲到R0 */ldr r0, [ r0 ]/* 將MSP的初始值存儲到R0 */ldr r0, [ r0 ]/* 使MSP回到最初值 */msr msp, r0/* 使能中斷 */cpsie icpsie fdsbisb/* 觸發SVC中斷,開啟第一個任務 */svc 0nopnop
/* *INDENT-ON* */
}

功能:用于初始化啟動第一個任務前的環境,主要是獲取MSP 指針的初始值,并使能全局中斷觸發SVC,開啟一個任務

Q:向量表偏移量寄存器為什么會出現在這?

?答:

?????????經過前面一系列的操作,MSP的值已經改變,為了獲取MSP的初始值,需要通過VTOR寄存器,找到向量表的起始地址,再通過此地址才可以找到MSP的初始值

程序在運行過程中需要一定的棧空間來保存局部變量等一些信息。當有信息保存到棧中時,
MCU 會自動更新 SP 指針,ARM Cortex-M 內核提供了兩個棧空間:

(1)MSP(主堆棧指針):它由 OS 內核異常服務例程以及所有需要特權訪問的應用程序代碼來使用

(2)PSP(進程堆棧指針):用于常規的應用程序代碼(不處于異常服務例程中時)

在FreeRTOS中,中斷使用MSP(主堆棧)中斷以外使用PSP(進程堆棧)

?

2.2 SVC中斷函數:void vPortSVCHandler( )

函數功能:恢復現場開啟中斷,并跳轉到PC所指向的函數中(第一個任務函數中

    //進行8字節對齊 PRESERVE8//將當前任務TCB結構體的指針的地址存儲在R3ldr r3, = pxCurrentTCB   /* Restore the context. *///通過地址找到當前任務結構的地址ldr r1, [ r3 ] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. *///通過地址找到第一個成員變量,棧頂指針(保存著更新后的地址,已經開辟了寄存器組的空間)ldr r0, [ r1 ]           /* The first item in pxCurrentTCB is the task top of stack. *///出棧ldmia r0 !, { r4 - r11 } /* 將出棧后的棧頂指針的值賦值給PSP,用于后面的現場保存 */msr psp, r0 /* Restore the task stack pointer. */isb//R0清0mov r0, # 0//使能所有中斷msr basepri, r0//R14與0xd進行或運算,表示退出中斷后,進入線程模式,并使用PSPorr r14, # 0xd//跳轉到PC所指向地址的函數中bx r14

?

?

R14:鏈接寄存器,在中斷中記錄了異常返回值 EXC_RETURN

????????當從 SVC 中斷服務退出前,通過向 r14 寄存器最后 4 位按位或上 0x0D,使得硬件在退出時使用進程堆棧指針 PSP 完成出棧操作并返回后進入任務模式、返 回 Thumb 狀態。在 SVC 中斷服務里面,使用的是 MSP 堆棧指針,是處在 ARM 狀態。

????????當 r14 為 0xFFFFFFFX,執行是中斷返回指令,cortext-m3 的做法,X 的 bit0 為 1 表示 返回 thumb 狀態,bit1 和 bit2 分別表示返回后 sp 用 msp 還是 psp、以及返回到特權模式還 是用戶模式

????????異常返回,這個時候出棧使用的是 PSP 指針,自動將棧中的剩下 內容加載到 CPU 寄存器: xPSR,PC(任務入口地址),R14,R12,R3,R2,R1,R0 (任務的形參)同時 PSP 的值也將更新,即指向任務棧的棧頂

?

注意:SVC中斷只在啟動第一次任務時會調用一次,以后均不調用 ?

三、任務切換

本質:CPU寄存器值的切換

?假設當由任務A切換到任務B時,主要分為兩步:

????????第一步:需暫停任務A的執行,并將此時任務A的寄存器保存到任務堆棧,這個過程叫做保存現場

????????第二步:將任務B的各個寄存器值(被存于任務堆棧中)恢復到CPU寄存器中,這個過程叫做恢復現場

對任務A保存現場,對任務B恢復現場,這個整體的過程稱之為:上下文切換

注意:任務切換的過程在PendSV中斷服務函數里邊完成?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38164.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 安裝、配置Tomcat 的HTTPS

Linux 安裝 、配置Tomcat的HTTPS 安裝Tomcat 這里選擇的是 tomcat 10.X ,需要Java 11及更高版本 下載頁 ->Binary Distributions ->Core->選擇 tar.gz包 下載、上傳到內網服務器 /opt 目錄tar -xzf 解壓將解壓的根目錄改名為 tomat-10 并移動到 /opt 下, 形成個人…

測評推薦:企業管理u盤的軟件有哪些?

U盤作為一種便攜的存儲設備,方便易用,被廣泛應用于企業辦公、個人學習及日常工作中。然而,U盤的使用也帶來了數據泄露、病毒傳播等安全隱患。為了解決這些問題,企業管理U盤的軟件應運而生。 本文將對市面上流行的幾款U盤管理軟件…

Hadoop3:Yarn容量調度器配置多隊列案例

一、情景描述 需求1: default隊列占總內存的40%,最大資源容量占總資源60%,hive隊列占總內存的60%,最大資源容量占總資源80%。 二、多隊列優點 (1)因為擔心員工不小心,寫遞歸死循環代碼&#…

數據處理:四選一、四關聯

今天去面試,面試官們給我一個‘選擇’,有四個選項:‘展示你的才華’、‘展示你的美貌’、‘展示你的才華與美貌’、‘都不展示’ {label: “選擇”,children: [{label: “展示你的才華”,children: [],isShow: talentModal,click: () > {i…

電路筆記(電源模塊): 基于FT2232HL實現的jtag下載器硬件+jtag的通信引腳說明

JTAG接口說明 JTAG 接口根據需求可以選擇20針或14針的配置,具體選擇取決于應用場景和需要連接的功能。比如之前的可編程邏輯器件XC9572XL使用JTAG引腳(TCK、TDI、TDO、TMS、VREF、GND)用于與器件進行調試和編程通信。更詳細的內容可以閱讀11…

51單片機STC8H8K64U通過RA8889/RA8876如何控制彩屏(SPI源碼下載)

【硬件部份】 一、硬件連接實物: STC8H系列單片機不需要外部晶振和外部復位,在相同的工作頻率下,速度比傳統的8051單片機要快12倍,具有高可靠抗干擾的優秀特性,與瑞佑的RA8889/RA8876控制芯片剛好可以完美搭配用于工…

redis實戰-緩存雪崩問題及解決方案

定義理解 緩存雪崩是指在同一時間段,大量緩存的key同時失效,或者Redis服務宕機,導致大量請求到達數據庫,帶來巨大壓力 和緩存擊穿的區別: 緩存雪崩是由于緩存中的大量數據同時失效或緩存服務器故障引起的&#xff1b…

(漏洞檢查項) | 服務端請求偽造 SSRF

(漏洞檢查項)|服務端請求偽造 SSRF 漏洞場景 服務端請求偽造(SSRF,Server-Side Request Forgery)漏洞發生在應用程序允許攻擊者通過構造惡意請求,利用服務器端發起HTTP請求,并訪問內部資源或進行其他未授權操作。 漏…

css_20_定位

相對定位 設置相對定位 給元素設置 position: relative 即可實現相對定位。 可以使用 left、right、top 、 bottom 四個屬性調整位置。 相對定位的參考點是相對自己原來的位置相對定位的特點: 1.不會脫離文檔流,元素位置的變化,只…

機器學習周記(第四十五周:Graphformer)2024.6.24~2024.6.30

目錄 摘要ABSTRACT1 論文信息1.1 論文標題1.2 論文摘要1.3 論文引言1.4 論文貢獻 2 論文模型2.1 問題定義2.2 模型架構2.2.1 自注意下采樣模塊(Self-attention down-sampling module)2.2.2 稀疏圖自注意力機制(Sparse graph self-attention m…

python自動移除excel文件密碼(小工具)

安裝 msoffcrypto-tool 使用pip命令安裝: 打開命令行工具(如終端、命令提示符或Powershell),然后輸入以下命令來安裝msoffcrypto-tool: pip install msoffcrypto-tool庫,進行自動移除excel文件密碼 import msoffcrypt…

【C++】using namespace std 到底什么意思

📢博客主頁:https://blog.csdn.net/2301_779549673 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! 📢本文作為 JohnKi 的學習筆記,引用了部分大佬的案例 📢未來很長&a…

新手練習項目 7:猜數字游戲

名人說:莫聽穿林打葉聲,何妨吟嘯且徐行。—— 蘇軾《定風波莫聽穿林打葉聲》 Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder) 目錄 一、項目描述二、項目實現三、項目步驟四、項目擴展方向 更多項目內容,請關注我、訂…

comsol學習筆記

comsol巖土力學與流固耦合的學習 comsol的相關視頻教程 https://www.bilibili.com/video/BV1Cu4y1r7Gn/?spm_id_from333.337.search-card.all.click&vd_source02b2bad477a153eaeb9c48cbbedaf8df [這里面有講解地應力平衡技術] https://www.bilibili.com/video/BV17C4y1j…

打靶記錄——靶機medium_socnet

靶機下載地址 https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 打靶過程 由于靶機和我的Kali都處于同一個網段,所以使用arpscan二次發現技術來識別目標主機的IP地址 arpscan -l除了192.168.174.133,其他IP都是我VMware虛擬機正…

【Spring Boot】認識 JPA 的接口

認識 JPA 的接口 1.JPA 接口 JpaRepository2.分頁排序接口 PagingAndSortingRepository3.數據操作接口 CrudRepository4.分頁接口 Pageable 和 Page5.排序類 Sort JPA 提供了操作數據庫的接口。在開發過程中繼承和使用這些接口,可簡化現有的持久化開發工作。可以使 …

springboot學習,如何用redission實現分布式鎖

目錄 一、springboot框架介紹二、redission是什么三、什么是分布式鎖四、如何用redission實現分布式鎖 一、springboot框架介紹 Spring Boot是一個開源的Java框架,由Pivotal團隊(現為VMware的一部分)于2013年推出。它旨在簡化Spring應用程序…

大數據面試題之Spark(1)

目錄 Spark的任務執行流程 Spark的運行流程 Spark的作業運行流程是怎么樣的? Spark的特點 Spark源碼中的任務調度 Spark作業調度 Spark的架構 Spark的使用場景 Spark on standalone模型、YARN架構模型(畫架構圖) Spark的yarn-cluster涉及的參數有哪些? Spark提交jo…

橫穿自動駕駛

如果有一條線,可以穿起來所有自動駕駛的核心模塊,那么我感覺它就是最優化,選擇優化變量、構造優化問題、求解優化問題,這幾個步驟貫穿了自動駕駛的始終。 先從我的自身接觸順序寫起。最開始做個一點深度學習,那還是20…

編碼大模型系列:Meta創新的“代碼編譯優化”的LLM

魯班號導讀正式上線。移步“魯班秘笈”,查閱更多內容。 大型語言模型 (LLM) 已在各種軟件工程和編碼任務中展現出卓越的能力。然而,它們在代碼和編譯器優化領域的應用仍未得到充分探索。訓練LLM需要大量資源,需要大量的 GPU時間和大量的數據…