FreeRTOS

动态任务创建实战(点灯)

目的:xTaskCreat()和vTaskDelete()使用

将创建start_task、task1、task2、task3四个任务

start_task:用来创建其他三个任务(只执行一次)

task1:led0每500ms闪烁一次

task2:led1每500ms闪烁一次

task3:判断KEY0是否按下,按下删掉task1

freeRTOS部分代码

#define START_TASK_STACK_SIZE  128
#define START_TASK_PRIO        1
TaskHandle_t                   start_task_handler;
/******************************************************************************************************/
/*FreeRTOS配置*/
void start_task(void * pvParameters);
void task1(void * pvParameters);
void task2(void * pvParameters);
void task3(void * pvParameters);

/******************************************************************************************************/
#define TASK1_STACK_SIZE  128
#define TASK1_PRIO        2
TaskHandle_t              task1_handler;

#define TASK2_STACK_SIZE  128
#define TASK2_PRIO        3
TaskHandle_t              task2_handler;

#define TASK3_STACK_SIZE  128
#define TASK3_PRIO        4
TaskHandle_t              task3_handler;
/**
 * @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_handler 
                );
   
    vTaskStartScheduler();
}

void start_task(void * pvParameters)
{
    xTaskCreate( (TaskFunction_t        )       task1,
                 (char *                )      "task1", 
                 (configSTACK_DEPTH_TYPE)       TASK1_STACK_SIZE,
                 (void *                )       NULL,
                 (UBaseType_t           )       TASK1_PRIO,
                 (TaskHandle_t *        )       &task1_handler 
                );
    xTaskCreate( (TaskFunction_t        )       task2,
                        (char *                )      "task2", 
                        (configSTACK_DEPTH_TYPE)       TASK2_STACK_SIZE,
                        (void *                )       NULL,
                        (UBaseType_t           )       TASK2_PRIO,
                        (TaskHandle_t *        )       &task2_handler 
                        );   
    xTaskCreate( (TaskFunction_t        )       task3,
                        (char *                )      "task3", 
                        (configSTACK_DEPTH_TYPE)       TASK3_STACK_SIZE,
                        (void *                )       NULL,
                        (UBaseType_t           )       TASK3_PRIO,
                        (TaskHandle_t *        )       &task3_handler 
                        );       
    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 按下删除task1*/
void task3(void * pvParameters)
{
    uint8_t key=0;
    while(1)
    {
        printf("task3正在运行\r\n");
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            if(task1_handler != NULL)
            {
                printf("删除task1任务\r\n");
                vTaskDelete(task1_handler);
                task1_handler = NULL;
            }      
        }
        vTaskDelay(20); 
    }

}

实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值