FreeRTOS操作系統(tǒng)例程:任務(wù)的創(chuàng)建,刪除,掛起和恢復(fù)

安富萊電子 www.armfly.com?

?安富萊_STM32-V5開(kāi)發(fā)板_FreeRTOS教程(V1.0)


任務(wù)的創(chuàng)建,刪除,掛起和恢復(fù), 設(shè)置任務(wù) vTaskLED 的優(yōu)先級(jí)

/* 打印任務(wù)執(zhí)行情況 */

printf("=================================================\r\n");

printf("任務(wù)名? ? ? 任務(wù)狀態(tài) 優(yōu)先級(jí)? 剩余棧 任務(wù)序號(hào)\r\n");

vTaskList((char *)&pcWriteBuffer);

printf("%s\r\n", pcWriteBuffer);

printf("\r\n任務(wù)名? ? ? 運(yùn)行計(jì)數(shù)? ? ? ? 使用率\r\n");

vTaskGetRunTimeStats((char *)&pcWriteBuffer);

printf("%s\r\n", pcWriteBuffer);

/* 刪除任務(wù)vTaskLED */


printf("刪除任務(wù)vTaskLED\r\n");

if(xHandleTaskLED != NULL)

{

vTaskDelete(xHandleTaskLED);

xHandleTaskLED = NULL;

}

break;

/* 重新創(chuàng)建任務(wù)vTaskLED */


printf("重新創(chuàng)建任務(wù)vTaskLED\r\n");

if(xHandleTaskLED == NULL)

{

xTaskCreate(? ? vTaskLED,? ? ? ? ? ? /* 任務(wù)函數(shù)? */

"vTaskLED",? ? ? ? ? /* 任務(wù)名? ? */

512,? ? ? ? ? ? ? ? /* stack大小,單位word,也就是4字節(jié) */

NULL,? ? ? ? ? ? ? ? /* 任務(wù)參數(shù)? */

2,? ? ? ? ? ? ? ? ? /* 任務(wù)優(yōu)先級(jí)*/

&xHandleTaskLED );? /* 任務(wù)句柄? */

}

break;

/* 掛起任務(wù)vTaskLED */


printf("掛起任務(wù)vTaskLED\r\n");

vTaskSuspend(xHandleTaskLED);

break;

/* 恢復(fù)任務(wù)vTaskLED */


printf("恢復(fù)任務(wù)vTaskLED\r\n");

vTaskResume(xHandleTaskLED);//中斷服務(wù)程序中使用xTaskResumeFromISR()


/* 中斷方式恢復(fù)任務(wù)vTaskLED */

初始化優(yōu)先級(jí)分組

/* 優(yōu)先級(jí)分組設(shè)置為4,可配置0-15級(jí)搶占式優(yōu)先級(jí),0級(jí)子優(yōu)先級(jí),即不存在子優(yōu)先級(jí)。*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

1.初始化階段,添加定時(shí)器中斷

bsp_InitHardTimer(); /* 初始化TIM2定時(shí)器 */

2.添加中斷回調(diào)函數(shù),用于恢復(fù)任務(wù)

/*

*********************************************************************************************************

* 函 數(shù) 名: TIM_CallBack1

* 功能說(shuō)明: 定時(shí)器中斷的回調(diào)函數(shù),此函數(shù)被bsp_StartHardTimer所調(diào)用。 ? ?

* 形? ? 參: 無(wú)

* 返 回 值: 無(wú)

*********************************************************************************************************

*/

static void TIM_CallBack1(void)

{

BaseType_t xYieldRequired;

? ? /* 恢復(fù)掛起任務(wù) */

? ? xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);

/* 退出中斷后是否需要執(zhí)行任務(wù)切換 */

? ? if( xYieldRequired == pdTRUE )

? ? {

? ? ? ? portYIELD_FROM_ISR(xYieldRequired);

? ? }

}

/*

*********************************************************************************************************

* 函 數(shù) 名: vTaskLED

* 功能說(shuō)明: LED閃爍

* 形? ? 參: pvParameters 是在創(chuàng)建該任務(wù)時(shí)傳遞的形參

* 返 回 值: 無(wú)

*? 優(yōu) 先 級(jí): 2?

*********************************************************************************************************

*/

static void vTaskLED(void *pvParameters)

{

? ? while(1)

? ? {

? ? ? ? bsp_LedToggle(2);

? ? ? ? vTaskDelay(200);

? ? }

}

中 斷 優(yōu) 先 級(jí) 和 任 務(wù) 優(yōu) 先 級(jí)

中斷的優(yōu)先級(jí)永遠(yuǎn)高于任何任務(wù)的優(yōu)先級(jí),即任務(wù)在執(zhí)行的過(guò)程中,中斷來(lái)了就開(kāi)始執(zhí)行中

斷服務(wù)程序。

另外對(duì)于 STM32F103,F(xiàn)407 和 F429 來(lái)說(shuō),中斷優(yōu)先級(jí)的數(shù)值越小,優(yōu)先級(jí)越高。而 FreeRTOS

的任務(wù)優(yōu)先級(jí)是,任務(wù)優(yōu)先級(jí)數(shù)值越小,任務(wù)優(yōu)先級(jí)越低。

/*設(shè)置任務(wù) vTaskLED 的優(yōu)先級(jí)*/

printf("設(shè)置任務(wù) vTaskLED 的優(yōu)先級(jí)為 1\r\n");

vTaskPrioritySet( xHandleTaskLED, 1);

printf("任務(wù) vTaskLED 的優(yōu)先級(jí)已經(jīng)設(shè)置為:%d\r\n",(int)uxTaskPriorityGet(xHandleTaskLED));

使用vTaskPrioritySet()函數(shù)需要在 FreeRTOSConfig.h 配置文件中配置如下宏定義為 1

#define INCLUDE_vTaskPrioritySet 1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容