freeRTOS创建任务和删除任务实验,静态方法与动态方法

任务创建与删除(动态方法)

实验设计内容:设计四个任务:start_task、task1、task2、task3

四个任务功能如下

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

task1:实现LED0每500ms闪烁一次

task2:实现LED1每500ms闪烁一次

task3:判断按键key0是否按下,按下则删除task1

创建任务

#define configSUPPORT_DYNAMIC_ALLOCATION                1                       /* 1: 支持动态申请内存, 默认: 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"

/******************************************************************************************************/
/*FreeRTOS配置*/

/* 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 );
/******************************************************************************************************/

/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{
		xTaskCreate( (TaskFunction_t				)		start_task,
                 (char * 								)		"start_task", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                 (configSTACK_DEPTH_TYPE) 	START_TASK_STACK_SIZE,
                 (void * 								) 	NULL,
                 (UBaseType_t						)		START_TASK_PRIO,
                 (TaskHandle_t * 				) 	&start_task_handler );
    
    vTaskStartScheduler();
}
 // Task to be created.
 void start_task( void * pvParameters )
 {
	  taskENTER_CRITICAL();
		xTaskCreate( (TaskFunction_t				)		task1,
                 (char * 								)		"task1", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                 (configSTACK_DEPTH_TYPE) 	TASK1_STACK_SIZE,
                 (void * 								) 	NULL,
                 (UBaseType_t						)		TASK1_PRIO,
                 (TaskHandle_t * 				) 	&task1_handler );
								 
		xTaskCreate( (TaskFunction_t				)		task2,
                 (char * 								)		"task2", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                 (configSTACK_DEPTH_TYPE) 	TASK2_STACK_SIZE,
                 (void * 								) 	NULL,
                 (UBaseType_t						)		TASK2_PRIO,
                 (TaskHandle_t * 				) 	&task2_handler );
								 
		xTaskCreate( (TaskFunction_t				)		task3,
                 (char * 								)		"task3", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                 (configSTACK_DEPTH_TYPE) 	TASK3_STACK_SIZE,
                 (void * 								) 	NULL,
                 (UBaseType_t						)		TASK3_PRIO,
                 (TaskHandle_t * 				) 	&task3_handler );
		vTaskDelete(NULL);
		taskEXIT_CRITICAL();
 }
//实现LED0 每500ms翻转一次
void task1( void * pvParameters )
 {
	 while(1)
	 {
		 printf ("task1正在运行!!!\r\n");
		 LED0_TOGGLE();
		 vTaskDelay(500);
	 }
 }
//实现LED1 每500ms翻转一次
void task2( void * pvParameters )
 {
	 while(1)
	 {
		 printf ("task2正在运行!!!\r\n");
		 LED1_TOGGLE();
		 vTaskDelay(500);
	 }
 }
 //判断按键key0是否按下,按下则删除task1
void task3( void * pvParameters )
 {
	 uint8_t key = 0;
	 while(1)
	 {
			printf ("task3正在运行!!!\r\n");
			key = key_scan(0);
			if(key == KEY1_PRES)
			{
				if(task1_handler !=NULL)
				{
						printf ("删除task1\r\n");
						vTaskDelete(task1_handler);
						task1_handler = NULL;
				}
					
			}
			vTaskDelay(10);
	 }
 }
 
 
 

任务创建与删除(静态方法) 

实验设计内容:设计四个任务:start_task、task1、task2、task3

四个任务功能如下

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

task1:实现LED0每500ms闪烁一次

task2:实现LED1每500ms闪烁一次

task3:判断按键key0是否按下,按下则删除task1

创建任务

#define configSUPPORT_STATIC_ALLOCATION                 1                       /* 1: 支持静态申请内存, 默认: 0 */


#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"

/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO 	1
#define START_TASK_STACK_SIZE 128
TaskHandle_t	start_task_handler;
StackType_t 	start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb;
void start_task( void * pvParameters );
/******************************************************************************************************/

/* task1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO 	2
#define TASK1_STACK_SIZE 128
TaskHandle_t	task1_handler;
StackType_t 	task1_stack[TASK1_STACK_SIZE];
StaticTask_t 	task1_tcb;
void task1( void * pvParameters );
/******************************************************************************************************/
/* task2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO 	3
#define TASK2_STACK_SIZE 128
TaskHandle_t	task2_handler;
StackType_t 	task2_stack[TASK2_STACK_SIZE];
StaticTask_t 	task2_tcb;
void task2( void * pvParameters );
/******************************************************************************************************/
/* task3 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK3_PRIO 	4
#define TASK3_STACK_SIZE 128
TaskHandle_t	task3_handler;
StackType_t 	task3_stack[TASK3_STACK_SIZE];
StaticTask_t 	task3_tcb;
void task3( void * pvParameters );
/******************************************************************************************************/
//空闲任务配置
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 )/*lint !e526 Symbol not defined as it is an application callback. */
{
		*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;
	 
 }

/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{
		start_task_handler = xTaskCreateStatic(  (TaskFunction_t		) start_task,
																						 (char *  					) "start_task", 
																						 (uint32_t					) TASK3_STACK_SIZE,
																						 (void * 						) NULL,
																						 (UBaseType_t				) START_TASK_PRIO,
																						 (StackType_t *			) start_task_stack,
																						 (StaticTask_t *		) &start_task_tcb );
	
    
    vTaskStartScheduler();
}
 // Task to be created.
 void start_task( void * pvParameters )
 {
	  taskENTER_CRITICAL();
	task1_handler = xTaskCreateStatic( (TaskFunction_t		) task1,
																			 (char *  					) "task1", 
																			 (uint32_t					) TASK1_STACK_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_STACK_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_STACK_SIZE,
																			 (void * 						) NULL,
																			 (UBaseType_t				) TASK3_PRIO,
																			 (StackType_t *			) task3_stack,
																			 (StaticTask_t *		) &task3_tcb );
		vTaskDelete(start_task_handler);
		taskEXIT_CRITICAL();
 }
//实现LED0 每500ms翻转一次
void task1( void * pvParameters )
 {
	 while(1)
	 {
		 printf ("task1正在运行!!!\r\n");
		 LED0_TOGGLE();
		 vTaskDelay(500);
	 }
 }
//实现LED1 每500ms翻转一次
void task2( void * pvParameters )
 {
	 while(1)
	 {
		 printf ("task2正在运行!!!\r\n");
		 LED1_TOGGLE();
		 vTaskDelay(500);
	 }
 }
 //判断按键key0是否按下,按下则删除task1
void task3( void * pvParameters )
 {
	 uint8_t key = 0;
	 while(1)
	 {
			printf ("task3正在运行!!!\r\n");
			key = key_scan(0);
			if(key == KEY1_PRES)
			{
				if(task1_handler !=NULL)
				{
						printf ("删除task1\r\n");
						vTaskDelete(task1_handler);
						task1_handler = NULL;
				}
					
			}
			vTaskDelay(10);
	 }
 }
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值