FreeRTOS操作系统例程:任务的创建,删除,挂起和恢复

2019-05-21  本文已影响0人  闵许可

安富莱电子 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

上一篇下一篇

猜你喜欢

热点阅读