1
創(chuàng)建任務(wù)
創(chuàng)建任務(wù)時(shí)使用的函數(shù)如下:
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函數(shù)指針,任務(wù)函數(shù)
const char * const pcName, //任務(wù)的名字
const configSTACK_DEPTH_TYPE usStackDepth,//棧大小,單位為word,10表示40字節(jié)
void * const pvParameters, //調(diào)用任務(wù)函數(shù)時(shí)傳入的參數(shù)
UBaseType_t uxPriority, //優(yōu)先級
TaskHandle_t * const pxCreatedTask );//任務(wù)句柄,以后使用它來操作這個(gè)任務(wù)
參數(shù)說明:
- pvTaskCode:函數(shù)指針,可以簡單地認(rèn)為任務(wù)就是一個(gè)C函數(shù)。它稍微特殊一點(diǎn):永遠(yuǎn)不退出,或者退出時(shí)要調(diào)用"vTaskDelete(NULL)"
- pcName:任務(wù)的名字,FreeRTOS內(nèi)部不使用它,僅僅起調(diào)試作用。長度為:confifigMAX_TASK_NAME_LEN
- usStackDepth:每個(gè)任務(wù)都有自己的棧,這里指定棧大小。單位是 word ,比如傳入 100 ,表示棧大小為 100 word ,也就是 400 字節(jié)。最大值為 uint16_t 的最大值。怎么確定棧的大小,并不容易,很多時(shí)候是估計(jì)。精確的辦法是看反匯編碼。
- pvParameters:傳入?yún)?shù),調(diào)用 pvTaskCode 函數(shù)指針時(shí)用到:pvTaskCode(pvParameters)
- uxPriorit:優(yōu)先級范圍:0~(confifigMAX_PRIORITIES – 1) 數(shù)值越小優(yōu)先級越低, 如果傳入過大的值,xTaskCreate會(huì)把它調(diào)整為(confifigMAX_PRIORITIES – 1)
- pxCreatedTask:用來保存 xTaskCreate 的輸出結(jié)果:task handle 。以后如果想操作這個(gè)任務(wù),比如修改它的優(yōu)先級,就需要這個(gè) handle 。如果不想使用該 handle ,可以傳入 NULL 。
- 返回值:成功:pdPASS ;失敗:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY( 失敗原因只有內(nèi)存不足 )
- 注意:文檔里都說失敗時(shí)返回值是 pdFAIL ,這不對。pdFAIL 是 0 , errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 是 -1 。
實(shí)例:
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);
開啟任務(wù)調(diào)度:
vTaskStartScheduler(); //開啟任務(wù)調(diào)度
結(jié)果:
2
刪除任務(wù)
刪除任務(wù)使用的函數(shù)如下:
void vTaskDelete( TaskHandle_t xTaskToDelete );
參數(shù)說明:
- xTaskToDelete:任務(wù)句柄,使用 xTaskCreate 創(chuàng)建任務(wù)時(shí)可以得到一個(gè)句柄,也可傳入NULL ,這表示刪除自己。
- 句柄的實(shí)質(zhì)就是這個(gè)任務(wù)結(jié)構(gòu)體的指針,在FreeRTOS中任務(wù)的創(chuàng)建利用面向?qū)ο蟮乃枷?,?chuàng)建的一個(gè)個(gè)任務(wù)都是結(jié)構(gòu)體,刪除任務(wù)的實(shí)質(zhì)就類似于C語言中的free釋放內(nèi)存
實(shí)例:
void vTask1( void *pvParameters )
{
const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL );
BaseType_t ret;
/* 任務(wù)函數(shù)的主體一般都是無限循環(huán) */
for( ;; )
{
/* 打印任務(wù)的信息 */
printf("Task1 is runningrn");
ret = xTaskCreate( vTask2, "Task 2", 1000, NULL, 2, &xTask2Handle );
if (ret != pdPASS) printf("Create Task2 Failedrn");
// 如果不休眠的話, Idle任務(wù)無法得到執(zhí)行
// Idel任務(wù)會(huì)清理任務(wù)2使用的內(nèi)存
// 如果不休眠則Idle任務(wù)無法執(zhí)行, 最后內(nèi)存耗盡
vTaskDelay( xDelay100ms );
}
3
任務(wù)狀態(tài)
- 當(dāng)前正在進(jìn)行的任務(wù),是running狀態(tài);其他所有任務(wù)都處于not running狀態(tài)
- "not running"狀態(tài)還可以細(xì)分為:
ready :就緒,隨時(shí)可以運(yùn)行 blocked :阻塞,該任務(wù)在等待某一事件發(fā)生 suspended :掛起,該任務(wù)暫停休息
當(dāng)創(chuàng)建任務(wù)并開始任務(wù)調(diào)度后,所有任務(wù)都處于Ready就緒狀態(tài),系統(tǒng)隨機(jī)挑選一個(gè)任務(wù)Running,正在執(zhí)行的任務(wù)可以使用vTaskSuspend函數(shù)使自己進(jìn)入掛起狀態(tài)(傳入?yún)?shù)NULL或自己的句柄),也可以使其他任務(wù)進(jìn)入掛起狀態(tài)(傳入?yún)?shù)為需要掛起任務(wù)的句柄),進(jìn)入暫停狀態(tài)后,需要在別的任務(wù)執(zhí)行過程中調(diào)用vTaskResume函數(shù)該任務(wù)才會(huì)重新進(jìn)入Ready狀態(tài);
在任務(wù)執(zhí)行過程中,需要等待某個(gè)函數(shù)或事件的發(fā)生,則進(jìn)入掛起狀態(tài)(Baocked),當(dāng)?shù)却氖录赡苁侵袛嗷蚰硞€(gè)任務(wù))發(fā)生后該任務(wù)才會(huì)恢復(fù)Ready狀態(tài)。
-
C語言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141548 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
492瀏覽量
64275 -
狀態(tài)機(jī)
+關(guān)注
關(guān)注
2文章
493瀏覽量
28221
發(fā)布評論請先 登錄
RTOS的多任務(wù)機(jī)制應(yīng)用演示
基于 stm32 的 FreeRTOS 的詳細(xì)移植步驟及其多任務(wù)應(yīng)用 精選資料分享
在STM32下完成FreeRTOS的多任務(wù)程序開發(fā)
如何去實(shí)現(xiàn)基于stm32的FreeRTOS多任務(wù)程序
FreeRTOS多任務(wù)系統(tǒng)的相關(guān)資料推薦
如何在STM32下完成一個(gè)基于FreeRTOS的多任務(wù)程序
如何在STM32下完成一個(gè)基于FreeRTOS的多任務(wù)程序
什么是多任務(wù)系統(tǒng)?FreeRTOS任務(wù)與協(xié)程簡析
介紹一種基于FreeRTOS的STM32多任務(wù)程序
keil下的FreeRtos多任務(wù)程序學(xué)習(xí)
基于消息驅(qū)動(dòng)的多任務(wù)操作機(jī)制
51單片機(jī)多任務(wù)機(jī)制的實(shí)現(xiàn)策略研究

stm32基于FreeRTOS的多任務(wù)程序

基于FreeRTOS的STM32多任務(wù)程序

評論