静态创建和删除任务
将宏ConfigSUPPORT_STATIC_ALLOCATION配置为1。
#define ConfigSUPPORT_STATIC_ALLOCATION 1
实现两个接口函数vApplicationGetIdleTaskMemory()以及vApplicationGetTimerTaskMemory()。即申请分配空闲任务内存以及定时器任务内存(若不使用定时器则无需申请定时器任务内存)。
StaticTask_t idle_task_tcb;
StackType_t idle_task_stack[configMINIMAL_STACK_SIZE];
StaticTask_t timer_task_tcb;
StackType_t timer_task_stack[configTIMER_TASK_STACK_DEPTH];
void vApplicationGetIdleTaskMemory(StaticTask_t** ppxIdleTaskTCBBuffer,
StackType_t** ppxIdleTaskStackBuffer,
uint32_t* pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer = &idle_task_tcb;
*ppxIdleTaskStackBuffer = idle_task_stack;
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
void vApplicationGetTimerTaskMemory(StaticTask_t** ppxTimerTaskTCBBuffer,
StackType_t** ppxTimerTaskStackBuffer,
uint32_t* pulTimerTaskStackSize)
{
*ppxTimerTaskTCBBuffer = &timer_task_tcb;
*ppxTimerTaskStackBuffer = timer_task_stack;
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
创建任务方法。
#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIORITY 1
#define START_TASK1_STACK_SIZE 128
#define START_TASK1_PRIORITY 2
#define START_TASK2_STACK_SIZE 128
#define START_TASK2_PRIORITY 3
#define START_TASK3_STACK_SIZE 128
#define START_TASK3_PRIORITY 4
void start_task(void* pvParameters);
void task1(void* pvParameters);
void task2(void* pvParameters);
void task3(void* pvParameters);
StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb;
StackType_t task1_stack[START_TASK1_STACK_SIZE];
StaticTask_t task1_tcb;
StackType_t task2_stack[START_TASK2_STACK_SIZE];
StaticTask_t task2_tcb;
StackType_t task3_stack[START_TASK3_STACK_SIZE];
StaticTask_t task3_tcb;
TaskHandle_t start_task_handler;
TaskHandle_t task1_handler;
TaskHandle_t task2_handler;
TaskHandle_t task3_handler;
void freertos_demo(void)
{
/*创建任务start_task*/
start_task_handler = xTaskCreate(start_task,
"start_task",
START_TASK_STACK_SIZE,
NULL,
START_TASK_PRIORITY,
start_task_stack,
&start_task_tcb);
/*开启任务调度器*/
vTaskStartScheduler();
}
void start_task(void* pvParameters)
{
/*进入临界区*/
taskENTER_CRITICAL;
/*创建任务task1*/
task1_handler = xTaskCreate(task1,
"task1",
START_TASK1_STACK_SIZE,
NULL,
START_TASK1_PRIORITY,
task1_stack,
&task1_tcb);
/*创建任务task2*/
task2_handler = xTaskCreate(task2,
"task2",
START_TASK2_STACK_SIZE,
NULL,
START_TASK2_PRIORITY,
task2_stack,
&task2_tcb);
/*创建任务task3*/
task3_handler = xTaskCreate(task3,
"task3",
START_TASK3_STACK_SIZE,
NULL,
START_TASK3_PRIORITY,
task3_stack,
&task3_tcb);
/*删除任务 防止start_task多次创建Task1、Task2、Task3使得超出FreeRTOS提供的堆栈大小*/
vTaskDelete(NULL);
//vTaskDelete(start_task_handler);
/*退出临界区*/
taskEXTI_CRITICAL;
}
/*LED0每500ms翻转一次*/
void task1(void* pvParameters)
{
while(1)
{
LED0_TOGGLE();
vTaskDelay(500); //系统延时函数
}
}
/*LED1每500ms翻转一次*/
void task2(void* pvParameters)
{
while(1)
{
LED1_TOGGLE();
vTaskDelay(500); //系统延时函数
}
}
/*判断按键KEY0 按下按键则删除KEY0*/
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);
}
}