FreeRTOS操作系統例程:任務的創建,刪除,掛起和恢復

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容