安富萊電子 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