一、动态方式创建任务和删除任务
1>测试环境
系统:WIN7
MDK:keil v5.26
开发板:GD32F303C-EVAL
固件库:V1.0.2
FreeRTOS版本:V10.4.0
2>需要满足条件
条件一:需要在FreeRTOS.h或FreeRTOSConfig.h中定义
#define configSUPPORT_DYNAMIC_ALLOCATION 1
条件二:加载头文件时,加载FreeRTOS.h必须在task.h之前,如下:
#include "FreeRTOS.h"
#include "task.h"
否则会出现如下错误
.\FreeRTOS\Source\include\task.h(32): error: #35: #error directive: “include FreeRTOS.h must appear in source files before include task.h”
3>代码如下:
#include "gd32f30x.h"
#include "led.h"
#include "systick.h"
#include <stdio.h>
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#define START_TASK_PRIO ( tskIDLE_PRIORITY + 1 )
#define LED1_TASK_PRIO ( tskIDLE_PRIORITY + 2 )
#define LED2_TASK_PRIO ( tskIDLE_PRIORITY + 3 )
void START_task(void * pvParameters);
void LED1_task(void * pvParameters);
void LED2_task(void * pvParameters);
/*创建START_task任务的句柄,用于删除等操作。*/
TaskHandle_t xHandle = NULL;
int main(void)
{
/* 设置中断分组为4,16个全是抢占优先级*/
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
GW_LedInit(LED1);
GW_LedInit(LED2);
GW_ComInit(GW_COM3);
xTaskCreate(
(TaskFunction_t ) START_task,
(const char* ) "start_task",
(uint16_t ) configMINIMAL_STACK_SIZE,
(void* ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t * ) &xHandle
);
/* start scheduler */
vTaskStartScheduler();
while(1){
}
}
/*开始任务:创建两个任务后删除自身*/
void START_task(void * pvParameters)
{
static uint8_t ucParameterToPass=5;
taskENTER_CRITICAL(); //进入临界区
xTaskCreate(
(TaskFunction_t ) LED1_task,
(const char* ) "LED1_task",
(uint16_t ) configMINIMAL_STACK_SIZE,
(void* ) &ucParameterToPass,
(UBaseType_t ) LED1_TASK_PRIO,
(TaskHandle_t * ) NULL
);
xTaskCreate(
(TaskFunction_t ) LED2_task,
(const char* ) "LED2_task",
(uint16_t ) configMINIMAL_STACK_SIZE,
(void* ) NULL,
(UBaseType_t ) LED2_TASK_PRIO,
(TaskHandle_t * ) NULL
);
configASSERT( xHandle );
if( xHandle != NULL )
{
vTaskDelete( xHandle );
// vTaskDelete( NULL ); //在自身任务中删除任务本身,可以使用NULL代替xHandle
printf("Delete START_task!\r\n");
}
taskEXIT_CRITICAL(); //退出临界区
}
/*任务1:LED1每隔300ms翻转一次,并打印接收的参数的值*/
void LED1_task(void * pvParameters)
{
uint8_t *tmp=NULL;
tmp = (uint8_t *)pvParameters;
for( ;; ){
/* toggle LED2 each 500ms */
printf("LED1_task,value:%d\r\n",*tmp);
GW_LedToggle(LED1);
vTaskDelay(300);
}
}
/*任务2: LED2每隔500ms翻转一次*/
void LED2_task(void * pvParameters)
{
for( ;; ){
/* toggle LED2 each 500ms */
printf("LED2_task\r\n");
GW_LedToggle(LED2);
vTaskDelay(500);
}
}
二、测试结果
工程下载链接:GD32F303_FreeRTOS动态创建任务