RTOS系統 -- FreeRTOS之任務調度

FreeRTOS中的任務調度

背景介紹

FreeRTOS是一種輕量級的實時操作系統,被廣泛應用于嵌入式系統中。它提供了多任務管理功能,包括任務創建、任務調度和任務切換。FreeRTOS的調度器根據任務的優先級和狀態自動調度任務,確保系統資源的有效利用和實時性。

在M4處理器上,FreeRTOS能夠實現任務間的自動調度。調度器采用基于優先級的搶占式調度算法,確保系統總是運行最高優先級且處于就緒狀態的任務。如果有多個任務具有相同的優先級,調度器會采用時間片輪轉的方法在這些任務之間切換。

主動調度

盡管FreeRTOS的調度器通常會自動管理任務的調度,但有時我們需要手動干預任務調度。這可以通過以下幾種方式實現:

1. 任務切換

通過調用任務切換函數,可以強制調度器立即進行任務切換。

taskYIELD();  // 手動觸發任務切換

2. 優先級調整

通過調整任務的優先級,可以影響調度器的行為,立即切換到新的最高優先級任務。

vTaskPrioritySet(xTaskHandle, uxNewPriority);  // 改變任務優先級

3. 任務通知

通過任務通知機制,可以實現任務之間的同步和通信,從而影響調度器的行為。

xTaskNotifyGive(xTaskHandle);  // 通知任務

4. 中斷服務例程(ISR)中的調度

在中斷服務例程中,可以通過設置上下文切換請求標志來強制任務調度。

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);  // 在ISR中觸發任務調度

示例代碼

以下是一些示例代碼,展示如何通過上述方法主動調度任務。

任務切換

void vTask1(void *pvParameters) {for(;;) {// 任務代碼taskYIELD();  // 主動觸發任務切換}
}void vTask2(void *pvParameters) {for(;;) {// 任務代碼}
}

優先級調整

void vTask1(void *pvParameters) {for(;;) {// 任務代碼vTaskPrioritySet(NULL, uxNewPriority);  // 改變自身優先級}
}void vTask2(void *pvParameters) {for(;;) {// 任務代碼}
}

任務通知

void vTask1(void *pvParameters) {for(;;) {// 等待通知ulTaskNotifyTake(pdTRUE, portMAX_DELAY);// 被通知后繼續執行}
}void vTask2(void *pvParameters) {for(;;) {// 任務代碼xTaskNotifyGive(xTask1Handle);  // 通知任務1}
}

中斷服務例程中的調度

void vISRHandler(void) {BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 處理中斷// ...// 觸發任務調度portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

優先級說明

在FreeRTOS中,優先級的值越大,優先級越高。FreeRTOS使用整數值來表示任務的優先級,值越大表示優先級越高。任務的優先級決定了調度器選擇哪個任務來運行。當有多個任務處于就緒狀態時,調度器會選擇優先級最高的任務來運行。

示例說明
例如,如果你創建了三個任務,并設置它們的優先級如下:

  • 任務A:優先級為1
  • 任務B:優先級為2
  • 任務C:優先級為3

在這種情況下,任務C的優先級最高,因此調度器會首先運行任務C。如果任務C阻塞或進入等待狀態,調度器會選擇下一個優先級最高的任務,即任務B來運行。

創建任務時設置優先級
在創建任務時,你可以通過uxPriority參數來設置任務的優先級。以下是一個示例代碼:

#include "FreeRTOS.h"
#include "task.h"void vTaskA(void *pvParameters) {for(;;) {// 任務A的代碼}
}void vTaskB(void *pvParameters) {for(;;) {// 任務B的代碼}
}void vTaskC(void *pvParameters) {for(;;) {// 任務C的代碼}
}int main(void) {// 創建任務A,優先級為1xTaskCreate(vTaskA, "Task A", 1000, NULL, 1, NULL);// 創建任務B,優先級為2xTaskCreate(vTaskB, "Task B", 1000, NULL, 2, NULL);// 創建任務C,優先級為3xTaskCreate(vTaskC, "Task C", 1000, NULL, 3, NULL);// 啟動調度器vTaskStartScheduler();// 由于調度器已經啟動,通常不會運行到這里for(;;);
}

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

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

相關文章

獨立站優勢及吸引力分析

隨著全球化貿易的不斷深入,越來越多的廠商開始尋求更廣闊的市場和更高效的銷售渠道。獨立站作為企業自有的電商網站,正逐漸成為海外貿易的新寵。本文將分析獨立站的優勢及其對廠商的吸引力,鼓勵廠商以建立獨立站的方式出海。 一、獨立站的定義…

el-image放大圖片功能

1.需求&#xff1a;點擊圖片后放大圖片 html代碼&#xff1a; <el-imagestyle"width: 100px; height: 100px":src"baseUrl item.id":zoom-rate"1.2":max-scale"7":min-scale"0.2":preview-src-list"srcList"…

Xilinx FPGA UltraScale SelectIO 接口邏輯資源

目錄 1. 簡介 2. Bank Overview 2.1 Diagram 2.2 IOB 2.3 Slice 2.4 Byte Group 2.5 I/O bank 示例 2.6 Pin Definition 2.7 數字控制阻抗(DCI) 2.8 SelectIO 管腳供電電壓 2.8.1 VCCO 2.8.2 VREF 2.8.3 VCCAUX 2.8.4 VCCAUX_IO 2.8.5 VCCINT_IO 3. 總結 1. 簡介…

Vue利用遞歸的方法,根據id獲取對應的字段名(樹形數據)

樹形數據源 options:[{ancestors: "0",code: "99",id: "99",name: "測試部門1",parentId: "0",children: [{ancestors: "0,99",code: "test",id: "1720269456426344449",name: "測試子部…

【國潮】軟件本土化探索

文章目錄 一、國產-操作系統銀河麒麟&#xff08;Kylin&#xff09;操作系統華為鴻蒙系統&#xff08;HarmonyOS&#xff09;統信UOS深度Deepin 二、國產-服務器華為鯤鵬&#xff1a;飛騰&#xff1a;海光&#xff1a;兆芯&#xff1a;龍芯&#xff1a;申威&#xff1a; 三、國…

Redis學習 - 基礎篇

Redis學習 - 基礎篇 一. 簡介 Redis 是一個高性能的key-value數據庫&#xff0c;常用的數據類型如下&#xff1a;string&#xff0c;list&#xff0c;set&#xff0c;zset&#xff0c;hash 二. 安裝 Widows和Linux下如何安裝Redis-CSDN博客 三. 常用命令 配置及數據庫操作…

《信息技術與信息化 》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

問題解答 問&#xff1a;《信息技術與信息化 》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。 問&#xff1a;《信息技術與信息化 》級別&#xff1f; 答&#xff1a;省級。主管單位&#xff1a;山東省科學技術協會 主辦單…

國內磁性器件核心企業『云路新能源』攜手企企通正式啟動SRM項目,供應鏈競爭力再上新臺階

近日&#xff0c;珠海黎明云路新能源科技有限公司&#xff08;以下簡稱“云路新能源”&#xff09;攜手企企通啟動SRM數字化采購供應鏈管理項目&#xff0c;雙方相關負責人與項目組成員出席本次啟動會。 本次采購數字化項目建設&#xff0c;企企通將助力云路新能源實現采購全場…

智能無人數字直播間 打造24小時的無人直播間源碼系統 帶網站的安裝代碼包以及搭建教程

系統概述 智能無人數字直播間系統是一種基于人工智能技術的軟件工具&#xff0c;它結合了高精度掃描建模、自動化控制、多模態生成等多項先進技術&#xff0c;能夠實現對真實人物的高度仿真&#xff0c;并自主執行各類直播任務。該系統不僅支持24小時不間斷直播&#xff0c;還…

微信小程序引入自定義子組件報錯,在 C:/Users/***/WeChatProjects/miniprogram-1/components/路徑下***

使用原生小程序開發時候&#xff0c;會報下面的錯誤&#xff0c; [ pages/button/button.json 文件內容錯誤] pages/button/button.json: [“usingComponents”][“second-component”]: “…/…/components/second-child/index”&#xff0c;在 C:/Users/***/WeChatProjects/m…

Windows 中修改 MySQL 密碼

沒想到這樣一個簡單的需求&#xff0c;愣是試了半天沒試到有用的命令&#xff0c;最后終于找到一個有用的&#xff0c;在此做個記錄&#xff1a; set password for rootlocalhost 你的新密碼;

【C++與python】| splice語法對比列表切片

splice用法詳解 C 中的 splice示例 1&#xff1a;將整個列表 lst2 插入到 lst1 中某個位置示例 2&#xff1a;將 lst2 的一個元素插入到 lst1 中某個位置 Python中的列表切片&#xff08;Slicing&#xff09;示例 1&#xff1a;獲取列表的子列表示例 2&#xff1a;修改列表的子…

禪道二次開發——禪道zentaoPHP框架擴展機制——對視圖層(view)擴展

視圖文件的擴展分為兩種方式&#xff0c;一種是完全覆蓋&#xff0c;第二種是通過鉤子機制來擴展。 一、完全覆蓋 視圖文件的覆蓋可以通過完全覆蓋的方式來重新定義。比如我對bug模塊的create頁面進行擴展。原來的視圖文件是存放在module/bug/view/create.html.php。如果需要…

Android約束布局的概念與屬性(2)

目錄 3&#xff0e;鏈式約束4&#xff0e;輔助線 3&#xff0e;鏈式約束 如果兩個或以上控件通過下圖的方式約束在一起&#xff0c;就可以認為是他們是一條鏈&#xff08;如圖5為橫向的鏈&#xff0c;縱向同理&#xff09;。 圖5 鏈示意圖 如圖5所示&#xff0c;在預覽圖中選…

解讀網絡安全公司F5:助企業高效簡化多云和應用部署

伴隨企業加速數字化轉型工作、擴展到新的基礎設施環境并采用微服務架構&#xff0c;企業正擁抱混合和多云基礎設施所帶來的靈活性。Ernst & Young調查數據顯示&#xff0c;84%的企業正處于向現有網絡安全解決方案套件添加多種新技術的早期階段。企業同樣意識到&#xff0c;…

nftables(3)表達式(1)數據類型

簡介 前面文章主要介紹的是nftables的基本原理和基礎的配置&#xff0c;如nftables基本的表、鏈、規則的創建和管理。本篇文章主要介紹的是表達式EXPRESSIONS。 在網絡安全和數據處理中&#xff0c;表達式&#xff08;Expressions&#xff09;扮演著非常重要的角色。它們用于…

二. Linux內核

一. Linux內核源碼目錄分析 arch 包含與體系結構相關的代碼&#xff0c;用于支持不同硬件體系結構的實現。這個目錄下會根據不同的架構&#xff08;如x86、arm、mips等&#xff09;進一步細分。 block 用于處理塊設備的子系統&#xff0c;包含與塊設備驅動和I/O調度相關的代碼。…

力扣--滑動窗口最大值

給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗口中的最大值 。 示例 1&#xff1a; 輸入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 輸…

Vue核心 — Vue2響應式原理和核心源碼解析(核心中的核心)

一、前置知識 1、Vue 核心概念 Vue 是什么? Vue 是一款用于構建用戶界面的 JavaScript 框架。它基于標準 HTML、CSS 和 JavaScript 構建&#xff0c;并提供了一套聲明式的、組件化的編程模型&#xff0c;幫助你高效地開發用戶界面。 Vue 核心特點是什么? 響應式數據綁定:…

docker安裝tomcat容器

docker安裝tomcat容器 1、拉取鏡像 docker pull tomcat:8.5.46-jdk8-openjdk2、運行 docker run -d --name tomcat tomcat:8.5.46-jdk8-openjdk ? docker cp tomcat:/usr/local/tomcat/conf /data/tomcat/ ? docker rm -f tomcat ? docker run -d --name tomcat -p 8…