#include "freertos_demo.h"
#include "./BSP/KEY/key.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#define STARTTASKSTACKSIZE 128
#define STARTTASKPRIO 1
TaskHandle_t StartTaskHandle;
#define TASK1STACKSIZE 128
#define TASK2STACKSIZE 128
#define TASK3STACKSIZE 128
#define TASK1PRIO 2
#define TASK2PRIO 3
#define TASK3PRIO 4
TaskHandle_t Task1Handle;
TaskHandle_t Task2Handle;
TaskHandle_t Task3Handle;
void Task1Code(void* pvParameters)
{
for (;;)
{
printf("任务1运行中.\n");
LED0_TOGGLE();
vTaskDelay(500);
}
}
void Task2Code(void* pvParameters)
{
for (;;)
{
printf("任务2运行中.\n");
LED1_TOGGLE();
vTaskDelay(500);
}
}
void Task3Code(void* pvParameters)
{
static uint8_t key_num = 0;
for (;;)
{
key_num = key_scan(0);
if (key_num == KEY0_PRES && Task1Handle != NULL)
{
printf("删除task1.\n");
vTaskDelete(Task1Handle);
Task1Handle = NULL;
}
else if (key_num == KEY1_PRES && Task2Handle != NULL)
{
printf("删除task2.\n");
vTaskDelete(Task2Handle);
Task2Handle = NULL;
}else if(key_num == KEY2_PRES && Task2Handle == NULL && Task1Handle == NULL)
{
printf("重新创建任务.\n");
xTaskCreate(Task1Code, "Task1", TASK1STACKSIZE, NULL, TASK1PRIO, &Task1Handle);
xTaskCreate(Task2Code, "Task2", TASK2STACKSIZE, NULL, TASK2PRIO, &Task2Handle);
}
vTaskDelay(10);
}
}
void StartTaskCode(void* pvParameters)
{
xTaskCreate(Task1Code, "Task1", TASK1STACKSIZE, NULL, TASK1PRIO, &Task1Handle);
xTaskCreate(Task2Code, "Task2", TASK2STACKSIZE, NULL, TASK2PRIO, &Task2Handle);
xTaskCreate(Task3Code, "Task3", TASK3STACKSIZE, NULL, TASK3PRIO, &Task3Handle);
vTaskDelete(NULL);
}
void freertos_demo(void)
{
xTaskCreate(StartTaskCode, "StartTask", STARTTASKSTACKSIZE, NULL, STARTTASKPRIO, &StartTaskHandle);
vTaskStartScheduler();
}
学习了任务调度的方法 不是并行 任务阻塞时 低优先级任务执行
动态创建任务 FreeRTOS自己在堆中分配任务栈内存 优先级数字越大优先级越高 需要开启任务调度