【嵌入式——FreeRTOS】任務

【嵌入式——FreeRTOS】任務

  • 任務創建和刪除
    • 動態方式創建任務
    • 靜態方式創建任務
  • 刪除任務
  • 任務切換
    • 調度器
    • 任務切換流程
  • 任務掛起
  • 任務恢復
  • 相關API函數

任務創建和刪除

動態方式創建任務

任務的任務控制塊以及任務的棧空間所需的內存,均由freeRTOS從freeRTOS管理的堆中分配。此函數創建任務會立刻進入就緒態,由任務調度器調度運行。
任務的優先級,值越大,優先級越高

函數

xTaskCreate();
//返回值為pdPASS,任務創建成功。
//返回值為errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY,任務創建失敗BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,  				//指向任務函數的指針const char * const pcName,  				//任務名字 最大長度configMAX_TASK_NAME_LEN(20)const configSTACK_DEPTH_TYPE usStackDepth,	//任務堆棧大小 字為單位void * const pvParameters,  				//傳遞給任務函數的參數UBaseType_t uxPriority, 					//任務優先級 范圍 0 ~ configMAX_PRIORITIES(32)-1 TaskHandle_t * const pxCreatedTask ) 		//任務句柄,任務的任務控制塊

示例

static void udpserver_sendto_client (void* argument){}static TaskHandle_t	udpserver_tid;#define UDPSERVER_THREAD_NAME       "task name"
#define UDPSERVER_THREAD_STKSZ      (configMINIMAL_STACK_SIZE * 4)
#define UDPSERVER_THREAD_PRIO       (tskIDLE_PRIORITY + 3)BaseType_t ret = xTaskCreate(udpserver_sendto_client, UDPSERVER_THREAD_NAME, UDPSERVER_THREAD_STKSZ, 
NULL, UDPSERVER_THREAD_PRIO, &udpserver_tid);

實現動態創建任務流程

  1. 將FreeRTOSConfig.h文件中的configSUPPORT_DYNAMIC_ALLOCATION宏配置為1;
  2. 定義函數入口參數;
  3. 編寫任務函數。

動態創建任務內部實現

  1. 申請堆棧內存和任務控制塊內存;
  2. TCB結構體成員賦值;(把前面申請的堆棧地址,賦值給控制塊的堆棧成員)
  3. 初始化控制塊中的成員
  4. 添加新任務到就緒列表。

靜態方式創建任務

任務的任務控制塊以及任務的棧空間所需的內存,需用戶分配提供。

函數

xTaskCreateStatic();
//返回值為句柄或者其他值,任務創建成功。
//返回值為NULL,任務創建失敗。TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,			//指向任務函數的指針const char * const pcName, 			//任務名字 最大長度configMAX_TASK_NAME_LEN(20)const uint32_t ulStackDepth,		//任務堆棧大小 字為單位void * const pvParameters,			//傳遞給任務函數的參數UBaseType_t uxPriority,				//任務優先級 范圍 0 ~ configMAX_PRIORITIES(32)-1 StackType_t * const puxStackBuffer,	//任務堆棧,一般為數組由用戶分配StaticTask_t * const pxTaskBuffer ) //任務控制塊指針,由用戶分配PRIVILEGED_FUNCTION;

示例

#define STACK_SIZE 200//空閑任務配置
StaticTask_t idle_task_tcb;
StackType_t idle_task_stack[configMINIMAL_STACK_SIZE];//軟件定時器任務配置
StaticTask_t time_task_tcb;
StackType_t time_task_stack[configTIMER_TASK_STACK_DEPTH];StaticTask_t xTaskBuffer;
StackType_t xStack[ STACK_SIZE ];//空閑任務內存分配
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize )
{*ppxIdleTaskTCBBuffer = &idle_task_tcb;*ppxIdleTaskStackBuffer = idle_task_stack;*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;}//軟件定時器內存分配
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,StackType_t ** ppxTimerTaskStackBuffer,uint32_t * pulTimerTaskStackSize )
{*ppxTimerTaskTCBBuffer = &time_task_tcb;*ppxTimerTaskStackBuffer = time_task_stack;pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;}void vTaskCode( void * pvParameters ){}TaskHandle_t xHandle = xTaskCreateStatic(vTaskCode,       // Function that implements the task."NAME",          // Text name for the task.STACK_SIZE,      // Stack size in words, not bytes.( void * ) 1,    // Parameter passed into the task.tskIDLE_PRIORITY,// Priority at which the task is created.xStack,          // Array to use as the task's stack.&xTaskBuffer );  // Variable to hold the task's data structure.

靜態創建任務使用流程

  1. 將FreeRTOSConfig.h文件中的configSUPPORT_STATIC_ALLOCATION宏配置為1;

  2. 定義空閑任務和定時器任務的任務堆棧即TCB;

  3. 實現兩個接口函數

    1. vApplicationGetIdleTaskMemory()
    2. vApplicationGetTimerTaskMemory();可選的
  4. 定義函數入口參數;

  5. 編寫任務函數;

靜態創建任務內部實現

  1. TCB結構體成員賦值;
  2. 添加新任務到就緒列表;

刪除任務

用于刪除已經被創建的任務。被刪除的任務將從就緒態任務列表,阻塞態任務列表,掛起態任務列表和事件列表中移除。

函數

vTaskDelete();void vTaskDelete( TaskHandle_t xTaskToDelete )
//xTaskToDelete 待刪除的任務句柄

注意

  1. 當傳入的參數為NULL,則代表刪除任務自身(當前正在運行的任務)。
  2. 空閑任務會負責釋放被刪除任務中由系統分配的內存,但是由用戶在任務刪除前申請的內存,則需要由用戶在任務被刪除前提前釋放,否則將導致內存泄漏。

刪除任務流程

  1. 將INCLUDE_vTaskDelete宏配置為1;
  2. 入口參數輸入需要刪除的任務句柄(NULL代表自身);

刪除任務內部實現過程

  1. 獲取所要刪除任務的控制塊;

  2. 將被刪除的任務移除所在列表;

  3. 判斷所需刪除的任務

    1. 刪除任務自身,需先添加到等待刪除列表,內存釋放將在空閑任務進行。
    2. 刪除其他任務,釋放內存,任務數量–
  4. 更新下個任務的阻塞時間;

任務切換

調度器

實現任務間的切換。本質就是CPU寄存器的切換

//啟動任務,開啟調度
vTaskStartScheduler();

當由任務A切換到任務B時,主要分為兩步

第一步:需暫停任務A的執行,并將此時任務A的寄存器保存到任務堆棧,這個過程叫做保存現場。
第二步:將任務B的各個寄存器值(被存于任務堆棧中)恢復到CPU寄存器中,這個過程叫做恢復現場。對任務A保存現場,對任務B恢復現場,這個過程被稱為上下文切換。

任務切換流程

  1. 觸發PendSV中斷
  2. 當前的psp是正在運行的任務的棧指針,讀取當前psp進程指針,存入r0
  3. 壓棧(保存現場)
  4. 獲取當前最高優先級任務的任務控制塊
  5. 出棧(恢復現場)
  6. 更新切換后的任務的棧指針給psp
  7. bx r14指向新任務函數

PendSV中斷如何觸發

  1. 滴答定時器中斷調用。
  2. 執行FreeRTOS提供的相關API函數,portYIELD();

任務掛起

掛起任務

函數

此函數用于掛起任務,使用時將FreeRTOSConfig.h文件中宏INCLUDE_vTaskSuspend配置為1。
無論優先級如何,被掛起的任務都將不再被執行,直到任務被恢復。
當傳入參數為NULL,則代表掛起任務自身(當前正在運行的任務)。

void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;
//xTaskToSuspend  待掛起任務的句柄

任務恢復

恢復被掛起的任務

函數

此函數用于恢復任務,使用時將FreeRTOSConfig.h文件中宏INCLUDE_vTaskSuspend配置為1。
任務無論被掛起多少次,只需在任務中調用vTaskResume()恢復一次,就可以繼續運行,且被恢復的任務會進入就緒狀態。
在中斷中恢復被掛起的任務。帶有“FromISR”后綴是在終端函數中專用的API函數

void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
//xTaskToResume 待恢復任務的任務句柄

此函數用于恢復任務,使用時將FreeRTOSConfig.h文件中宏INCLUDE_vTaskSuspend配置為1,宏INCLUDE_xTaskResumeFromISR配置為1。
被恢復的任務的優先級大于當前執行的任務的優先級,就會返回pdTRUE需要手動執行任務切換(portYIELD_FROM_ISR()函數)。
中斷服務程序中要調用freeRTOS的API函數則中斷優先級不能高于freeRTOS所管理的最高優先級(5~15)。

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;
//xTaskToResume 待恢復任務的任務句柄
//返回值 pdTRUE 任務恢復后需要進行任務切換  pdFALSE任務恢復后不需要進行任務切換

相關API函數

函數描述
uxTaskPriorityGet()獲取任務優先級
vTaskPrioritySet()設置任務優先級
uxTaskGetNumberOfTasks()獲取系統中任務的數量
uxTaskGetSystemState()獲取所有任務狀態信息
vTaskGetInfo()獲取指定單個任務信息
xTaskGetCurrentTaskHandle()獲取當前任務的任何句柄
xTaskGetHandle()根據任務名獲取該任務的任何句柄
uxTaskGetStackHighWaterMark()獲取任務的任務棧歷史剩余最小值
eTaskGetState()獲取任務狀態
vTaskList()以表格形式獲取所有任務的信息
vTaskGetRunTimeStats()獲取任務的運行時間

更多API請查看官網

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

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

相關文章

c#asp.net中字典的使用

字典是一個鍵值對,可以用來保存數據,再查詢; 下面是一個案例:依據多個學號查詢多個學生的姓名,只能到數據庫查詢一次數據!!! 先在數據庫查詢學號對應的學生,把數據保存在…

mysql8.0.19安裝zip版本

下載地址https://downloads.mysql.com/archives/community/ 下載版本 下載后解壓,不包括data 和my.ini文件。其中data 文件是自動生成的【mysqld --initialize --console】,my.ini需要自己編寫設置。 新建my.ini文件 需要自己設置 basedirG:\soft\mysql…

內網服務器時間校正

新購買的云服務器發現內網機器和可以訪問外網的機器時間慢了三分鐘,導致有些訪問會報錯,那么我們配置一下ntp校正一下時間。外網配置起來比較簡單,直接下載ntp執行校正命令即可。 比當前時間慢了三分鐘 注意當前服務器是可以訪問外網的機器這…

【gitee使用教程】(創建項目倉庫并上傳代碼簡易版)

gitee使用教程,創建項目倉庫并上傳代碼簡易版 1.在碼云上創建一個倉庫2.將代碼克隆到本地1.復制倉庫地址2.找到你想要放置的文件位置,右鍵點擊更多選項,選擇Git Clone3.將復制的倉庫地址填入URL 3. IDEA結合GIT和Gitee的簡單使用idea需要識別…

【python】最新版抖音s逆向拿到數據,非常詳細教程(附完整代碼)

?? 歡迎大家來到景天科技苑?? ???? 養成好習慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構師,華為云開發者社區專家博主,阿里云開發者社區專家博主,CSDN全棧領域優質創作者,掘金優秀博主,51CTO博客專家等。 ??《博客》:Python全…

Excel 宏錄制與VBA編程 ——VBA編程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)

Uniom方法 使用Union方法可以將多個非連續區域連接起來成為一個區域,從而可以實現對多個非連續區域一起進行操作。 Resize方法 使用Range對象的Resize屬性調整指定區域的大小,并返回調整大小后的單元格區域。 Cells方法 Cells屬性返回一個Range對象。 Us…

Domino應用中的HTML5

大家好,才是真的好。 在xpages多年不見有效更新,前景不明的時候,Domino傳統Web應用開發方式還是受到了應有的青睞。畢竟,在Nomad Web時代,連最傳統的Notes CS原生應用也突然煥發了勃勃生機一樣。 但,對有…

什么是strcmp函數

目錄 開頭1.什么是strcmp函數2.strcmp函數里的內部結構3.strcmp函數的實際運用(這里只列舉其一)腦筋急轉彎 結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們要來認識一下C語言中的strcmp函數。 1.什么是strcmp函數 strcmp函數來自于C語言中的頭文件<str…

ARP 原理詳解 一

ARP 原理 ARP&#xff08;Address Resolution Protocol&#xff09;地址解析協議&#xff0c;是根據 IP 地址獲取物理地址的一個 TCP/IP 協議。 OSI 網絡七層模型中&#xff0c;IP 地址在 OSI 模型第三層&#xff0c;MAC 地址在第二層&#xff0c;彼此不直接通信。 在通過以…

Spring Cloud Alibaba AI 大模型使用示例

1 pom.xml, 注意版本(jdk17) &#xff0c;倉庫地址&#xff0c;排除的依賴&#xff08;日志錯誤&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www…

性能測試中的場景設計和測試執行

假設一個內部系統要求響應時間在 3s 以內&#xff0c;支持最大用戶數為4萬。根據二八原則&#xff0c;80%用戶在20%時間使用系統(4w80%)/(24h20%)≈1.9點擊/秒。并發數TPS&#xff08;運行時間思考時間&#xff09;1.9&#xff08;30.50.330.50.30.53&#xff09;21。 注意&am…

Flutter循序漸進==>數據結構(列表、映射和集合)和錯誤處理

導言 填鴨似的教育確實不行&#xff0c;我高中時學過集合&#xff0c;不知道有什么用&#xff0c;毫無興趣&#xff0c;等到我學了一門編程語言后&#xff0c;才發現集合真的很有用&#xff1b;可以去重&#xff0c;可以看你有我沒有的&#xff0c;可以看我有你沒有的&#xf…

毫米波雷達深度學習技術-1.7訓練一個神經網絡

1.7 訓練一個神經網絡 對于訓練神經網絡&#xff0c;有兩個步驟&#xff0c;即前向傳遞和誤差反向傳播。 1.7.1 前向傳播和反向傳播 在前向傳遞中&#xff0c;輸入被饋送到模型并與權重向量相乘&#xff0c;并為每一層添加偏差以計算模型的輸出。密集層或全連接層第l層的輸入、…

SQL面試題練習 —— 查詢前2大和前2小用戶并有序拼接

目錄 1 題目2 建表語句3 題解 1 題目 有用戶賬戶表&#xff0c;包含年份&#xff0c;用戶id和值,請按照年份分組&#xff0c;取出值前兩小和前兩大對應的用戶id&#xff0c;需要保持值最小和最大的用戶id排首位。 樣例數據 ------------------------- | year | user_id | v…

網絡基礎-RIP協議

RIP&#xff08;Routing Information Protocol&#xff09;是一個基于距離矢量的動態路由協議&#xff0c;常用于小型到中型網絡。RIP是較早的路由協議之一&#xff0c;具有簡單易用的特點。以下是關于RIP協議的詳細介紹&#xff1a; RIP的主要特點 ①使用跳數&#xff08;ho…

非標設備行業的數智化項目管理

近年來&#xff0c;中國制造快速發展&#xff0c;企業迫切需要加快轉型升級。與傳統制造業相比&#xff0c;高端制造業具有明顯的優勢&#xff1a;高技術、高附加值、低污染、低排放、競爭優勢強。一方面&#xff0c;企業對于生產效率和自動化水平的要求不斷提高&#xff0c;期…

開發個人OpenUI--1 項目介紹

開發個人OpenUI--1 項目介紹 開發個人OpenUI--1 項目介紹知識點大綱文章目錄項目地址 開發個人OpenUI–1 項目介紹 本文將以一個使用Ollama部署的ChatGPT為背景&#xff0c;主要還是介紹和學習使用 go-zero 框架&#xff0c;開發個人OpenUI的服務器后端&#xff0c;使用Docker…

武漢星起航:成功掛牌上股交,領航亞馬遜跨境電商,共創未來輝煌

在全球電商的競爭格局中&#xff0c;亞馬遜憑借其卓越的服務、豐富的商品種類和高效的物流體系&#xff0c;始終穩坐全球電商市場的頭把交椅。而在這股不可阻擋的電商浪潮中&#xff0c;武漢星起航電子商務有限公司憑借其前瞻性的戰略布局和強大的運營能力&#xff0c;成功在20…

名企面試必問30題(十二)——簡單介紹一下你的家庭情況

1.思路 對于面試官來說&#xff0c;他提出這個問題&#xff0c;只是為了深挖您的性格、穩定性、行事風格&#xff0c;包括未來定居規劃、生育規劃等基礎信息&#xff0c;這是正常情況。您不要過多圍繞其他家庭成員來講&#xff0c;否則面試官無法獲取他想要的&#xff0c;您也難…

【單片機畢業設計選題24040】-基于STM32的藍牙防丟器設計

系統功能: 系統上電后顯示“歡迎使用藍牙防丟系統請稍后”兩秒鐘顯示正常界面&#xff0c;如果藍牙正常連接OLED顯示Connected, 藍牙未連接則顯示DisConnected同時蜂鳴器報警 藍牙正常連接后在APP上每隔三秒顯示一個Connected 系統功能框圖: 主要功能模塊原理圖: 電源時鐘…