***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);
}
}
代码中还有其它详细注释,注意看。