單片機-FreeRTOS(ing)

目錄

一、基礎介紹

1.1 調度策略

1.1.1 調度方式

1.1.2 調度器

1.2 任務以及優先級

1.2.1 任務與協程

1.2.2 任務狀態

1.2.3 任務優先級

1.2.4 任務優先級分配方案

1.3 任務間通信 - 信號量

1.3.1 信號量

1.3.2 任務間計數信號量的實現

1.3.3 中斷方式計數信號量的實現

1.3.4 計數信號量API函數

1.4 任務間通信 - 消息隊列

1.4.1 消息隊列

1.4.2 任務間消息隊列的實現

1.4.3 中斷方式消息隊列的實現

1.4.4 消息隊列常用API

1.5 任務間通信 - 互斥信號量

1.5.1 互斥信號量概念

1.5.2 優先級翻轉

1.5.3 互斥信號量的實現

1.5.4 常用互斥鎖API


一、基礎介紹

1.1 調度策略

1.1.1 調度方式

搶占式調度、時間片調度、合作式調度;

其中以搶占式、時間片為主,少見合作式;

(1).搶占式調度:任務有優先級,程序被高優先級先搶占,或者遇到阻塞式API函數;

(2).時間片調度:每個任務優先級相同,任務運行固定的時間片;

1.1.2 調度器

調度器會使用相關的調度算法,來決定當前應該做哪個任務;
調度器的共同特性:
(1).可以區分就緒態、掛起態任務;
(2).可以激活就緒態任務,讓它變成正在運行的運行態任務;
(3).不同調度器之間最大區別是如何分配就緒態任務間的完成時間;
操作系統核心是調度器和任務的切換;


1.搶占式調度器:
需要實現搶占式調度器,可以先在FreeRTOS配置文件FreeRTOSConfig.h中禁止使用時間片調度,這時候每個任務都需要配置不同優先級;
優先級值越大,優先等級越高;
比如,現在有任務Task1,Task2,Task3,他們的優先級分別是1,2,3;
此時會先運行Task3,直到它遇到系統阻塞式的API函數(比如延遲、標志位等),這時候Task3被掛起,到了Task2運行,以此類推;

2.時間片調度器:
這個可以理解為,在同優先級的情況下。把時間拆分成時間片,比如現在有Task1,Task2,Task3,那么時間片先都為5個系統時鐘,Task1運行5個系統時鐘然后到Task2,Task2也運行5個,到Task3。

不管你干完了沒有,你的時間片用完了,就該到下一個任務運行。并且在這過程中,發生了阻塞,那么這個時間片過完了,也到下一個任務,并不會因為阻塞而等待;

1.2 任務以及優先級

1.2.1 任務與協程

!目前FreeRTOS 的協程功能在較新的版本中已被標記為 “過時”(deprecated),官方推薦使用輕量級任務(Lightweight Tasks)?或軟件定時器替代。

協程與標準任務的區別:

  • 調度方式:任務是搶占式的(優先級決定執行權),協程是協作式的(需主動讓出 CPU)。
  • 資源占用:協程棧開銷小,適合內存緊張的系統;任務需要獨立棧空間,內存消耗更大。
  • 實時性:任務適合強實時需求,協程適合對響應時間要求不高的場景。

適用場景:

  • 周期性執行但實時性要求不高的任務(如狀態監測、日志打印)。
  • 內存受限的小型嵌入式系統。
  • 簡化復雜狀態機的實現(避免使用大量全局變量保存狀態)。

1.2.2 任務狀態

運行:正在執行,正在占用處理器;
就緒:任務準備執行,但是因為目前有更高優先級的任務在執行。這個不同于阻塞和掛起;
阻塞:任務在等待某個觸發條件,一般進入阻塞態有個超時周期,超時后解除阻塞;
掛起:任務被強制暫停,不會參與調度,且無法被任何事件(包括超時)喚醒。

1.2.3 任務優先級

FreeRTOS最高優先級是通過 FreeRTOSConfig.h文件中的 configMAX_PRIORITIES進行配置的,實際可以用的優先級范圍是 [0,configMax_PRIORITIES-1];
比如configMAX_PRIORITIES=5,那么優先級可以填 0,1,2,3,4;

優先級0表示的是空閑任務,一般建議configMAX_PRIORITIES<32;

1.2.4 任務優先級分配方案

IRQ任務:通過中斷服務程序進行觸發的任務,這種任務優先級最高;
高優先級后臺任務:如按鍵檢測、觸摸檢測、USB消息處理、串口消息處理;
低優先級:比如LED數碼管顯示,不需要實時性很強的任務;


這里記得把IRQ任務、高優先級任務設置成阻塞式,這樣才能釋放CPU使用權,讓低優先級任務有機會執行;

1.3 任務間通信 - 信號量

1.3.1 信號量

信號量最初是為了共享資源建立一個標志,該標志表示占用情況;
像是停車場剩余車位,比如剛開始初始值設置為50個空閑位置。有車進來就-1,假如減到0了,也就是沒車位了,那么需要停車場內有車出去,新來的車才能停進來,要不就等著;


功能:

(1).任務之間? 或者? 中斷函數與任務之間? 的同步;
(2).多個共享資源的管理;

1.3.2 任務間計數信號量的實現

任務間信號量,是指各個任務間使用信號量實現任務同步 或者 資源共享功能;
?

其實很好理解,有點像我們平時寫代碼時的標志位;
目前有兩個任務 Task1、Task2,計數信號量可用資源為1;

任務Task1運行時,用xSemaphoreTake獲取信號量資源,假如資源沒被占用,那么Task1直接獲取資源,或者Task2占用了信號量,那么Task1轉到阻塞態,等待資源可用。Task1在獲取資源,并且使用后,通過xSemaphoreGive釋放資源;
在運行Task2時,也是按上面的邏輯;

1.3.3 中斷方式計數信號量的實現

FreeRTOS中斷方式信號量的實現,是指中斷函數 與 FreeRTOS任務之間使用信號量;

目前假設有一個任務Task1,和一個串口接受中斷;
信號量初始值為0,串口中斷調用xSemaphoreGiveFromISR 釋放信號量,Task1調用xSemaphoreTake獲取信號量資源;

運行流程:
(1).Task1 調用xSemaphoreTake獲取信號量,但是初始值是0,沒資源可以用,進入阻塞態;
(2).串口接受中斷接受到新數據,在中斷服務函數中調用xSemaphoreGiveFromISR釋放信號量資源,信號量數值+1,Task1從阻塞態到就緒態,獲取信號量后,信號量計數值-1,變成0;
(3).再次循環時,Task1調用xSemaphoreTake沒資源可用,再進入阻塞,再等串口接受新數據;

注意事項:
(1).中斷函數執行時間要短,防止其他低于中斷優先級的異常沒及時響應;
(2).不要在中斷中實現消息處理,應該在中斷服務函數中發送消息通知,然后在任務中進行消息處理。并且要注意這個任務優先級,使退出中斷服務函數后,任務可以及時執行;
(3).中斷服務程序中一定要調用專用于中斷的信號量設置函數,即以FromISR結尾的函數;

1.3.4 計數信號量API函數

單片機 - FreeRTOS 常用的API(未完)-CSDN博客

1.4 任務間通信 - 消息隊列

1.4.1 消息隊列

  • 指通過RTOS內核提供的服務,任務或者中斷子程序可用把一個消息(FreeRTOS中傳遞的是實際數據)放入到隊列,同時任務或者中斷子程序 可用從中獲取;
    ?
  • 支持 FIFO 和 LIFO 的數據存取方式;

1.4.2 任務間消息隊列的實現

假設消息隊列可以放10個消息;
創建了Task1 和 Task2 兩個任務,Task1放數據,Task2取數據;
采用FIFO方式;

假如Task1放數據的速度,比Task2取數據的速度快,消息會放滿,FreeRTOS的消息存放函數xQueueSend支持超時等待;
同樣的,取的速度大于存的速度,消息獲取函數xQueueReceive支持超時等待;

1.4.3 中斷方式消息隊列的實現

假設消息隊列可以放10個消息;
創建任務Task1,和串口接收中斷;
采用FIFO;

串口中斷接受到消息后進行中斷,往隊列里放數據。Task1從隊列里取數據,

(1).串口中斷放數據速度 超過 Task1取數據的速度,則會造成存放過滿,但是中斷服務程序的消息隊列發送函數 xQueueSendFromISR 不支持超時設置,所以發送前要用 xQueueIsQueueFullFromISR 檢測消息隊列是否滿了;

(2).假如是取數據的速度? 超過? 放數據的速度。這時候消息隊列是空的,Task1沒東西取,而且Task1 獲取消息的函數是 xQueueReceive ,這個函數可以設置超時等待,沒消息Task1就等著,直到隊列中有消息,或者是超過我們設定的時間;

1.4.4 消息隊列常用API

單片機 - FreeRTOS 常用的API(ing)-CSDN博客

1.5 任務間通信 - 互斥信號量

1.5.1 互斥信號量概念

主要作用是對資源實現互斥訪問,類似二值信號。互斥信號與二值信號的區別是 互斥信號可以防止優先級翻轉;

1.5.2 優先級翻轉

假設目前有3個任務 Task1,Task2,Task3,優先級分別是3,2,1,Task1優先級最高;

任務Task1 和 Task3互斥訪問串口打印 printf,采用二值信號實現互斥訪問;
Task3通過二值信號調用printf,被Task1搶占了,開始做Task1;

運行過程:
(1).Task1在運行時需要printf,這時候Task3正在用printf,就會把Task1掛起,等Task3釋放printf;
(2).調度器的作用下,Task3運行過程中,Task2就緒,把Task3給搶了。優先級翻轉出現在這;
(3).Task3因為被Task2搶了任務,所以沒法及時釋放printf,這時候變成得等待Task2干完之后,才能釋放printf,然后才到Task1;
?

1.5.3 互斥信號量的實現

首先,我們引入互斥信號量這一步,是為了解決1.5.2 中的優先級翻轉問題;
?

互斥信號量的實現是這樣的:
比如Task1和Task2的優先級分別是1和3,首先先是Task1在執行,這時候Task2也需要占用這個資源。那么會先把Task1的優先級抬到3,也就是和Task2的優先級一樣,這時候就算有一個優先級是2的任務,也無法搶占Task1;

然后是Task2被掛起,Task1釋放資源,Task2等待資源,這里Task1釋放完資源,又會回到1的優先級;
?

1.5.4 常用互斥鎖API

單片機 - FreeRTOS 常用的API(ing)-CSDN博客

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

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

相關文章

為什么調用API總返回404,該如何調試

當調用一個應用程序接口&#xff08;API&#xff09;時&#xff0c;持續地收到“404 未找到”的錯誤&#xff0c;其核心原因在于客戶端發起的“請求”&#xff0c;未能成功地&#xff0c;匹配到服務器上任何一個“真實存在”的、可供訪問的“資源路徑”。這本質上&#xff0c;是…

醫療信息化自主可控轉型的實踐探索 —— 以常德二院為例

目錄 頭雁領航 - 激發醫療新質生產力 核心支撐 - 電科金倉奠定數據底座 生態共建 - 攜手護航醫療信創發展 信創產業發展是國家經濟數字化轉型、提升產業鏈發展的關鍵&#xff0c;是科技自立自強的核心基座&#xff0c;其本質是實現中國信息化產業的自主可控。醫療信創作為關…

Gin傳參和接收參數的方式

Gin查詢參數和接收參數的方式 常用 Gin 綁定方法對比方法用途特點c.Bind()自動識別 Content-Type最通用&#xff0c;根據請求頭自動選擇綁定方式c.ShouldBindJSON()只綁定 JSON強制使用 JSON 格式&#xff0c;類型明確c.ShouldBindXML()只綁定 XML強制使用 XML 格式c.ShouldBin…

MariaDB/MySQL 客戶端工具與服務端配置精要指南

文章目錄一、客戶端與服務端程序二、用戶賬號管理三、MySQL 客戶端命令3.1 命令類型?3.2 使用模式?3.3 常用選項?3.4 提示符定制?四、mysqladmin管理命令??五、服務端配置?5.1 配置文件???5.2 Socket 通信配置??六、最佳實踐總結免費個人運維知識庫&#xff0c;歡迎…

自動化項目日報生成工具測評與選型:如何匹配團隊日報管理需求

引言在項目管理場景中&#xff0c;手動撰寫日報常面臨多重效率瓶頸&#xff1a;任務數據分散在協作群、Excel 表格、項目看板等多個平臺&#xff0c;匯總時需反復核對&#xff1b;不同成員日報格式不統一&#xff0c;管理層整合分析耗時&#xff1b;任務進度與日報信息不同步&a…

基于SpringBoot+Vue的吳韻蘇香文旅小程序(協同過濾算法、Echarts圖形化分析、騰訊地圖API、二維碼識別)

&#x1f388;系統亮點&#xff1a;協同過濾算法、Echarts圖形化分析、騰訊地圖API、二維碼識別&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17小程序&a…

python numpy.random的基礎教程(附opencv 圖片轉數組、數組轉圖片)

目錄 1.在區間[a,b)隨機生成n個整數。 2.在區間[a,b)隨機生成n個數。 3.在區間[0,1)生成隨機數 4.打亂順序 5.從指定的列表中選擇 NumPy&#xff08;Numerical Python&#xff09;是一個開源的科學計算庫&#xff0c;專門用于高效處理多維數組&#xff08;ndarray&#xf…

Vue2.x核心技術與實戰(二)

目錄 三、Vue2.x:生命周期+工程化開發(組件入門) 3.1 生命周期 3.1.1 生命周期 & 生命周期四個階段 3.1.2 生命周期鉤子 Vue生命周期鉤子案例 - 新聞列表 & 輸入框自動聚焦 3.2 綜合案例:小黑記賬清單 3.3 工程化開發入門 3.3.1 工程化開發 & 腳手架Vue …

【鴻蒙心跡】7×24小時極限求生:當Origin_null遇上鴻蒙,我如何用100杯咖啡換一條跨域活路?

文章概要 大家好&#xff0c;我是那個把黑眼圈熬成華為工牌掛繩的倒霉蛋。過去100個夜晚&#xff0c;我在HarmonyOS NEXT的ArkWeb里被Origin:null反復按在地上摩擦——小程序白屏、OPTIONS 400、官方文檔沉默三連擊。最終&#xff0c;我用C、libcurl、OpenSSL和一堆速溶咖啡&am…

【git】刪除一條本地提交的歷史commit

在工程中&#xff0c;如果想要刪除一條本地提交的歷史commit&#xff0c;可以通過droprebase -i HEAD^n的方式。1.情景提交了三條commit&#xff0c;想刪掉第二條commit。git logcommit_id_*******1 commit_id_*******2 commit_id_*******32.解決git rebase -i HEAD~2輸出&…

軟件測試中,JMeter 的作用以及優缺點是什么?

回答重點JMeter 是一款開源的軟件測試工具&#xff0c;主要用來對各種軟件或服務進行性能測試和負載測試。它可以模擬大量用戶同時對服務器、網絡或其他資源發起請求&#xff0c;從而測試它們的響應時間、吞吐量等性能指標。優點&#xff1a;1&#xff09; 開源且免費 &#xf…

STM32存儲結構

我們在使用Keil編譯程序成功后會,有一行各部分占用內存的提示信息,如下Program Size:Code7492 RO-data556 Rw-data72 ZI-data11688,這是stm32代碼編譯后的提示我們分析一下這個編譯輸出&#xff1a;- Code: 7492字節 -> 代碼部分&#xff08;存放在Flash&#xff09;- RO-da…

手機 瀏覽器調用攝像頭掃描二維碼Quagga

注&#xff1a;需用谷歌瀏覽器才能調用權限1. 引入依賴&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】偽列之Version Query:全鏈路追蹤行數據變更的所有記錄(不僅僅是被修改的最后時間)(第二篇,總共六篇)

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

代理模式深度解析:從靜態代理到 Spring AOP 實現

代理模式是軟件開發中一種經典的設計模式&#xff0c;它通過引入 "代理對象" 間接訪問目標對象&#xff0c;從而在不修改目標對象代碼的前提下&#xff0c;實現功能增強&#xff08;如日志記錄、事務管理&#xff09;、權限控制等橫切需求。從簡單的靜態代理到靈活的…

算法 ----- 鏈式

目錄 一 、鏈式 二 、題目 1、兩兩相加 &#xff08;1&#xff09;題目 (3) 代碼書寫 2、兩兩交換鏈表中的節點 &#xff08;1&#xff09;題目 &#xff08;2&#xff09; 解題思路 &#xff08;3&#xff09;代碼書寫 3、重排鏈表 &#xff08;1&#xff09;題目 …

運維監控prometheus+grafana

目錄 一、環境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、驗證、使用 一、環境 系統使用CentOS7虛擬機。 監控三臺服務器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …

數字孿生 :提高制造生產力的智能方法

近年來&#xff0c;在先進數字技術深度整合的推動下&#xff0c;制造業經歷了深刻變革。數字孿生技術作為其中最具前景的創新之一&#xff0c;正重塑工廠和生產流程的設計、監控和優化方式。該技術的核心在于為物理資產、系統或流程創建虛擬映射。這種虛擬映射實時同步現實世界…

【論文閱讀】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》

Sign-OPT: 一種查詢高效的硬標簽對抗攻擊 原文鏈接&#xff1a;https://arxiv.org/pdf/1909.10773 摘要 我們研究在訪問受限情況下評估機器學習系統對抗魯棒性的最實用問題設置&#xff1a;用于生成對抗樣本的硬標簽黑盒攻擊設置&#xff0c;其中允許有限的模型查詢&#xff…

安卓11 12系統修改定制化_____如何去掉 搜狗輸入法 首次運行時權限授權彈窗 其他應用可借鑒

有些內置應用或者第三方應用在首次使用時會跳出權限允許彈窗。雖然這個是系統為了用戶安全設置的一道檢測機制。但無形之中會影響到定制類用戶的使用。那么能不能去除這個首次運行的權限彈窗呢。其實也有多方法可參閱解決。 通過博文了解?????? 1??????-----首次…