安富萊電子 www.armfly.com?
?安富萊_STM32-V5開發板_FreeRTOS教程(V1.0)
任務的創建,刪除,掛起和恢復, 設置任務 vTaskLED 的優先級
/* 打印任務執行情況 */
printf("=================================================\r\n");
printf("任務名? ? ? 任務狀態 優先級? 剩余棧 任務序號\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\n任務名? ? ? 運行計數? ? ? ? 使用率\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
/* 刪除任務vTaskLED */
printf("刪除任務vTaskLED\r\n");
if(xHandleTaskLED != NULL)
{
vTaskDelete(xHandleTaskLED);
xHandleTaskLED = NULL;
}
break;
/* 重新創建任務vTaskLED */
printf("重新創建任務vTaskLED\r\n");
if(xHandleTaskLED == NULL)
{
xTaskCreate(? ? vTaskLED,? ? ? ? ? ? /* 任務函數? */
"vTaskLED",? ? ? ? ? /* 任務名? ? */
512,? ? ? ? ? ? ? ? /* stack大小,單位word,也就是4字節 */
NULL,? ? ? ? ? ? ? ? /* 任務參數? */
2,? ? ? ? ? ? ? ? ? /* 任務優先級*/
&xHandleTaskLED );? /* 任務句柄? */
}
break;
/* 掛起任務vTaskLED */
printf("掛起任務vTaskLED\r\n");
vTaskSuspend(xHandleTaskLED);
break;
/* 恢復任務vTaskLED */
printf("恢復任務vTaskLED\r\n");
vTaskResume(xHandleTaskLED);//中斷服務程序中使用xTaskResumeFromISR()
/* 中斷方式恢復任務vTaskLED */
初始化優先級分組
/* 優先級分組設置為4,可配置0-15級搶占式優先級,0級子優先級,即不存在子優先級。*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
1.初始化階段,添加定時器中斷
bsp_InitHardTimer(); /* 初始化TIM2定時器 */
2.添加中斷回調函數,用于恢復任務
/*
*********************************************************************************************************
* 函 數 名: TIM_CallBack1
* 功能說明: 定時器中斷的回調函數,此函數被bsp_StartHardTimer所調用。 ? ?
* 形? ? 參: 無
* 返 回 值: 無
*********************************************************************************************************
*/
static void TIM_CallBack1(void)
{
BaseType_t xYieldRequired;
? ? /* 恢復掛起任務 */
? ? xYieldRequired = xTaskResumeFromISR(xHandleTaskLED);
/* 退出中斷后是否需要執行任務切換 */
? ? if( xYieldRequired == pdTRUE )
? ? {
? ? ? ? portYIELD_FROM_ISR(xYieldRequired);
? ? }
}
/*
*********************************************************************************************************
* 函 數 名: vTaskLED
* 功能說明: LED閃爍
* 形? ? 參: pvParameters 是在創建該任務時傳遞的形參
* 返 回 值: 無
*? 優 先 級: 2?
*********************************************************************************************************
*/
static void vTaskLED(void *pvParameters)
{
? ? while(1)
? ? {
? ? ? ? bsp_LedToggle(2);
? ? ? ? vTaskDelay(200);
? ? }
}
中 斷 優 先 級 和 任 務 優 先 級
中斷的優先級永遠高于任何任務的優先級,即任務在執行的過程中,中斷來了就開始執行中
斷服務程序。
另外對于 STM32F103,F407 和 F429 來說,中斷優先級的數值越小,優先級越高。而 FreeRTOS
的任務優先級是,任務優先級數值越小,任務優先級越低。
/*設置任務 vTaskLED 的優先級*/
printf("設置任務 vTaskLED 的優先級為 1\r\n");
vTaskPrioritySet( xHandleTaskLED, 1);
printf("任務 vTaskLED 的優先級已經設置為:%d\r\n",(int)uxTaskPriorityGet(xHandleTaskLED));
使用vTaskPrioritySet()函數需要在 FreeRTOSConfig.h 配置文件中配置如下宏定義為 1
#define INCLUDE_vTaskPrioritySet 1