FreeRTOS【3】任務調度算法

重要概念

在運行的任務,被稱為"正在使用處理器",它處于運行狀態。在單處理系統中,任何時間里只能有一個任務處于運行狀態。
非運行狀態的任務,它處于這 3 中狀態之一:阻塞(Blocked)、暫停(Suspended)、就緒(Ready)。
就緒態的任務,可以被調度器挑選出來切換為運行狀態,調度器永遠都是挑選最高優先級的就緒態任務并讓它進入運行狀態。
阻塞狀態的任務,它在等待"事件",當事件發生時任務就會進入就緒狀態。
事件分為兩類:時間相關的事件、同步事件。
所謂時間相關的事件,就是設置超時時間:在指定時間內阻塞,時間到了就進入就緒狀態。使用時間相關的事件,可以實現周期性的功能、可以實現超時功能。
同步事件就是:某個任務在等待某些信息,別的任務或者中斷服務程序會給它發送信息。怎么"發送信息"?方法很多,有:任務通知(task notification)、隊列(queue)、事件組(event group)、信號量(semaphoe)、互斥量(mutex)等。這些方法用來發送同步信息,比如表示某個外設得到了數據。

配置調度算法

所謂調度算法,就是怎么確定哪個就緒態的任務可以切換為運行狀態。
通 過 配 置 文 件 FreeRTOSConfig.h 的 兩 個 配 置 項 來 配 置 調 度 算 法 :

  • configUSE_PREEMPTION、
  • configUSE_TIME_SLICING。
  • configUSE_TICKLESS_IDLE,它是一個高級選項,用于關閉 Tick中斷來實現省電,后續單獨講解。 現在configUSE_TICKLESS_IDLE 設為 0,先不使用這個功能。
    調度算法的行為主要體現在兩方面:高優先級的任務先運行、同優先級的就緒態任務如何被選中。調度算法要確保同優先級的就緒態任務,能"輪流"運行,策略是"輪轉調度"(Round Robin Scheduling)。輪轉調度并不保證任務的運行時間是公平分配的,我們還可以細化時間的分配方法。

從 3 個角度統一理解多種調度算法:

  1. 可否搶占?高優先級的任務能否優先執行(配置項: configUSE_PREEMPTION)
    • 可以:被稱作"可搶占調度"(Pre-emptive),高優先級的就緒任務馬上執行,下面再細化。
    • 不可以:不能搶就只能協商了,被稱作"合作調度模式"(Co-operativeScheduling) ,這種模式下:當前任務執行時,更高優先級的任務就緒了也不能馬上運行,只能等待當前任務主動讓出 CPU 資源。 其他同優先級的任務也只能等待(更高優先級的任務都不能搶占,平級的更應該老實點)。
  2. 可搶占的前提下,同優先級的任務是否輪流執行(配置configUSE_TIME_SLICING)
    • 輪流執行:被稱為"時間片輪轉"(Time Slicing),同優先級的任務輪流執行,你執行一個時間片、我再執行一個時間片
    • 不輪流執行:英文為"without Time Slicing",當前任務會一直執行,直到主動放棄、或者被高優先級任務搶占。(如果任務1一直執行直到高任務搶占,高任務放棄執行時候,就會執行任務1同級別的其他任務了)
  3. 在"可搶占"+"時間片輪轉"的前提下,進一步細化:空閑任務是否讓步于用戶任務(配置項: configIDLE_SHOULD_YIELD)
    • 空閑任務低人一等,每執行一次循環,就看看是否主動讓位給用戶任務
    • 空閑任務跟用戶任務一樣,大家輪流執行,沒有誰更特殊。

以下是整理后的 Markdown 表格格式:

配置項A (常用)B (很少用)C (很少用)D (很少用)E (幾乎不用)
模式可搶占+時間片輪轉+空閑任務讓步可搶占+時間片輪轉+空閑任務不讓步可搶占+非時間片輪轉+空閑任務讓步可搶占+非時間片輪轉+空閑任務不讓步合作調度
configUSE_PREEMPTION11110
configUSE_TIME_SLICING1100x
configIDLE_SHOULD_YIELD1010x

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

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

相關文章

SLAM常用地圖對比示例

序號地圖類型概述1格柵地圖將現實環境柵格化,每一個柵格用 0 和 1 分別表示空閑和占據狀態,初始化為未知狀態 0.52特征地圖以點、線、面等幾何特征來描繪周圍環境,將采集的信息進行篩選和提取得到關鍵幾何特征3拓撲地圖將重要部分抽象為地圖&…

【Vue】TypeScript與Vue3集成

個人主頁:Guiat 歸屬專欄:Vue 文章目錄 1. 前言2. 環境準備與基礎搭建2.1. 安裝 Node.js 與 npm/yarn/pnpm2.2. 創建 Vue3 TypeScript 項目2.2.1. 使用 Vue CLI2.2.2. 使用 Vite(推薦)2.2.3. 目錄結構簡述 3. Vue3 TS 基礎語法整…

高防IP是什么

"高防IP"是指"高防護IP",是一種防御DDoS(分布式拒絕服務攻擊)的網絡安全服務。在分布式拒絕服務攻擊中,攻擊者會利用許多不同的計算機或者其他設備,通過向目標發送大量的網絡請求來嘗試使目標服務…

手機訪問電腦端Nginx服務器配置方式

修改當前站點Nginx的配置如下。其中端口號必須是一個比較獨特的端口號,比如8001。這樣可以跟別的項目區分開來。域名使用0.0.0.0。 server {listen 80;listen 8001;server_name zfmap.cc 0.0.0.0;假設你電腦端的ip地址是192.168.1.101,那么你的手機與你的電腦連在同…

【算法】計數排序、桶排序、基數排序

算法系列八:非比較排序 一、計數排序 1.實現 1.1步驟 1.2代碼 2.性質 2.1穩定性 2.1.1從前往后前始版: 2.1.2從后往前末始版: 2.2復雜度 2.2.1時間復雜度 2.2.2空間復雜度 二、桶排序 1.實現 1.1步驟 1.2代碼 2.穩定性 三、…

JDK版本與Spring Boot版本之間對應關系

JDK(Java Development Kit)版本與Spring Boot版本之間存在一定的對應關系,選擇合適的搭配對項目的穩定性、性能及功能實現至關重要,以下是詳細介紹: 主要版本對應關系 Spring Boot版本發布日期支持的JDK版本備注3.2.…

如何檢測Python項目哪些依賴庫沒有使用

要檢測Python項目中哪些依賴庫未被使用,可以采用以下方法: 1. 使用靜態分析工具 vulture:靜態分析工具,檢測未使用的代碼和導入 pip install vulture vulture your_project/pyflakes:檢查未使用的導入語句 pip ins…

【智能指針】—— 我與C++的不解之緣(三十三)

一、智能指針的使用 還記得,在異常學習的時候,我們分析出了一個問題 double Divide(int x, int y) {if (y 0){throw string("the y is zero");}return (double)x / double(y); } void test(int x, int y) {int* arr new int[10];Divide(x,…

Hadoop+Spark 筆記 2025/4/21

讀書筆記 定義 1. 大數據(Big Data) - 指傳統數據處理工具難以處理的海量、高速、多樣的數據集合,通常具備3V特性(Volume體量大、Velocity速度快、Variety多樣性)。擴展后還包括Veracity(真實性&#x…

femap許可不足如何解決

在復雜的工程仿真領域,Femap以其強大的功能和廣泛的應用場景而備受青睞。然而,隨著用戶需求的增長和項目規模的擴大,Femap許可不足的問題逐漸凸顯,成為了許多工程師和團隊面臨的挑戰。本文將為您詳細解析Femap許可不足的原因&…

【Microsoft Store 中的軟件推薦】

目錄: 😀 TranslucentTB😀 Snipaste😀 Watt Toolkit😀 NVIDIA Control Panel😀 Typedown 微軟應用商店中的軟件會直接安裝在C盤,所以,下面分享的這些是即超級好用,又占用…

AOSP Android14 Launcher3——RecentsView最近任務數據加載

最近任務是Launcher中的一個重要的功能,顯示用戶最近使用的應用,并可以快速切換到其中的應用;用戶可以通過底部上滑停頓進入最近任務,也可以在第三方應用底部上滑進最近任務。 這兩種場景之前的博客也介紹過,本文就不…

Flink介紹——實時計算核心論文之Flink論文

引入 通過前面的文章,我們梳理了大數據流計算的核心發展脈絡: S4論文詳解S4論文總結Storm論文詳解Storm論文總結Kafka論文詳解Kafka論文總結MillWheel論文詳解MillWheel論文總結Dataflow論文詳解Dataflow論文總結 而我們專欄的主角Flink正是站在前人的…

極狐GitLab CEO 柳鋼受邀出席 2025 全球機器學習技術大會

極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有: 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 2025 年 4 月 18 日至 19 日,2025 全球機器學習技術大會(ML-Summit 2025)在上海隆重舉行。…

Linux Sed 深度解析:從日志清洗到 K8s 等12個高頻場景

看圖猜詩,你有任何想法都可以在評論區留言哦~ 摘要:Sed(Stream Editor)作為 Linux 三劍客之一,憑借其流式處理與正則表達式能力,成為運維場景中文本批處理的核心工具。本文聚焦生產環境高頻需求&#xff…

C++ STL 容器簡介(藍橋杯適用精簡版)

C的萬能頭文件是&#xff1a; #include <bits/stdc.h> 一、常用 STL 容器 1.vector&#xff08;動態數組&#xff09; #include<iostream> #include<string> #include <vector> #include <algorithm> // 包含排序所需的頭文件 using namespa…

Java語言的進化:JDK的未來版本

作為一名Java開發者&#xff0c;我們正處在一個令人興奮的時代&#xff01;Java語言正在以前所未有的速度進化&#xff0c;每個新版本都帶來令人驚喜的特性。讓我們一起探索JDK未來版本的發展方向&#xff0c;看看Java將如何繼續領跑編程語言界&#xff01;&#x1f4aa; &…

不要使用Round函數保留小數位了

不要使用Round函數保留小數位了 如果你表格不需要保留公式&#xff0c;那么就不要使用Round函數保留小數位了。用Excel工作圈插件&#xff0c;可以輕松以數值形式保留小數位&#xff0c;且支持合并單元格、不連貫區域快速處理。 如下圖&#xff0c;有文本&#xff0c;有跨行合并…

【C++】入門基礎【下】

目錄 一、缺省參數二、函數重載1. 函數類型不同2. 參數個數不同3、函數類型順序不同 三、引用1、引用的概念和定義2、引用的功能2.1 功能1&#xff1a; 做函數形參&#xff0c;修改形參影響實參2.2 功能2&#xff1a; 做函數形參&#xff0c;減少拷貝&#xff0c;提高效率2.3 功…

git比較不同分支的不同提交文件差異

背景&#xff1a;只想比較某2個分支的某2次提交的差異&#xff0c;不需要帶上父提交。 以commitA為基準&#xff0c;用commitB去比較差異 直接上代碼&#xff1a; commitAxxxx1 commitBxxxx2 outputFile"output.txt"# 獲取與第一個父提交的文件列表 filesA$(git di…