一 任务创建和删除
主要调用以下四个函数
- xTaskCreate:动态方式创建,由FreeRTOS分配
- xTaskCreateStatic:静态方式创建,用户分配
- vTaskDelete:删除任务
动态创建任务步骤
- 配置文件中 configSUPPORT_DYNAMIC_ALLOCATION 配置为1
- 配置创建函数参数
- 编写任务函数
静态创建任务流程
- 配置文件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);
}
}