FreeRTOS静态创建任务要点:首先要开启宏,然后定义空闲任务函数和定时器函数,其它的和动态创建流程基本类似,代码如下:
/*FreeRTOS
静态情况下创建任务:
1.修改宏 configSUPPORT_STATIC_ALLOCATION=1
出现两个函数未定义:vApplicationGetIdleTaskMemory(); task.c 1839位置
vApplicationGetTimerTaskMemory();
2.编写测试代码
2.1创建开始任务框架
2.2 task1框架 task2框架
*/
//函数声明:
void start_task(void *a);
void task1(void *a);
void task2(void *a);
//开始任务
TaskHandle_t StartTask_Handler;//创建任务句柄
#define stacksize 128
#define task_prio 1
StackType_t start_task_BUf[stacksize];//任务堆栈大小
StaticTask_t startTaskTCB;//任务控制块
//任务1
TaskHandle_t Task_1_Handler;//创建任务句柄
#define Task_1_stacksize 128
#define Task_1_task_prio 2
StackType_t start_Task_1_BUf[stacksize];//任务堆栈大小
StaticTask_t start_Task_1_TaskTCB;//任务控制块
TaskHandle_t Task_1_Handler;//创建任务句柄
//任务2
TaskHandle_t Task_2_Handler;//创建任务句柄
#define Task_2_stacksize 128
#define Task_2_task_prio 3
StackType_t start_Task_2_BUf[stacksize];//任务堆栈大小
StaticTask_t start_Task_2_TaskTCB;//任务控制块
TaskHandle_t Task_2_Handler;//创建任务句柄
//空闲任务
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];//在FreeRTOSConfig.h 中
static StaticTask_t idleTCB;
//定时器任务
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];//在FreeRTOSConfig.h 中
static StaticTask_t TimerTCB;
//空闲任务所需内存
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer=&idleTCB;
*ppxIdleTaskStackBuffer=IdleTaskStack;
*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
//空闲任务所需内存
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer=&TimerTCB;
*ppxIdleTaskStackBuffer=TimerTaskStack;
*pulIdleTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}
//void vApplicationGetIdleTaskMemory();
/*静态宏定义也需要创建任务
此函数三个参数,任务buffer,任务堆栈数组,任务堆栈大小,
*/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口
LED_Init(); //初始化LED端口
LCD_Init(); //初始化LCD
StartTask_Handler=xTaskCreateStatic( (TaskFunction_t)start_task,
(const char* )"my test",
(uint16_t ) stacksize,
(void* ) NULL,
(UBaseType_t ) task_prio,
(StackType_t *)start_task_BUf,
(StaticTask_t * )&startTaskTCB );
vTaskStartScheduler(); //开启任务调度
}
void start_task(void *a)
{
taskENTER_CRITICAL();//进入任务临界区
//创建任务1
Task_1_Handler=xTaskCreateStatic( (TaskFunction_t)task1,
(const char* )"task1",
(uint16_t ) Task_1_stacksize,
(void* ) NULL,
(UBaseType_t ) Task_1_task_prio,
(StackType_t *)start_Task_1_BUf,
(StaticTask_t * )&start_Task_1_TaskTCB );
//创建任务2
Task_2_Handler=xTaskCreateStatic( (TaskFunction_t)task2,
(const char* )"task2",
(uint16_t ) Task_2_stacksize,
(void* ) NULL,
(UBaseType_t ) Task_2_task_prio,
(StackType_t *)start_Task_2_BUf,
(StaticTask_t * )&start_Task_2_TaskTCB );
vTaskDelete(StartTask_Handler);//删除开始任务,
/*必须将开始任务删除后才能运行,个人理解将其变成空闲任务
*/
taskEXIT_CRITICAL();
}
//任务1函数
void task1(void *a)
{
while(1)
{
LED0=~LED0;
vTaskDelay(1000);
printf("task1 running\r\n");
}
}
//任务2函数
void task2(void *a)
{
while(1)
{
LED1=~LED1;
vTaskDelay(1000);
printf("task2 running\r\n");
}
}