1
創(chuàng)建任務
創(chuàng)建任務時使用的函數(shù)如下:
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函數(shù)指針,任務函數(shù)
const char * const pcName, //任務的名字
const configSTACK_DEPTH_TYPE usStackDepth,//棧大小,單位為word,10表示40字節(jié)
void * const pvParameters, //調用任務函數(shù)時傳入的參數(shù)
UBaseType_t uxPriority, //優(yōu)先級
TaskHandle_t * const pxCreatedTask );//任務句柄,以后使用它來操作這個任務
參數(shù)說明:
- pvTaskCode:函數(shù)指針,可以簡單地認為任務就是一個C函數(shù)。它稍微特殊一點:永遠不退出,或者退出時要調用"vTaskDelete(NULL)"
- pcName:任務的名字,FreeRTOS內部不使用它,僅僅起調試作用。長度為:confifigMAX_TASK_NAME_LEN
- usStackDepth:每個任務都有自己的棧,這里指定棧大小。單位是 word ,比如傳入 100 ,表示棧大小為 100 word ,也就是 400 字節(jié)。最大值為 uint16_t 的最大值。怎么確定棧的大小,并不容易,很多時候是估計。精確的辦法是看反匯編碼。
- pvParameters:傳入?yún)?shù),調用 pvTaskCode 函數(shù)指針時用到:pvTaskCode(pvParameters)
- uxPriorit:優(yōu)先級范圍:0~(confifigMAX_PRIORITIES – 1) 數(shù)值越小優(yōu)先級越低, 如果傳入過大的值,xTaskCreate會把它調整為(confifigMAX_PRIORITIES – 1)
- pxCreatedTask:用來保存 xTaskCreate 的輸出結果:task handle 。以后如果想操作這個任務,比如修改它的優(yōu)先級,就需要這個 handle 。如果不想使用該 handle ,可以傳入 NULL 。
- 返回值:成功:pdPASS ;失敗:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY( 失敗原因只有內存不足 )
- 注意:文檔里都說失敗時返回值是 pdFAIL ,這不對。pdFAIL 是 0 , errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 是 -1 。
實例:
void Task1Function(void * param)
{
while (1)
{
printf("1");
}
}
void Task2Function(void * param)
{
while (1)
{
printf("2");
}
}
xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);
xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);
開啟任務調度:
vTaskStartScheduler(); //開啟任務調度
結果:

2
刪除任務
刪除任務使用的函數(shù)如下:
void vTaskDelete( TaskHandle_t xTaskToDelete );
參數(shù)說明:
- xTaskToDelete:任務句柄,使用 xTaskCreate 創(chuàng)建任務時可以得到一個句柄,也可傳入NULL ,這表示刪除自己。
- 句柄的實質就是這個任務結構體的指針,在FreeRTOS中任務的創(chuàng)建利用面向對象的思想,創(chuàng)建的一個個任務都是結構體,刪除任務的實質就類似于C語言中的free釋放內存
實例:
void vTask1( void *pvParameters )
{
const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL );
BaseType_t ret;
/* 任務函數(shù)的主體一般都是無限循環(huán) */
for( ;; )
{
/* 打印任務的信息 */
printf("Task1 is runningrn");
ret = xTaskCreate( vTask2, "Task 2", 1000, NULL, 2, &xTask2Handle );
if (ret != pdPASS) printf("Create Task2 Failedrn");
// 如果不休眠的話, Idle任務無法得到執(zhí)行
// Idel任務會清理任務2使用的內存
// 如果不休眠則Idle任務無法執(zhí)行, 最后內存耗盡
vTaskDelay( xDelay100ms );
}
3
任務狀態(tài)
- 當前正在進行的任務,是running狀態(tài);其他所有任務都處于not running狀態(tài)
- "not running"狀態(tài)還可以細分為:
ready :就緒,隨時可以運行 blocked :阻塞,該任務在等待某一事件發(fā)生 suspended :掛起,該任務暫停休息

當創(chuàng)建任務并開始任務調度后,所有任務都處于Ready就緒狀態(tài),系統(tǒng)隨機挑選一個任務Running,正在執(zhí)行的任務可以使用vTaskSuspend函數(shù)使自己進入掛起狀態(tài)(傳入?yún)?shù)NULL或自己的句柄),也可以使其他任務進入掛起狀態(tài)(傳入?yún)?shù)為需要掛起任務的句柄),進入暫停狀態(tài)后,需要在別的任務執(zhí)行過程中調用vTaskResume函數(shù)該任務才會重新進入Ready狀態(tài);
在任務執(zhí)行過程中,需要等待某個函數(shù)或事件的發(fā)生,則進入掛起狀態(tài)(Baocked),當?shù)却氖录赡苁侵袛嗷蚰硞€任務)發(fā)生后該任務才會恢復Ready狀態(tài)。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
C語言
+關注
關注
183文章
7644瀏覽量
145598 -
FreeRTOS
+關注
關注
14文章
499瀏覽量
66939 -
狀態(tài)機
+關注
關注
2文章
499瀏覽量
29145
發(fā)布評論請先 登錄
相關推薦
熱點推薦
RTOS的多任務機制應用演示
的執(zhí)行路徑。深入理解和實現(xiàn)RTOS深入理解和實現(xiàn)RTOS_連載5_多任務機制應用.pdf (247.18 KB )
發(fā)表于 02-17 23:30
基于 stm32 的 FreeRTOS 的詳細移植步驟及其多任務應用 精選資料分享
目錄本文簡介:學習 FreeRTOS 原理,在 STM32 下完成一個基于 FreeRTOS 的多任務程序,執(zhí)行 3 個周期性 task ,具體任務
發(fā)表于 08-03 07:21
在STM32下完成FreeRTOS的多任務程序開發(fā)
基于在STM32下完成FreeRTOS的多任務程序開發(fā) 序言 二.項目說明三.實戰(zhàn)過程 1)實驗器材 2)開始實戰(zhàn) 3)任務實現(xiàn) 4)效果展示四. 結語 序言(一)
發(fā)表于 08-09 07:27
如何去實現(xiàn)基于stm32的FreeRTOS多任務程序
基于 stm32 的 FreeRTOS多任務程序實現(xiàn)一、什么是FreeRTOS二、AHT20數(shù)據(jù)采集原理電路繪制三、FreeRTOS的
發(fā)表于 08-24 07:45
FreeRTOS多任務系統(tǒng)的相關資料推薦
目錄單片機各編程系統(tǒng)特點1、裸機系統(tǒng)(1)輪詢系統(tǒng)(2)前后臺系統(tǒng)2、多任務系統(tǒng)單片機各編程系統(tǒng)特點單片機編程中有裸機系統(tǒng)與多任務系統(tǒng)。裸機系統(tǒng)又分為輪詢系統(tǒng)和前后臺系統(tǒng),FreeRTOS就是一種
發(fā)表于 01-13 07:51
如何在STM32下完成一個基于FreeRTOS的多任務程序
任務要求:在STM32下完成一個基于FreeRTOS的多任務程序,執(zhí)行3個周期性task;目錄一.介紹FreeRTOS二.
發(fā)表于 01-17 07:10
如何在STM32下完成一個基于FreeRTOS的多任務程序
文章目錄前言一、添加溫濕度采集模塊二、基于FreeRTOS的多任務程序總結前言此次,本菜鳥有兩個任務1.在菜鳥入門5的stm32最小系統(tǒng)中添加 AHT20數(shù)據(jù)采集原理電路(溫濕度傳感器
發(fā)表于 02-10 08:02
什么是多任務系統(tǒng)?FreeRTOS任務與協(xié)程簡析
FreeRTOS學習之FreeRTOS任務基礎知識轉行小白一枚,通過博客記錄自我學習,望更多博友多多指點,感激不盡!RTOS系統(tǒng)的核心就是任務管理,學習RTOS系統(tǒng)主要是為了使用RTO
發(fā)表于 02-18 06:38
keil下的FreeRtos多任務程序學習
keil下的FreeRtos多任務程序學習目標手動移植FreeRtos(以STM32F103為例)直接使用野火的模板學習目標學習FreeRTOS
發(fā)表于 02-21 06:14
基于消息驅動的多任務操作機制
本文對多任務操作機制與傳統(tǒng)的單任務操作機制進行了比較,分析了多任務系統(tǒng)中數(shù)據(jù)交換的方法,特別是目前最為流行的用消息驅動方式實現(xiàn)的系統(tǒng)。結合程
發(fā)表于 05-14 16:56
?0次下載
51單片機多任務機制的實現(xiàn)策略研究
從操作系統(tǒng)實現(xiàn)多任務機制的原理入手,分析了51單片機實現(xiàn)多任務機制的基本條件,論述了5l單片機實現(xiàn)多任務控制的二種方案。
發(fā)表于 09-19 17:26
?159次下載
stm32基于FreeRTOS的多任務程序
目錄實驗環(huán)境實驗目的實驗步驟代碼:實驗環(huán)境1.野火STM32MINI開發(fā)板2.keil5實驗目的在STM32下完成一個基于FreeRTOS的多任務程序,執(zhí)行3個周期性task,具體任務
發(fā)表于 12-07 10:36
?14次下載
基于FreeRTOS的STM32多任務程序
基于FreeRTOS的STM32多任務程序一、材料準備二、 FreeRTOS移植FreeRTOS是什么F
發(fā)表于 12-27 18:38
?28次下載
如何利用FreeRTOS的多任務機制優(yōu)化程序呢?
評論