FreeRTOS任务创建和删除(动态)

  1. 实验目的:学会xTaskCreate()和vTaskDelete()的使用
  2. 实验设计:将设计四个任务:start_task、task1、task2、task3

四个任务功能如下:

start_task        用来创建其他的三个任务

task1               实现LED0每500ms闪烁一次

task2               实现LED1每500ms闪烁一次

task3               判断按键KEY0是否按下,按下则删掉task1

基于移植好的框架

FreeRTOS框架(STM32标准库)https://gitee.com/fei-c-language/free-rtos/tree/master/FreeRTOS%E7%A7%BB%E6%A4%8D%E6%A1%86%E6%9E%B6(STM32%E6%A0%87%E5%87%86%E5%BA%93)

第一步

将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1

第二步

定义函数入口参数

根据官网例程https://freertos.org/

 BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
                         const char * const pcName,
                         const configSTACK_DEPTH_TYPE uxStackDepth,
                         void *pvParameters,
                         UBaseType_t uxPriority,
                         TaskHandle_t *pxCreatedTask
                       );

Example usage:

/* Task to be created. */
void vTaskCode( void * pvParameters )
{
    /* The parameter value is expected to be 1 as 1 is passed in the
       pvParameters value in the call to xTaskCreate() below. */

    configASSERT( ( ( uint32_t ) pvParameters ) == 1 );

    for( ;; )
    {
        /* Task code goes here. */
    }
}

/* Function that creates a task. */
void vOtherFunction( void )
{
    BaseType_t xReturned;
    TaskHandle_t xHandle = NULL;

    /* Create the task, storing the handle. */
    xReturned = xTaskCreate(
                    vTaskCode,       /* Function that implements the task. */
                    "NAME",          /* Text name for the task. */
                    STACK_SIZE,      /* Stack size in words, not bytes. */
                    ( void * ) 1,    /* Parameter passed into the task. */
                    tskIDLE_PRIORITY,/* Priority at which the task is created. */
                    &xHandle );      /* Used to pass out the created task's handle. */

    if( xReturned == pdPASS )
    {
        /* The task was created. Use the task's handle to delete the task. */
        vTaskDelete( xHandle );
    }
}
  • 创建动态任务函数
/**
*@brief		FreeRTOS例程入口函数
*@param		无
*@retval	无
*/
void freertos_demo(void)
{
	xTaskCreate((TaskFunction_t			) 	start_task,				//开始任务函数
				(char*					)	"start_task",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	START_TASK_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	START_TASK_PRIO,		//任务优先级
				(TaskHandle_t*			)	&start_task_handler		//任务句柄
               );

	vTaskStartScheduler();//开启任务调度器
}
  • 创建开始任务
/* 开始任务函数-用来创建其他的三个任务*/
void start_task( void * pvParameters)
{
    taskENTER_CRITICAL();/*进入临界区--关闭中断,任务切换就不会进行*/
	/*创建任务1*/
	xTaskCreate((TaskFunction_t			) 	task1,				//开始任务函数
				(char*					)	"task1",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	TASK1_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	TASK1_PRIO,		//任务优先级
				(TaskHandle_t*			)	&task1_handler		//任务句柄
               );
				
	/*创建任务2*/
	xTaskCreate((TaskFunction_t			) 	task2,				//开始任务函数
				(char*					)	"task2",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	TASK2_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	TASK2_PRIO,		//任务优先级
				(TaskHandle_t*			)	&task2_handler		//任务句柄
               );
				
	/*创建任务3*/
	xTaskCreate((TaskFunction_t			) 	task3,				//开始任务函数
				(char*					)	"task3",			//开始任务函数名称
				(configSTACK_DEPTH_TYPE	) 	TASK3_STACK_SIZE,	//堆栈大小-字
				(void*					)	NULL,					//传递的任务函数参数
				(UBaseType_t			) 	TASK3_PRIO,		//任务优先级
				(TaskHandle_t*			)	&task3_handler		//任务句柄
               );
	vTaskDelete(NULL);//使用完删除任务
	taskEXIT_CRITICAL();/*退出临界区--开始任务切换-开启任务调度-限制性任务优先级最高的任务*/

}
  • 每个任务函数的参数宏定义,函数声明
/*START_TASK 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO			1
#define START_TASK_STACK_SIZE	128
TaskHandle_t start_task_handler;
void start_task( void * pvParameters);
/*task1 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO			2
#define TASK1_STACK_SIZE	128
TaskHandle_t task1_handler;
void task1( void * pvParameters);
/*task2 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO			3
#define TASK2_STACK_SIZE	128
TaskHandle_t task2_handler;
void task2( void * pvParameters);
/*task3 任务 配置
*包括:任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK3_PRIO			4
#define TASK3_STACK_SIZE	128
TaskHandle_t task3_handler;
void task3( void * pvParameters);
/********************************************************************/

定义在创建函数的上部

移植成品

FreeRTOS动态创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值