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

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

作者: 闵许可 | 来源:发表于2019-05-21 10:31 被阅读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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/hfqdzqtx.html