03_FreeRTOS的任務建立和刪除

爱吃冰激凌的黄某某發表於2024-03-21

FreeRTOS的任務建立和刪除

任務建立和刪除的API函式

image-20240319192111433

動態建立任務函式

image-20240319192133850

實現動態建立任務流程

image-20240319192220625

任務控制塊結構體成員介紹

image-20240319192236005

靜態建立任務函式

image-20240319192247749

靜態建立任務使用流程

image-20240319192302795

任務刪除函式

image-20240319192313865

刪除任務流程

image-20240319192327661

任務建立和刪除(動態方法)

image-20240319192345633

image-20240319192351749

程式碼

freertos_demo.c

/**
 ****************************************************************************************************
 * @file        freertos.c
 * @author      正點原子團隊(ALIENTEK)
 * @version     V1.4
 * @date        2022-01-04
 * @brief       FreeRTOS 移植實驗
 * @license     Copyright (c) 2020-2032, 廣州市星翼電子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 實驗平臺:正點原子 探索者F407開發板
 * 線上影片:www.yuanzige.com
 * 技術論壇:www.openedv.com
 * 公司網址:www.alientek.com
 * 購買地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#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_STACK_SIZE 	128
 #define START_TASK_PRIO		1
 TaskHandle_t start_task_handler;
 
 #define TASK1_STACK_SIZE 	128
 #define TASK1_PRIO		2
 TaskHandle_t task1_handler;
 
 #define TASK2_STACK_SIZE 	128
 #define TASK2_PRIO		3
 TaskHandle_t task2_handler;
 
  #define TASK3_STACK_SIZE 	128
 #define TASK3_PRIO		4
 TaskHandle_t task3_handler;
void start_task( void * pvParameters );

void task1( void * pvParameters )
{
	while(1)
	{
		printf("task1正在執行!!!\r\n");
		LED0_TOGGLE();
		vTaskDelay(500);
	}
}

void task2( void * pvParameters )
{
	while(1)
	{
		printf("task2正在執行!!!\r\n");
		LED1_TOGGLE();
		vTaskDelay(500);
	}
}

void task3( void * pvParameters )
{
	uint8_t key = 0;
	while(1)
	{
		printf("task3正在執行!!!\r\n");
		key=key_scan(0);
		if(key == KEY0_PRES)
		{
			if(task1_handler!=NULL)
			{
				printf("刪除task1任務!!!\r\n");
				vTaskDelete(task1_handler);
				task1_handler=NULL;
			}
		}
		vTaskDelay(10);
	}
}
/******************************************************************************************************/

/**
 * @brief       FreeRTOS例程入口函式
 * @param       無
 * @retval      無
 */
void freertos_demo(void)
{
    xTaskCreate(start_task, "start_task", START_TASK_STACK_SIZE, NULL, START_TASK_PRIO, &start_task_handler);
    vTaskStartScheduler();
}

void start_task( void * pvParameters )
{
	taskENTER_CRITICAL(); //進入臨界區
	xTaskCreate(task1, "task1", TASK1_STACK_SIZE, NULL, TASK1_PRIO, &task1_handler);
	xTaskCreate(task2, "task2", TASK2_STACK_SIZE, NULL, TASK2_PRIO, &task2_handler);
	xTaskCreate(task3, "task3", TASK3_STACK_SIZE, NULL, TASK3_PRIO, &task3_handler);
    vTaskDelete(NULL);
	taskEXIT_CRITICAL(); //退出臨界區
}

任務建立和刪除(靜態方法)

image-20240319192408822

程式碼

freertos_demo.c

/**
 ****************************************************************************************************
 * @file        freertos.c
 * @author      正點原子團隊(ALIENTEK)
 * @version     V1.4
 * @date        2022-01-04
 * @brief       FreeRTOS 移植實驗
 * @license     Copyright (c) 2020-2032, 廣州市星翼電子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 實驗平臺:正點原子 探索者F407開發板
 * 線上影片:www.yuanzige.com
 * 技術論壇:www.openedv.com
 * 公司網址:www.alientek.com
 * 購買地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#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_STACK_SIZE 	128
#define START_TASK_PRIO		1
TaskHandle_t start_task_handler;
StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb;

#define TASK1_STACK_SIZE 	128
#define TASK1_PRIO		2
TaskHandle_t task1_handler;
StackType_t task1_stack[TASK1_STACK_SIZE];
StaticTask_t task1_tcb;

#define TASK2_STACK_SIZE 	128
#define TASK2_PRIO		3
TaskHandle_t task2_handler;
StackType_t task2_stack[TASK2_STACK_SIZE];
StaticTask_t task2_tcb;

#define TASK3_STACK_SIZE 	128
#define TASK3_PRIO		4
TaskHandle_t task3_handler;
StackType_t task3_stack[TASK3_STACK_SIZE];
StaticTask_t task3_tcb;

void start_task( void * pvParameters );

void task1( void * pvParameters )
{
	while(1)
	{
		printf("task1正在執行!!!\r\n");
		LED0_TOGGLE();
		vTaskDelay(500);
	}
}

void task2( void * pvParameters )
{
	while(1)
	{
		printf("task2正在執行!!!\r\n");
		LED1_TOGGLE();
		vTaskDelay(500);
	}
}

void task3( void * pvParameters )
{
	uint8_t key = 0;
	while(1)
	{
		printf("task3正在執行!!!\r\n");
		key=key_scan(0);
		if(key == KEY0_PRES)
		{
			if(task1_handler!=NULL)
			{
				printf("刪除task1任務!!!\r\n");
				vTaskDelete(task1_handler);
				task1_handler=NULL;
			}
		}
		vTaskDelay(10);
	}
}

/* 空閒任務配置 */
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;
}
/******************************************************************************************************/

/**
 * @brief       FreeRTOS例程入口函式
 * @param       無
 * @retval      無
 */
void freertos_demo(void)
{
	start_task_handler = xTaskCreateStatic(start_task, "start_task", START_TASK_STACK_SIZE, NULL, START_TASK_PRIO, start_task_stack, &start_task_tcb);
    vTaskStartScheduler();
}

void start_task( void * pvParameters )
{
	taskENTER_CRITICAL(); //進入臨界區
	task1_handler = xTaskCreateStatic(task1, "task1", TASK1_STACK_SIZE, NULL, TASK1_PRIO, task1_stack, &task1_tcb);
    task2_handler = xTaskCreateStatic(task2, "task2", TASK2_STACK_SIZE, NULL, TASK2_PRIO, task2_stack, &task2_tcb);
    task3_handler = xTaskCreateStatic(task3, "task3", TASK3_STACK_SIZE, NULL, TASK3_PRIO, task3_stack, &task3_tcb);
	vTaskDelete(start_task_handler);
	taskEXIT_CRITICAL(); //退出臨界區
}

相關文章