使用静态创建函数的方式要在FreeRTOSConfig.h中配置允许创建静态函数
#define configSUPPORT_STATIC_ALLOCATION 1 // 支持静态的方式申请内存
在FreeRTOS中创建静态任务使用xTaskCreateStatic()
注:不同参数的含义
- 第一个参数表示【操作的函数】
- 第二个参数【任务的名称】
- 第三个参数【任务堆栈大小】
- 第四个参数表示【传递给任务参数处理的值】
- 第五个参数表示【处理任务的优先级】
- 第六个参数【任务堆栈的大小】
- 第七个参数【函数的任务控制块(也就是任务的句柄---->用于接收函数返回来的值))】
配置函数的参数
空闲任务堆栈的优先级等
创建空闲的任务函数(不创建这个的话任务会报错)
创建开始任务函数,在开始任务中创建任务1,并删除开始任务
注:任务的删除要在一个空闲的任务中进行(在执行中的任务是不能进行删除操作的)
实现任务1函数验证创建效果
具体代码如下所示(实现led灯的闪烁)
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "freeRTOS.h"
#include "task.h"
#include "LED.h"
//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务堆栈
StackType_t StartTaskStack[START_STK_SIZE];
//任务控制块
StaticTask_t StartTaskTCB;
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define TASK1_TASK_PRIO 2
//任务堆栈大小
#define TASK1_STK_SIZE 128
//任务堆栈
StackType_t Task1TaskStack[TASK1_STK_SIZE];
//任务控制块
StaticTask_t Task1TaskTCB;
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer=&IdleTaskTCB;
*ppxIdleTaskStackBuffer=IdleTaskStack;
*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
int main(void){
//创建开始任务
StartTask_Handler=xTaskCreateStatic((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint32_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(StackType_t* )StartTaskStack, //任务堆栈
(StaticTask_t* )&StartTaskTCB); //任务控制块
vTaskStartScheduler();
while(1){
}
return 0;
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
//创建TASK1任务
Task1Task_Handler=xTaskCreateStatic((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint32_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(StackType_t* )Task1TaskStack,
(StaticTask_t* )&Task1TaskTCB);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
void task1_task(void *pvParameters){
LED_Init();
while(1){
LED1_ON();
vTaskDelay(100);
LED1_OFF();
vTaskDelay(100);
}
}