FreeRTOS學習之路,以STM32F103C8T6為實驗MCU(2-3:任務切換)

學習之路主要為FreeRTOS操作系統在STM32F103(STM32F103C8T6)上的運用,采用的是標準庫編程的方式,使用的IDE為KEIL5。

注意!!!本學習之路可以通過購買STM32最小系統板以及部分配件的方式進行學習,也可以通過Proteus仿真的方式進行學習。

后續文章會同時發表在個人博客(jason1016.club)、CSDN;

視頻會發布在bilibili(UID:399951374)

RTOS 系統的核心是任務管理,而任務管理的核心是任務切換,任務切換決定了任務的執行順序,任務切換效率的高低也決定了一款系統的性能

一、什么時候執行任務切換(啥時候切換)

  1. 可以執行一個系統調用

執行系統調用就是執行 FreeRTOS 系統提供的相關 API 函數,比如任務切換函數 taskYIELD(),FreeRTOS 有些 API 函數也會調用函數 taskYIELD(),這些 API 函數都會導致任務切換,這些 API 函數和任務切換函數 taskYIELD()都統稱為系統調用。

  1. 系統滴答定時器(SysTick)中斷

FreeRTOS 中滴答定時器(SysTick)中斷服務函數中也會進行任務切換

例:vTaskDelay()

二、任務切換函數PendSV(怎么切換)

PendSV函數原理(優勢)

將 PendSV 設置為最低的異常優先級,可以讓 PendSV 異常處理在所有其他中斷處理完成后執行,這對于上下文切換非常有用,也是各種 OS 設計中的關鍵。

因此,用PendSV作為任務切換函數的話,就把任務切換事件放在系統執行的最底層了,避免了任務切換會打斷正在運行的中斷事件這個問題

PendSV 異常將上下文切換請求延遲到所有其他 IRQ 處理都已經完成后,此時需要將 PendSV 設置為最低優先級。若 OS 需要執行上下文切換,他會設置 PendSV 的掛起壯態,并在 PendSV 異常內執行上下文切換

PendSV使用時機和方法(該切換時怎么切換)

    1. 在接收到上述系統調用的時候,通過SVC(中斷控制和壯態寄存器 ICSR)? 掛起PendSV,最后在空閑狀態執行PendSV中執行任務切換操作
    2. 在接收到Systick中斷后,由SVC(Systick)掛起PendSV,最后在空閑狀態執行PendSV中執行任務切換操作

三、查找下一個要運行的任務(切換成什么?切換成某一優先級的任務列表

通用方法

任務添加時會根據優先級大小賦值給就緒任務列表數組( pxReadyTasksLists[]),一個優先級一個列表,同優先級的就緒任務都掛到相對應的列表中。uxTopReadyPriority 代表處于就緒態的最高優先級值,系統按就緒態的最高優先級的高到低遍歷,再依次執行對應的任務級列別,而針對同一優先級列表內的任務,則會按照次序依次執行。

硬件方法

硬件方法就是使用處理器自帶的硬件指令來實現,原理與上述方法相似,不同點在于:使用硬件方法的時候 uxTopReadyPriority 就不代表處于就緒態的最高優先級了,而是使用每個 bit 代表一個優先級,bit0 代表優先級 0,bit31 就代表優先級 31,當某個優先級有就緒任務的話就將其對應的 bit 置 1。

四、時間片調度(同一優先級任務列表的任務切換

這里提出一個問題,當有兩個一樣重要(優先級相等)的任務需要我們去執行的話,我們應該怎么處理?大家都知道即使移植了freertos的單片機同一時間也只能執行一個任務,當面對有個多個同等優先級的任務的情況,freertos給出的答案是時間片調度執行。

在 FreeRTOS 中允許一個任務運行一個時間片(一個時鐘節拍的長度)后讓出 CPU 的使用權,讓擁有同優先級的下一個任務運行,FreeRTOS 中的這種調度方法就是時間片調度

這樣的調度方式就好比我們平時看到的風扇葉面,一個頁面代表一個同等優先級的任務,當我們執行得慢的時候,我們還能分清具體是那個葉面,而等風扇快速轉動起來后我就分不清葉面的類型甚至頁面的個數了。單片機同樣如此當單片機以幾十幾百HZ運行,并且將時間片稀釋得非常少的時候,我們就分不清他具體在執行什么任務了,乃至于我們會出現“單片機這幾個任務是同時執行的錯覺”,這也是為什么風扇轉起來就像個圓的。這就是FreeRTOS處理多(同優先級)任務的方法。

本文為作者獨立編寫,本BLOG上所有的原創文章未經本人許可,不得用于商業用途及傳統媒體。網絡媒體轉載請注明出處,否則屬于侵權行為。?

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

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

相關文章

使用 css 實現文字單行居右, 換行居左展示

給外層盒子設置居右展示, 子盒子設置居左。 原理是,如果子盒子沒有換行,那么子盒子的長度就是內容的長度,它根本沒有空間將字體移動居左,父盒子的居左樣式就會生效,子盒子就會居左展示。 當子盒子里面的文字換行了&…

3.1 Linux時間子系統

目錄 一時間子系統作用二 時間子系統初始化三 時間子系統框架 一時間子系統作用 1 提供時間 2 提供時鐘 3 提供進程輪詢 從應用層,分析其使用方法 從驅動層,給出timer和hrtimer的使用示例 二 時間子系統初始化 分別從介紹各個模塊初始化做了些什么工作…

在SOLIDWORKS中如何提升保存PDF版本文件的清晰度

隨著Solidworks年復一年的不斷更新,不僅僅是整個軟件的性能上的提升,其在輸出文件的功能上也同樣在精益求精。 但對于老版本的使用者和希望能讓輸出文件清晰度更進一步的使用者而言,可能目前我們所能達到的普通文件輸出清晰度遠遠無法達到他們…

如何將ONLYOFFICE與Python應用程序集成

ONLYOFFICE是一項功能強大的開源文檔編輯器,可以將文本文檔、電子表格和演示文稿、電子表單編輯功能集成至任何編程語言編寫的 Web 應用程序中。最新的7.5版本編輯器可以支持編輯PDF文件(批注、繪圖等)。在本文中,我們會帶你了解如…

【分享】Java Builder 建造者模式之案例分享

介紹 建造者模式(Builder)核心目的是通過使用多個簡單對象一步步構建出一個復雜對象。通過將復雜對象的構造過程拆分為多個簡單的步驟,使得創建對象更加靈活,可讀性和可維護性更強。 使用場景 創建一個由多個部分組成的復雜對象…

這樣寫Allure生成測試報告,學會直接漲薪5k

Allure是一個開源的測試報告生成框架,提供了測試報告定制化功能,相較于我們之前使用過pytest-html插件生成的html格式的測試報告,通過Allure生成的報告更加規范、清晰、美觀。 pytest框架支持使用Allure生成測試報告,接下來讓介紹…

SpringBoot整合knife4j生成Api文檔

一、介紹 先看效果 ①:Swagger 介紹 Swagger 是一個規范和完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務(https://swagger.io/)。 它的主要作用是: 使得前后端分離開發更加方便,有利于團隊協作 接口的文檔…

Doris-集群部署(四)

創建目錄并拷貝編譯后的文件 1)創建目錄并拷貝編譯后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02)修改可打開文件數(每個節點&#x…

oracle數據庫巡檢常見腳本-系列三

簡介 作為數據庫管理員(DBA),定期進行數據庫的日常巡檢是非常重要的。以下是一些原因: 保證系統的穩定性:通過定期巡檢,DBA可以發現并及時解決可能導致系統不穩定的問題,如性能瓶頸、資源利用率…

TIDB基礎

TIDB整個邏輯架構跟MYSQL類似,如下: TIDB集群:相當于MYSQL的數據庫服務器,區別是MYSQL數據庫服務器為單進程的,TIDB集群為分布式多進程的。 數據庫:同MYSQL數據庫,數據庫屬于集群,…

VM CentOS7安裝ffmpeg

項目中涉及給視頻添加水印,使用到了ffmpeg,windows系統可直接使用,Linux需要手動編譯完成ffmpeg后才可正常使用。 配置yum源: 備份原repo文件 cd /etc/yum.repos.d/mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.r…

編寫自己的CA和TA與逆向

參考內容《手機安全和可信應用開發》 https://note.youdao.com/s/MTlG4c1w 介紹 TA的全稱是Trust Application, 即可信任應用程序。 CA的全稱是Client Applicant, 即客戶端應用程序。 TA運行在OP-TEE的用戶空間, CA運行在REE側。 CA執行時代…

前端 Ajax 技術有哪些優缺點?

Ajax(Asynchronous JavaScript and XML)是一種基于前端 JavaScript 技術的異步通信技術,可以在不刷新整個頁面的情況下向服務器發送請求和接收響應,以實現動態加載內容和交互效果。下面是 Ajax 技術的優缺點: 優點&am…

css實現三行,溢出顯示省略號(后有js實現邏輯)

css實現代碼: .text-container {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;text-overflow: ellipsis; }解釋: 1.-webkit-box 和 -webkit-box-orient 屬性將容器元素設置為一個垂直方向的彈性盒子&…

需求調研計劃及用戶需求調研單

1.目的 2.概述 3.需求調研計劃 3.1調研目的 3.2調研范圍 3.2.1.調研的職能范圍 3.2.2.調研的業務范圍 3.2.3.調研的地點范圍 3.3調研方式 3.4調研階段 3.5具體時間安排 軟件開發全文檔獲取:點我獲取 1、需求調研計劃 2、用戶需求調研單 項目名稱 客…

C++ auto的作用

auto的作用 保護變量的值不被修改,防止意外的錯誤操作;聲明函數參數為常量引用,以避免函數修改參數的值;聲明類的成員函數為常量成員函數,以確保函數不修改對象的狀態。 1 const關鍵字用于聲明一個常量,…

【EI會議投稿】第九屆電子技術和信息科學國際學術會議(ICETIS 2024)

第九屆電子技術和信息科學國際學術會議(ICETIS 2024) The 9th International Conference on Electronic Technology andInformation Science(ICETIS 2024) ICETIS會議始于2016年,先后吸引眾多來自國內外高等院校、科…

2023亞太杯數學建模競賽C題新能源電動汽車數據分析與代碼講解

C題論文包括摘要、問題重述、問題分析、模型假設、符號說明、模型的建立和求解(問題1模型的建立和求解、問題2模型的建立和求解、問題3模型的建立和求解、問題4模型的建立和求解、問題5模型的建立和求解)、模型的評價等等, 視頻講解如下&…

組件庫篇 | EUI | 按鈕

組件庫篇 | EUI | 按鈕 前言 從本章開始,我將會一一演示所有組件所有函數的調用代碼,以方便讀者掌握組件的具體用法。但這并不意味著在實際使用中要用到所有的函數,請讀者按需取用。 基本介紹 EUI提供了三種類型的按鈕,如下: 常規按鈕 Button文字按鈕 TextButton圖標按鈕…