【STM32】FreeRTOS 任務的創建(二)

這篇文章在于 詳細解釋 FreeRTOS 中任務的創建過程,包括任務創建的本質過程、API 詳解、兩種創建方式(動態/靜態)、任務函數規范、常見錯誤及實踐建議。

這里參照:RTOS官方文檔:https://www.freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/04-API-references/01-Task-creation/01-xTaskCreate

FreeRTOS 的“任務”

在 FreeRTOS 中,每個任務(Task)就是一個可以獨立運行的“線程”或“執行單元”,具有:

自己的函數入口(任務函數)
獨立的堆棧空間
獨立的上下文(CPU 寄存器、程序計數器)

FreeRTOS 通過任務調度器(Scheduler)來在這些任務之間切換執行權,實現 “多任務并發”。

創建任務的方式

動態創建任務(最常用)(上述官網鏈接)

xTaskCreate() 是 FreeRTOS 中最常用的任務創建函數,適合一般嵌入式系統中動態創建任務,使用時需合理配置堆大小和任務優先級,確保系統資源充足。

使用 API 函數:xTaskCreate()

BaseType_t xTaskCreate(TaskFunction_t pvTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE uxStackDepth,void *pvParameters,UBaseType_t uxPriority,TaskHandle_t *pxCreatedTask
);
參數說明:
pvTaskCode			任務入口函數(必須是 void func(void *pvParameters) 形式)
pcName				任務名(調試用途)
uxStackDepth		堆棧大小(單位是“字”,不是字節) STM32 上 1 word = 4 字節
pvParameters		創建任務時傳入的參數指針
uxPriority			任務優先級(0 ~ configMAX_PRIORITIES - 1)
pxCreatedTask		任務句柄的地址(可為 NULL)返回值:
pdPASS:創建成功
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:內存不足,任務創建失敗

由于官方文檔里的鏈接內容過于理論化,不易理解,這里用大白話翻譯一下:

xTaskCreate() 函數詳解:

功能說明:
用于創建一個新的任務并將其加入到就緒列表中。
必須啟用 FreeRTOSConfig.h 中的宏:

#define configSUPPORT_DYNAMIC_ALLOCATION 1

使用動態內存分配方式從 FreeRTOS 的堆中分配 任務堆棧任務控制塊。

使用注意事項:
  1. 堆棧大小單位是“字”(word)
    • 在 Cortex-M3/M4 中,1 word = 4 字節
      所以 128 表示 512 字節堆棧空間
  2. 任務函數不能 return
    • 必須是一個無限循環 for(;;)while(1){}
    • 若任務要結束,需使用 vTaskDelete(NULL)
  3. pvParameters 傳參要小心生命周期
    • 不要傳局部變量地址
    • 可以傳入靜態變量或常量值
  4. 優先級不能超過 configMAX_PRIORITIES - 1
    • 否則調度器行為不確定
    • 建議使用 tskIDLE_PRIORITY + x 這種寫法
完整的任務創建示例
/********************************************************************************* @file    Project/STM32F10x_StdPeriph_Template/main.c * @author  MCD Application Team* @version V3.5.0* @date    08-April-2011* @brief   Main program body******************************************************************************* @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>*******************************************************************************/  /* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h" 
#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"	
#include "gpio.h"//------------------------- start_task --------------------------------------------//
void 			start_task(void *pvParameters);			//任務函數入口
TaskHandle_t StartTask_Handler;							//任務句柄	_任務身份證_每個任務都有獨立的任務
#define 	START_STK_SIZE  64							//任務堆棧大小
#define 	START_TASK_PRO	1							//任務優先級
//-----------------------------------------------------------------------//在主函數中創建任務	
void Start()
{
//------------------------- start_task --------------------------------------------////初始化函數xTaskCreate((TaskFunction_t) 	start_task,							//任務函數入口(const char *	 )  "start_task",			//任務函數名稱(uint16_t      ) 	START_STK_SIZE,			//任務堆棧大小(void *    	   )  NULL,						//任務參數入口(UBaseType_t 	 )  START_TASK_PRO,			//任務優先級(TaskHandle_t *) 	StartTask_Handler );    //任務句柄vTaskStartScheduler(); 	//開啟任務調度器
}int main(void)
{NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );		//RTOS需要將中斷優先級分組分配到第四組usart_init(115200);MX_GPIO_Init();printf("Create Task! \r\n");Start();while(1)		// 不會執行到這里{}}//任務函數(必須是無限循環)
void start_task(void *pvParameters) 			//任務函數入口
{printf("start Task Run! \r\n");while(1){GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);  //綠燈閃爍vTaskDelay(500);GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET); 	  //綠燈關閉vTaskDelay(500);vTaskDelay(10);}
}/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

FreeRTOS 中,任務是最基本的執行單元。你可以通過 xTaskCreate()xTaskCreateStatic() 創建任務,并通過調度器進行任務切換,從而實現多任務并發執行。任務函數必須是無限循環,并適當使用延時函數避免占用 CPU。


靜態創建任務(更可控) (不詳細介紹,較少使用)

使用 API 函數:xTaskCreateStatic()

TaskHandle_t xTaskCreateStatic(TaskFunction_t pvTaskCode,const char * const pcName,const uint32_t ulStackDepth,void *pvParameters,UBaseType_t uxPriority,StackType_t *puxStackBuffer,StaticTask_t *pxTaskBuffer
);

用戶自己提供堆棧數組 + TCB 緩存
更適合內存受限嵌入式場景
不依賴 FreeRTOS 的堆(heap_4.c

動態 vs 靜態任務創建對比:

項目動態創建 xTaskCreate靜態創建 xTaskCreateStatic
內存分配使用 FreeRTOS 堆用戶手動提供
靈活性稍低
控制性
適合場景一般應用內存受限、認證項目

最后,解釋一下任務句柄的用途:任務句柄 類似于每個任務的身份證,每個任務都有獨立的任務句柄標識。

創建任務時可以返回任務句柄(TaskHandle_t),用于:

  • 刪除任務:vTaskDelete(xHandle);
  • 掛起任務:vTaskSuspend(xHandle);
  • 恢復任務:vTaskResume(xHandle);
  • 獲取任務狀態:eTaskGetState(xHandle);

以上,便是 FreeRTOS 任務的創建。

以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!

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

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

相關文章

軟考 系統架構設計師系列知識點之面向服務架構設計理論與實踐(9)

接前一篇文章:軟考 系統架構設計師系列知識點之面向服務架構設計理論與實踐(8) 所屬章節: 第15章. 面向服務架構設計理論與實踐 第3節 SOA的參考架構 15.3 SOA的參考架構 IBM的Websphere業務集成參考架構(如圖15-2所示,以下簡稱參考架構)是典型的以服務為中心的企業集…

分區域材料設計:主承重區 / 次承重區 / 足弓區的彈性參數與刺激強度匹配

你是否總在為足部酸痛、膝蓋不適或腰背僵硬煩惱&#xff1f;穿了昂貴的緩震跑鞋&#xff0c;用了定制矯形器&#xff0c;問題卻反復出現&#xff1f;今天&#xff0c;我們要顛覆一個流傳百年的“常識”——腳不是脆弱的“需要被保護的對象”&#xff0c;而是被錯誤的設計“慣壞…

使用Qt下QAudioOutput播放聲音

導讀本項目目的是使用QAudioOutput播放聲音 &#xff0c;音頻數據來源為ffmpeg解碼后的音頻數據。Qt音頻播放類說明 QAudioFormatQAudioFormat是Qt多媒體框架中用于定義音頻格式的核心類&#xff0c;用于設置音頻數據的參數&#xff0c;確保與硬件設備兼容。其主要功能和參數如…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(9):ようなN

日語學習-日語知識點小記-構建基礎-JLPT-N3階段&#xff08;9&#xff09;&#xff1a;ようなN 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰2、知識點&#xff08;&#xff11;&#xff09;復習&#xff08;&#xff12;&#xff09;復習&…

洛谷P1512 伊甸園日歷游戲

一開始&#xff0c;我發現有“必勝策略”&#xff0c;就知道是博弈論&#xff0c;然后看了兩種操作&#xff08;月份1和天數1&#xff09;&#xff0c;于是想到用記憶化搜索找出所有的可能性 &#xff0c;但不知道怎么判斷當前是否為先手必勝/必敗態&#xff0c;使用了TJ方法后…

Kafka——消費者組到底是什么?

引言在分布式系統中&#xff0c;消息中間件的核心價值在于高效地連接生產者與消費者&#xff0c;實現數據的可靠傳遞。然而&#xff0c;傳統消息引擎面臨一個兩難困境&#xff1a;如何在“消息不重復消費”與“系統可擴展性”之間找到平衡&#xff1f;點對點模型&#xff08;如…

新mac電腦軟件安裝指南(前端開發用)

1. 下載git 未下載git直接下載homebrew也會提示你下載git 2. 下載homebrew 介紹&#xff1a; Homebrew 是 macOS 和 Linux 系統的開源包管理器?&#xff0c;通過命令行實現軟件的快速安裝、更新和管理&#xff0c;極大簡化了開發者及普通用戶的工作流程。 命令&#xff1a;…

【HarmonyOS】ArkUI 布局與容器組件

目錄前言一、線性布局(Column/Row)1.先布局后內容2.元素在主軸上的排列方式3.元素在交叉軸上的排列方式二、層疊布局(Stack)1.開發布局2.對齊方式三、彈性布局(Flex)四、創建列表(List)五、創建輪播(Swiper)1.基本用法2.常用屬性3.樣式自定義六、選項卡Tabs1.基本用法2.常用屬性…

MCNN-BiLSTM-Attention分類預測模型等!

MCNN-BiLSTM-Attention分類預測模型基于多尺度卷積神經網絡(MCNN)雙向長短期記憶網絡(BiLSTM)注意力機制(Attention)的分類預測模型&#xff0c;matlab代碼&#xff0c;直接運行使用&#xff01;1、模型介紹&#xff1a;針對傳統方法在噪聲環境下診斷精度低的問題&#xff0c;提…

【Luogu】每日一題——Day12. P3149 排序 (樹狀數組 + 逆序對)

鏈接&#xff1a;P3149 排序 - 洛谷 題目&#xff1a; 思路&#xff1a; 經典搭配了 首先我們來分析以下操作的作用&#xff0c;如果我們選了 a[k]&#xff0c;那么對逆序對有什么影響呢&#xff1f; ①.對于 x y&#xff0c;且 x > a[k]&#xff0c;y < a[k] 由于 x…

電商項目_秒殺_架構升級

1. 秒殺當前架構設計nginx節點和訂單服務都可以方便的擴容&#xff08;增加機器&#xff09;redis擴容需則需要考慮架構設計當前架構面臨的痛點&#xff1a;秒殺系統redis是單節點&#xff08;主從&#xff09;部署&#xff0c;讀redis時并發量會成為瓶頸。所以考慮將增加redis…

CodeBuddy IDE發布:編程新時代的顛覆者?

開場&#xff1a;編程界的 “新風暴” 來襲 你能想象&#xff0c;不用敲一行代碼就能開發軟件嗎&#xff1f;這個曾經只存在于科幻電影里的場景&#xff0c;如今已經成為現實&#xff01;就在最近&#xff0c;編程界迎來了一場 “新風暴”——CodeBuddy IDE 重磅發布&#xff…

深度分析Java類加載機制

Java 的類加載機制是其實現平臺無關性、安全性和動態性的核心基石。它不僅僅是簡單地將 .class 文件加載到內存中&#xff0c;而是一個精巧、可擴展、遵循特定規則的生命周期管理過程。以下是對其深度分析&#xff1a; 一、核心概念與生命周期 一個類型&#xff08;Class 或 In…

神經網絡實戰案例:用戶情感分析模型

在當今數字化時代&#xff0c;用戶評論和反饋成為企業了解產品滿意度的重要渠道。本項目將通過神經網絡構建一個情感分析模型&#xff0c;自動識別用戶評論中的情感傾向。我們將使用真實的產品評論數據&#xff0c;從數據預處理到模型部署&#xff0c;完整展示神經網絡在NLP領域…

now能減少mysql的壓力嗎

是否用數據庫的 NOW() 能減少 MySQL 的壓力&#xff1f;?答案是否定的——使用 NOW() 不僅不會降低壓力&#xff0c;反而可能略微增加 MySQL 的負載。以下是詳細分析&#xff1a;&#x1f50d; 性能對比&#xff1a;NOW() vs. Java 傳參?指標??Java 傳參 (e.g., new Date()…

數據結構01:鏈表

數據結構 鏈表 鏈表和數組的區別 1. 存儲方式 數組&#xff1a; 元素在內存中連續存儲&#xff0c;占用一塊連續的內存空間元素的地址可以通過索引計算&#xff08;基地址 索引 元素大小&#xff09;大小固定&#xff0c;在創建時需要指定容量 鏈表&#xff1a; 元素&#xf…

【Java學習|黑馬筆記|Day21】IO流|緩沖流,轉換流,序列化流,反序列化流,打印流,解壓縮流,常用工具包相關用法及練習

標題【Java學習|黑馬筆記|Day20】 今天看的是黑馬程序員的《Java從入門到起飛》下部的95-118節&#xff0c;筆記包含IO流中的字節、字符緩沖流&#xff0c;轉換流&#xff0c;序列化流反序列化流&#xff0c;打印流&#xff0c;解壓縮流&#xff0c;常用工具包相關用法及練習 …

API網關原理與使用場景詳解

一、API網關核心原理 1. 架構定位 #mermaid-svg-hpDCWfqoiLcVvTzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hpDCWfqoiLcVvTzq .error-icon{fill:#552222;}#mermaid-svg-hpDCWfqoiLcVvTzq .error-text{fill:#5…

OSPF路由協議——上

OSPF路由協議 RIP的不足 以跳數評估的路由并非最優路徑如果RTA選擇s0/0傳輸&#xff0c;傳輸需時會大大縮短為3s 最大跳數為16跳&#xff0c;導致網絡尺度小RIP協議限制網絡直徑不能超過16跳&#xff0c;并且16跳為不可達。 收斂速度慢 RIP 定期路由更新 更新計時器&#xff1a…

(LeetCode 面試經典 150 題) 219. 存在重復元素 II (哈希表)

題目&#xff1a;219. 存在重復元素 II 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 哈希表記錄每個數最新的下標&#xff0c;遇到符合要求的返回true即可。 C版本&#xff1a; class Solution { public:bool containsNearbyDuplicate(vector<int>& nums,…