FreeRTOS 任務管理學習筆記

FreeRTOS 任務管理學習筆記

引言

本文檔旨在通過在STM32微控制器上使用FreeRTOS來理解和實現任務管理。實驗的重點是創建和管理多個任務、處理任務同步以及通過簡單的硬件接口控制任務狀態。

實驗概述

實驗涉及創建三個任務:

  1. LED1_Task: 每300毫秒切換一次LED。
  2. LED2_Task: 每500毫秒切換一次另一個LED。
  3. Key_Task: 監控按鈕按下以暫停或恢復LED1_Task

此外,創建了一個初始化任務(InitializeTasks)來設置和管理這些任務。

關鍵概念

1. 任務創建

在FreeRTOS中,任務是通過xTaskCreate函數創建的。該函數接受以下參數:

  • 任務函數: 實現任務功能的函數。
  • 任務名稱: 任務的描述性名稱。
  • 堆棧大小: 分配給任務的堆棧大小。
  • 參數: 傳遞給任務函數的參數。
  • 優先級: 任務的優先級。
  • 任務句柄: 創建的任務的句柄,用于任務管理。
示例
xTaskCreate(LED1_Task, "LED1_Task", configMINIMAL_STACK_SIZE, NULL, 1, &LED1_Task_Handle);

2. 任務延遲

任務可以使用vTaskDelay函數進行延遲,這會使任務暫停指定的時間。延遲時間以滴答為單位指定,可以使用pdMS_TO_TICKS將其從毫秒轉換為滴答。

示例
vTaskDelay(pdMS_TO_TICKS(300));

3. 任務同步

在本實驗中,任務同步通過任務暫停和恢復實現:

  • 暫停: 使用vTaskSuspend暫停任務。這會停止任務的調度。
  • 恢復: 使用vTaskResume恢復任務。這會使任務重新被調度。
示例
vTaskSuspend(LED1_Task_Handle);
vTaskResume(LED1_Task_Handle);

4. 按鈕去抖動

按鈕去抖動通過在檢測到按鈕狀態變化后引入短暫延遲并再次檢查狀態來確保準確檢測到按鈕按下。這有助于消除機械開關的抖動。

示例
if (keyState != lastKeyState)
{vTaskDelay(pdMS_TO_TICKS(50)); // 去抖動延遲keyState = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_10) == GPIO_PIN_RESET) ? 1 : 0;if (keyState != lastKeyState){lastKeyState = keyState;if (keyState == 1){key = (key == 1) ? 0 : 1;printf("按鍵按下: %s\r\n", key == 1 ? "1" : "0");HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);if (key == 1){vTaskSuspend(LED1_Task_Handle);}else{vTaskResume(LED1_Task_Handle);}}}
}

5. 任務刪除

在初始化并創建所有必要任務后,初始化任務(InitializeTasks)會刪除自身以釋放資源。

示例
vTaskDelete(&InitializeTasks_Handle);

代碼分析

文件: main.c

任務函數
  • LED1_Task: 每300毫秒切換一次GPIOA, Pin 0上的LED。
  • LED2_Task: 每500毫秒切換一次GPIOA, Pin 1上的LED。
  • Key_Task: 監控GPIOA, Pin 10上的按鈕按下以暫停/恢復LED1_Task
初始化函數
  • InitializeTasks: 創建所有任務并在初始化后刪除自身。
主函數
  • 初始化外設和FreeRTOS調度器。
  • 創建初始化任務并啟動調度器。

結論

本實驗提供了對FreeRTOS中任務管理的實際理解,包括任務創建、同步和資源管理。按鈕去抖動和任務暫停/恢復的實現展示了如何有效地使用FreeRTOS功能來動態控制任務行為。

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

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

相關文章

c++set和pair的使用

set是C中的一種關聯容器,具有以下特點: 存儲唯一元素(不允許重復) 元素自動排序(默認升序) 基于紅黑樹實現(平衡二叉搜索樹) 插入、刪除和查找的時間復雜度為O(log n) 前言 在C…

終端命令行執行具體的方法名測試用例

你可以使用如下命令單獨執行 test_mutation_login_by_email 方法:python3 manage.py test apps.login.test_client.LoginTestCase.test_mutation_login_by_email 注意事項: 路徑 apps.login.test_client 要與你項目實際的 Python 包路徑一致(即 test_client.py 文件所在的包…

20250620在Ubuntu20.04.6下編譯KickPi的K7的Android14系統

【處理SDK】 rootrootrootroot-X99-Turbo:~/Android14$ tar zxvf rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android14$ ll rootrootrootroot-X99-Turbo:~/Android14$ rm rk3576-android14.0-20250217.tar.gz rootrootrootroot-X99-Turbo:~/Android1…

碳中和時代的家電革命,從華為智選IAM看科技企業的環保擔當

在"雙碳"戰略與品質消費浪潮的雙重加持下,家電產業正經歷一場前所未有的綠色革命。華為智選與空凈十大品牌IAM的深度協同,不僅構建了智能家電領域的技術新高地,更通過系統性創新持續拓展著行業可持續發展的想象空間。從凈水科技的突…

(C語言)Map數組的實現(數據結構)(鏈表)(指針)

源代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>// 鍵值對節點 typedef struct Node {char* key;int value;struct Node* next; } Node;// Map結構 typedef struct {Node* buckets[100]; // 固定大小的哈希桶&#xff08;…

Logback示例解析

<configuration><!-- 環境變量 --><springProperty scope"context" name"app.name" source"spring.application.name" defaultValue"application"/><!-- 日志存放路徑 --><property name"log.path&qu…

elementui響應式數據類型變更情況

背景。vue2。data中定義的響應數據類型是[]數組。應用在el-select中&#xff08;非multiple情況&#xff09;。當發生響應數據有變更渲染視圖時&#xff0c;發現定義的數組轉換成了字符串。 本身不是問題。但因為疏忽引發了watch監聽formData數據時產生了產生了多次監聽事件。…

人機融合智能 | 人智交互語境下的設計新模態

本章旨在探討技術與設計領域在人智交互語境下的關系及其影響,討論通過傳統設計對人智交互的優化方法。通過回顧大數據和發展趨勢,以 AI技術作為重要的技術推力,我們認為 AI技術將會在未來成為設計領域不可缺少的重要環節,并能夠幫助設計師更加高效、準確地開展設計工作。本章著…

C++設計模式分類(GOF-23種設計模式)

文章目錄 GOF-23 設計模式分類一、從目的分類1. 創建型&#xff08;Creational&#xff09;模式2. 結構型&#xff08;Structural&#xff09;模式3. 行為型&#xff08;Behavioral&#xff09;模式 二、從范圍分類1. 類模式&#xff08;Class Pattern&#xff09;2. 對象模式&…

AbMole| LY294002(M1925)

LY294002是一種廣譜的PI3K抑制劑&#xff0c;對PI3Kα/δ/β的IC50分別為0.5 μM/0.57 μM/0.97 μM。LY294002 也可以抑制 CK2 的活性&#xff0c;IC50 為 98 nM。LY294002 還是一種競爭性 DNA-PK 抑制劑&#xff0c;可逆結合 DNA-PK 的激酶結構域&#xff0c;IC50 為 1.4 μM…

第1章,[標簽 Win32] :第一個 WIn32 程序,MessageBox 函數

專欄導航 上一篇&#xff1a;第1章&#xff0c;[標簽 Win32] &#xff1a;第一個 WIn32 程序&#xff0c;程序入口 回到目錄 下一篇&#xff1a;無 本節前言 本節的學習&#xff0c;需要前兩節的內容作為先修知識。如果還沒有去看本專欄的前兩節&#xff0c;請你先去學習它…

求助帖:學Java開發方向還是網絡安全方向前景好

最近網絡安全被一個培訓機構吹得天花亂墜&#xff0c;雖然他家既有網安又有java和UI&#xff0c;我也是學軟件工程的&#xff08;山西某211&#xff0c;此機構是每年和我們學校合作的校企公司&#xff09;&#xff0c;但那里的老師仍然大力推薦我學網絡安全&#xff08;滲透、代…

OpenCV 圖像仿射變換之旋轉

一、知識點 1、void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags INTER_LINEAR, int borderMode BORDER_CONSTANT, …

HCIP-數據通信基礎

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xff1a;…

C語言基本數據類型與變量詳解

# C語言基本數據類型與變量詳解 ## 數據類型概述 在C語言中&#xff0c;數據類型決定了變量在內存中的存儲方式和大小&#xff0c;以及可以對其執行的操作。合理選擇數據類型能夠提高程序的效率和準確性&#xff0c;避免內存浪費和數據溢出等問題。 C語言的基本數據類型主要包括…

Babylon.js學習之路《十、高級幾何體:自定義模型與復雜形狀生成》

文章目錄 1. 引言&#xff1a;高級幾何體的應用場景2. 參數化建模&#xff1a;Babylon.MeshBuilder2.1 擴展幾何體類型2.2 自定義多邊形&#xff08;ExtrudePolygon&#xff09; 3. 頂點級建模&#xff1a;自定義VertexData3.1 手動定義頂點數據3.2 動態生成地形&#xff08;高…

【趙渝強老師】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下認證、鑒權和準入控制三個階段組成。這三個階段的關系如下圖所示。 視頻講解如下 【趙渝強老師】Kubernetes的安全框架 認證&#xff08;Authentication&#xff09; 當客戶端與Kubernetes集群建立HTTP通信時&#xff0c;首先HTTP請求會進…

CDN與靜態資源優化

CDN與靜態資源優化 在現代Web系統和AI應用中&#xff0c;隨著用戶訪問量的不斷攀升&#xff0c;靜態資源&#xff08;如HTML、CSS、JavaScript、圖片、音視頻、模型文件等&#xff09;帶來的負載日益沉重。尤其在大模型推理、前端渲染、廣告投放等場景中&#xff0c;靜態資源的…

如何填寫“appium inspector”內容?

1. 確認已經開啟appium的服務&#xff0c;運行appium 參考內容&#xff1a;{"appium:platformName": "Android", # 系統名稱"appium:platformVersion": "9", # 安卓版本&#xff0c;看設備"appium:deviceName": "3d…

mysql server層做了什么

服務器處理客戶端請求 服務器程序在處理來自客戶端的查詢請求時&#xff0c;大致需要分為3部分&#xff1a;連接管理、解析與優化、存儲引擎。 連接管理 每當有一個客戶端進程連接到服務器進程時&#xff0c;服務器進程都會創建一個線程專門處理與這個客戶端的交互&#xff…