FreeRTOS的动态任务创建

***FreeRTOS分为“动态任务创建”和“静态任务创建”***两种任务创建方式。
任务创建时,会分配两块内存,一块用来存任务控制块,一块用来存任务堆栈。使用动态创建时系统会自动分配这些内存,使用静态创建时需要自己创建这两块内存。
任务的创建常用动态方法创建。

动态任务创建函数:xTaskCreate();

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
							const char * const pcName,
							const uint16_t usStackDepth,
							void * const pvParameters,
							UBaseType_t uxPriority,
							TaskHandle_t * const pxCreatedTask )

FreeRTOS动态任务创建:
任务创建步骤:

//1、大体构思任务框架;
//2、准备好任务创建函数:"xTaskCreate();"
//3、将任务创建函数"xTaskCreate()"里面的参数都准备好填进去,
//   任务参数就是:任务函数的函数名、任务名、堆栈、优先级、句柄;
//4、编写任务的具体函数,函数体内搞个大循环,剩下的就是具体的功能了;
//5、一切准备好后,开启任务调度器.

例如:
准备好任务创建函数:

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
							const char * const pcName,
							const uint16_t usStackDepth,
							void * const pvParameters,
							UBaseType_t uxPriority,
							TaskHandle_t * const pxCreatedTask )

为函数准备好所需参数:

//========================任务1相关========================
void Task1(void *pvParameters);     //任务函数声明
#define TASK1_SIZE     120          //任务堆栈大小
#define TASK1_PRIO     2            //任务优先级,注意,优先级“0”不能用,这个是空闲任务的优先级,
                                    //空闲任务在开启任务调度器中会自动创建
                                    //还有一个软件定时器任务,这个任务优先级是最高的31,这个也不能用
TaskHandle_t Task1_Handler;         //任务句柄

将任务参数代入后:

//创建任务1:
    xTaskCreate((TaskFunction_t)    Task1,             //任务函数名
				(const char *)      "Task1",           //任务名称(随便取)
				(uint16_t)          TASK1_SIZE,        //任务堆栈大小
				(void *)            NULL,              //任务参数,一般为空
				(UBaseType_t)       TASK1_PRIO,        //任务优先级
				(TaskHandle_t *)    &Task1_Handler);   //任务句柄

任务1的具体功能实现:

//**************************************************************
//                      具体任务函数
//函数名:Task1
//**************************************************************
void Task1(void *pvParameters)
{
	while(1)
    {
        LED0=~LED0;
        vTaskDelay(200);
    }
}

开启任务调度器:

vTaskStartScheduler();                                  //开启任务调度器

整体代码详解:

  • 创建一个任务,任务函数名称为:Task1();
  • 此任务功能为 LED0的闪烁;
    代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

//本例程大体结构:
//例程主要学习任务的动态创建,先是创建一个开始创建任务的任务,然后在这个任务里面又创建另外两个任务.
//任务创建的步骤:
//1、大体构思任务框架;
//2、准备好任务创建函数:"xTaskCreate();"
//3、将任务创建函数"xTaskCreate()"里面的参数都准备好填进去,
//   任务参数就是:任务函数的函数名、任务名、堆栈、优先级、句柄;
//4、编写任务的具体函数,函数体内搞个大循环,剩下的就是具体的功能了;
//5、一切准备好后,开启任务调度器.

//========================任务1相关========================
void Task1(void *pvParameters);     //任务函数声明
#define TASK1_SIZE     120          //任务堆栈大小
#define TASK1_PRIO     1            //任务优先级,注意,优先级“0”不能用,这个是空闲任务的优先级,
                                    //空闲任务在开启任务调度器中会自动创建
                                    //还有一个软件定时器任务,这个任务优先级是最高的31,这个也不能用
TaskHandle_t Task1_Handler;         //任务句柄


int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
    
    //创建任务1:
    xTaskCreate((TaskFunction_t)    Task1,             //任务函数名
				(const char *)      "Task1",           //任务名称(随便取)
				(uint16_t)          TASK1_SIZE,        //任务堆栈大小
				(void *)            NULL,              //任务参数,一般为空
				(UBaseType_t)       TASK1_PRIO,        //任务优先级
				(TaskHandle_t *)    &Task1_Handler);   //任务句柄
    
    vTaskStartScheduler();                                  //开启任务调度器
}



//**************************************************************
//                      具体任务函数
//函数名:Task1
//**************************************************************
void Task1(void *pvParameters)
{
	while(1)
    {
        LED0=~LED0;
        vTaskDelay(200);
    }
}



代码中还有其它详细注释,注意看。

猜你喜欢

转载自blog.csdn.net/anglebaby331/article/details/82935221