FreeRTOS笔记(四)任务基本操作

一 任务创建和删除

主要调用以下四个函数

动态创建任务步骤

静态创建任务流程

  • 配置文件configSUPPORT_STATIC_ALLOCATION 设置为 1
  • 定义空闲任务和定时器任务的任务堆栈及任务控制块(TCB)
  • 实现接口函数:vApplicationGetldleTaskMemory,vApplicationGetTimerTaskMemory
  • 定义函数参数
  • 编写任务函数

二 动态创建实验

创建四个任务

  • start_task:创建其他三个任务
  • task1:LED0每500ms闪烁
  • task2:LKED1每500ms闪烁
  • task3:KEY0按下删除任务1
#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"

/******************************************************************************************************/
/*start_task*/
#define START_TASK_PRIO 1
#define START_TASK_SIZE 128
TaskHandle_t start_task_handler;
void start_task(void *pvParameters);

/*task1*/
#define TASK1_PRIO 2
#define TASK1_SIZE 128
TaskHandle_t task1_handler;
void task1(void *pvParameters);

/*task2*/
#define TASK2_PRIO 3
#define TASK2_SIZE 128
TaskHandle_t task2_handler;
void task2(void *pvParameters);

/*task3*/
#define TASK3_PRIO 4
#define TASK3_SIZE 128
TaskHandle_t task3_handler;
void task3(void *pvParameters);

void freertos_demo(void)
{
    xTaskCreate((TaskFunction_t)start_task,
                (const char *)"start_task",
                (configSTACK_DEPTH_TYPE)START_TASK_SIZE,
                (void *)NULL,
                (UBaseType_t)START_TASK_PRIO,
                (TaskHandle_t *)&start_task_handler);
    vTaskStartScheduler();
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();
    xTaskCreate((TaskFunction_t)task1,
                (const char *)"task1",
                (configSTACK_DEPTH_TYPE)TASK1_SIZE,
                (void *)NULL,
                (UBaseType_t)TASK1_PRIO,
                (TaskHandle_t *)&task1_handler);
    xTaskCreate((TaskFunction_t)task2,
                (const char *)"task2",
                (configSTACK_DEPTH_TYPE)TASK2_SIZE,
                (void *)NULL,
                (UBaseType_t)TASK2_PRIO,
                (TaskHandle_t *)&task2_handler);
    xTaskCreate((TaskFunction_t)task3,
                (const char *)"task3",
                (configSTACK_DEPTH_TYPE)TASK3_SIZE,
                (void *)NULL,
                (UBaseType_t)TASK3_PRIO,
                (TaskHandle_t *)&task3_handler);
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();
}
void task1(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN);
        vTaskDelay(500);
    }
}
void task2(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN);
        vTaskDelay(500);
    }
}
void task3(void *pvParameters)
{
    uint8_t key = 0;
    while (1)
    {
        key = key_scan(0);
        if (key == KEY0_PRES)
        {
            if (task1_handler != NULL)
            {
                vTaskDelete(task1_handler);
                task1_handler = NULL;
            }
        }
        vTaskDelay(10);
    }
}

三 静态创建实验

创建四个任务

  • start_task:创建其他三个任务
  • task1:LED0每500ms闪烁
  • task2:LKED1每500ms闪烁
  • task3:KEY0按下删除任务1
#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"

/******************************************************************************************************/
/*start_task*/
#define START_TASK_PRIO 1
#define START_TASK_SIZE 128
TaskHandle_t start_task_handler;
StackType_t start_task_stack[START_TASK_SIZE];
StaticTask_t start_task_tcb;
void start_task(void *pvParameters);

/*task1*/
#define TASK1_PRIO 2
#define TASK1_SIZE 128
TaskHandle_t task1_handler;
StackType_t task1_stack[TASK1_SIZE];
StaticTask_t task1_tcb;
void task1(void *pvParameters);

/*task2*/
#define TASK2_PRIO 3
#define TASK2_SIZE 128
TaskHandle_t task2_handler;
StackType_t task2_stack[TASK2_SIZE];
StaticTask_t task2_tcb;
void task2(void *pvParameters);

/*task3*/
#define TASK3_PRIO 4
#define TASK3_SIZE 128
TaskHandle_t task3_handler;
StackType_t task3_stack[TASK3_SIZE];
StaticTask_t task3_tcb;
void task3(void *pvParameters);

StaticTask_t idl_task_tcb;
StackType_t idl_task_stack[configMINIMAL_STACK_SIZE];
/*空闲任务内存分配*/
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
                                   StackType_t **ppxIdleTaskStackBuffer,
                                   uint32_t *pulIdleTaskStackSize)
{
    *ppxIdleTaskTCBBuffer = &idl_task_tcb;
    *ppxIdleTaskStackBuffer = idl_task_stack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

StaticTask_t timer_task_tcb;
StackType_t timer_task_stack[configTIMER_TASK_STACK_DEPTH];
/*软件定时器内存分配*/
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
                                    StackType_t **ppxTimerTaskStackBuffer,
                                    uint32_t *pulTimerTaskStackSize)
{
    *ppxTimerTaskTCBBuffer = &timer_task_tcb;
    *ppxTimerTaskStackBuffer = timer_task_stack;
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
void freertos_demo(void)
{
    start_task_handler = xTaskCreateStatic((TaskFunction_t)start_task,
                                           (char *)"start_task",
                                           (uint32_t)START_TASK_SIZE,
                                           (void *)NULL,
                                           (UBaseType_t)START_TASK_PRIO,
                                           (StackType_t *)start_task_stack,
                                           (StaticTask_t *)&start_task_tcb);
    vTaskStartScheduler();
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();
    task1_handler = xTaskCreateStatic((TaskFunction_t)task1,
                                      (char *)"task1",
                                      (uint32_t)TASK1_SIZE,
                                      (void *)NULL,
                                      (UBaseType_t)TASK1_PRIO,
                                      (StackType_t *)task1_stack,
                                      (StaticTask_t *)&task1_tcb);
    task2_handler = xTaskCreateStatic((TaskFunction_t)task2,
                                      (char *)"task2",
                                      (uint32_t)TASK2_SIZE,
                                      (void *)NULL,
                                      (UBaseType_t)TASK2_PRIO,
                                      (StackType_t *)task2_stack,
                                      (StaticTask_t *)&task2_tcb);
    task3_handler = xTaskCreateStatic((TaskFunction_t)task3,
                                      (char *)"task3",
                                      (uint32_t)TASK3_SIZE,
                                      (void *)NULL,
                                      (UBaseType_t)TASK3_PRIO,
                                      (StackType_t *)task3_stack,
                                      (StaticTask_t *)&task3_tcb);
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();
}
void task1(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN);
        vTaskDelay(500);
    }
}
void task2(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN);
        vTaskDelay(500);
    }
}
void task3(void *pvParameters)
{
    uint8_t key = 0;
    while (1)
    {
        key = key_scan(0);
        if (key == KEY0_PRES)
        {
            if (task1_handler != NULL)
            {
                vTaskDelete(task1_handler);
                task1_handler = NULL;
            }
        }
        vTaskDelay(10);
    }
}

四 任务挂起和恢复

挂起:及暂停任务

恢复:重新开始任务

主要涉及三个函数

  • vTaskSuspend:挂起任务
  • vTaskResume:恢复挂起任务
  • xTimerResertFromISR:中断中恢复挂起任务

五 任务挂起和恢复实验

  • start_task:创建其他三个任务
  • task1:LED0每500ms闪烁
  • task2:LKED1每500ms闪烁
  • task3:KEY0按下挂起任务1,KEY1按下在任务中恢复任务1,KEY2在中断中恢复任务1
#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"

/******************************************************************************************************/
/*start_task*/
#define START_TASK_PRIO 1
#define START_TASK_SIZE 128
TaskHandle_t start_task_handler;
StackType_t start_task_stack[START_TASK_SIZE];
StaticTask_t start_task_tcb;
void start_task(void *pvParameters);

/*task1*/
#define TASK1_PRIO 2
#define TASK1_SIZE 128
TaskHandle_t task1_handler;
StackType_t task1_stack[TASK1_SIZE];
StaticTask_t task1_tcb;
void task1(void *pvParameters);

/*task2*/
#define TASK2_PRIO 3
#define TASK2_SIZE 128
TaskHandle_t task2_handler;
StackType_t task2_stack[TASK2_SIZE];
StaticTask_t task2_tcb;
void task2(void *pvParameters);

/*task3*/
#define TASK3_PRIO 4
#define TASK3_SIZE 128
TaskHandle_t task3_handler;
StackType_t task3_stack[TASK3_SIZE];
StaticTask_t task3_tcb;
void task3(void *pvParameters);

StaticTask_t idl_task_tcb;
StackType_t idl_task_stack[configMINIMAL_STACK_SIZE];
/*空闲任务内存分配*/
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
                                   StackType_t **ppxIdleTaskStackBuffer,
                                   uint32_t *pulIdleTaskStackSize)
{
    *ppxIdleTaskTCBBuffer = &idl_task_tcb;
    *ppxIdleTaskStackBuffer = idl_task_stack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

StaticTask_t timer_task_tcb;
StackType_t timer_task_stack[configTIMER_TASK_STACK_DEPTH];
/*软件定时器内存分配*/
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
                                    StackType_t **ppxTimerTaskStackBuffer,
                                    uint32_t *pulTimerTaskStackSize)
{
    *ppxTimerTaskTCBBuffer = &timer_task_tcb;
    *ppxTimerTaskStackBuffer = timer_task_stack;
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
void freertos_demo(void)
{
    start_task_handler = xTaskCreateStatic((TaskFunction_t)start_task,
                                           (char *)"start_task",
                                           (uint32_t)START_TASK_SIZE,
                                           (void *)NULL,
                                           (UBaseType_t)START_TASK_PRIO,
                                           (StackType_t *)start_task_stack,
                                           (StaticTask_t *)&start_task_tcb);
    vTaskStartScheduler();
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();
    task1_handler = xTaskCreateStatic((TaskFunction_t)task1,
                                      (char *)"task1",
                                      (uint32_t)TASK1_SIZE,
                                      (void *)NULL,
                                      (UBaseType_t)TASK1_PRIO,
                                      (StackType_t *)task1_stack,
                                      (StaticTask_t *)&task1_tcb);
    task2_handler = xTaskCreateStatic((TaskFunction_t)task2,
                                      (char *)"task2",
                                      (uint32_t)TASK2_SIZE,
                                      (void *)NULL,
                                      (UBaseType_t)TASK2_PRIO,
                                      (StackType_t *)task2_stack,
                                      (StaticTask_t *)&task2_tcb);
    task3_handler = xTaskCreateStatic((TaskFunction_t)task3,
                                      (char *)"task3",
                                      (uint32_t)TASK3_SIZE,
                                      (void *)NULL,
                                      (UBaseType_t)TASK3_PRIO,
                                      (StackType_t *)task3_stack,
                                      (StaticTask_t *)&task3_tcb);
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();
}
void task1(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN);
        vTaskDelay(500);
    }
}
void task2(void *pvParameters)
{
    while (1)
    {
        HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN);
        vTaskDelay(500);
    }
}
void task3(void *pvParameters)
{
    uint8_t key = 0;
    while (1)
    {
        key = key_scan(0);
        if (key == KEY0_PRES) 
        {
            vTaskSuspend(task1_handler);
        }
        else if (key == KEY1_PRES)
        {
            vTaskResume(task1_handler);
        }
        vTaskDelay(10);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值