FreeRTOS任务创建和删除(动态方式)

任务的创建和删除本质就是调用FreeRTOS的API函数

一、任务创建和删除(动态方法)

实验设计:将设计四个任务:start_task、task1、task2、task3

1、将FreeRTOS.c文件下的代码清空仅保留如下代码即可

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"

/******************************************************************************************************/
/*FreeRTOS配置*/

/******************************************************************************************************/


/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    vTaskStartScheduler();
}

2、利用临界区可以保护那些不想被打断的程序段

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();//进入临界区
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",//任务名字
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   TASK1_PRIO,//任务优先级
                (TaskHandle_t *         )   &task1_hander);//任务句柄
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",//任务名字
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   TASK3_PRIO,//任务优先级
                (TaskHandle_t *         )   &task2_hander);//任务句柄

    xTaskCreate((TaskFunction_t         )   task3,
                (char *                 )   "task3",//任务名字
                (configSTACK_DEPTH_TYPE )   TASK3_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   TASK3_PRIO,//任务优先级
                (TaskHandle_t *         )   &task3_hander);//任务句柄
                
    vTaskDelete(NULL);//删除开始任务
    taskEXIT_CRITICAL();//退出临界区
}

3、最终代码

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"

/******************************************************************************************************/
/*FreeRTOS配置*/
/* START_TASK 任务配置 */
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t start_task_hander;
void start_task( void * pvParameters );

/* TASK1 任务配置 */
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t task1_hander;
void task1( void * pvParameters );

/* TASK2 任务配置 */
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t task2_hander;
void task2( void * pvParameters );

/* TASK3 任务配置 */
#define TASK3_PRIO         4
#define TASK3_STACK_SIZE   128
TaskHandle_t task3_hander;
void task3( void * pvParameters );



/******************************************************************************************************/


/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    
    xTaskCreate((TaskFunction_t         )   start_task,
                (char *                 )   "start_task",//任务名字
                (configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   START_TASK_PRIO,//任务优先级
                (TaskHandle_t *         )   &start_task_hander);//任务句柄

    vTaskStartScheduler();//开启任务调度器
}

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();//进入临界区
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",//任务名字
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   TASK1_PRIO,//任务优先级
                (TaskHandle_t *         )   &task1_hander);//任务句柄
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",//任务名字
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   TASK2_PRIO,//任务优先级
                (TaskHandle_t *         )   &task2_hander);//任务句柄

    xTaskCreate((TaskFunction_t         )   task3,
                (char *                 )   "task3",//任务名字
                (configSTACK_DEPTH_TYPE )   TASK3_STACK_SIZE,//堆栈大小
                (void *                 )   NULL,//入口参数
                (UBaseType_t            )   TASK3_PRIO,//任务优先级
                (TaskHandle_t *         )   &task3_hander);//任务句柄
                
    vTaskDelete(NULL);//删除开始任务
    taskEXIT_CRITICAL();//退出临界区
}

/* 任务一:LED0每500ms翻转一次 */
void task1( void * pvParameters )
{
    while(1)
    {
        printf("task1正在运行!!!\r\n");
        LED0_TOGGLE();
        vTaskDelay(500);
    }
}

/* 任务二:LED1每500ms翻转一次 */
void task2( void * pvParameters )
{
    while(1)
    {
        printf("task2正在运行!!!\r\n");
        LED1_TOGGLE();
        vTaskDelay(500);
    }
}

/* 任务三:判断按键KEY0按下,按下KEY0删除task1 */
void task3( void * pvParameters )
{
    uint8_t key = 0;
    while(1)
    {
        key = key_scan(0);
        printf("task3正在运行!!!\r\n");
        if (key == KEY0_PRES)
        {
            if (task1_hander != NULL)
            {
                printf("删除task1任务\r\n");
                vTaskDelete(task1_hander);
                task1_hander = NULL;
            }
        }
        vTaskDelay(500);
    }
}
    


  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值