一、静态任务使用步骤
(1)打开configSUPPORT_STATIC_ALLOCATION支持静态内存的宏
(2)使用xTaskCreateStatic函数创建静态任务
(3)实现vApplicationGetIdleTaskMemory函数获取空闲任务的信息
二、静态任务代码示例
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
void vAppInitTask(void* pParam);
TaskHandle_t appHandler;
StackType_t appTask[128];
StaticTask_t appTCB;
void vLedTask(void* pParam);
TaskHandle_t ledHandler;
StackType_t ledTask[128];
StaticTask_t ledTCB;
StaticTask_t IdleTCB;
StackType_t IdleTask[128];
//主函数
int main(void)
{
//初始化硬件
led_init();
//创建app任务
appHandler = xTaskCreateStatic(vAppInitTask, //任务函数
"appTask", //任务名称
128, //任务堆栈大小
NULL, //传递给任务函数的参数
2, //任务优先级
appTask, //任务堆栈起始地址
&appTCB //任务控制块
);
if(NULL != appHandler){
vTaskStartScheduler();//启动任务调度器
}
while(1);
}
//APP任务
void vAppInitTask(void* pParam)//APP初始化任务创建led任务
{
taskENTER_CRITICAL();//进入临界区
ledHandler = xTaskCreateStatic(vLedTask, //任务函数
"ledTask", //任务名称
128, //任务堆栈大小
NULL, //传递给任务函数的参数
2, //任务优先级
ledTask, //任务堆栈起始地址
&ledTCB //任务控制块
);
if(ledHandler != NULL){//创建成功
}
vTaskDelete(appHandler);//删除任务
taskEXIT_CRITICAL();//退出临界区
}
//led任务
void vLedTask(void* pParam)
{
while(1){
open();
vTaskDelay(1000);
close();
vTaskDelay(1000);
}
}
//获取空闲任务信息
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize ){
*ppxIdleTaskTCBBuffer = &IdleTCB;
*ppxIdleTaskStackBuffer = IdleTask;
*pulIdleTaskStackSize = 128;
}
三、动态任务使用步骤
(1)打开configSUPPORT_DYNAMIC_ALLOCATION宏支持动态内存申请
(2)设置configTOTAL_HEAP_SIZE宏总的堆内存大小
(3)使用xTaskCreate函数创建动态任务
四、动态任务代码示例
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
void vAppInitTask(void* pParam);
void vLedTask(void* pParam);
TaskHandle_t ledHandler;
TaskHandle_t appHandler;
//主函数
int main(void)
{
//初始化硬件
led_init();
BaseType_t xReturn;
xReturn = xTaskCreate(vAppInitTask, //任务函数入口
"vAppInitTask", //任务名称
512, //任务堆栈大小
NULL, //传递参数
2, //任务优先级
&appHandler //任务句柄
);
if(pdPASS == xReturn){
vTaskStartScheduler(); //开启任务调度器
}
while(1);
}
//APP任务
void vAppInitTask(void* pParam)//APP初始化任务创建led任务
{
taskENTER_CRITICAL();//进入临界区
xTaskCreate(vLedTask, //任务函数入口
"vLedTask", //任务名称
512, //任务堆栈大小
NULL, //传递参数
2, //任务优先级
&ledHandler //任务句柄
);
vTaskDelete(appHandler);
taskEXIT_CRITICAL();//退出临界区
}
//led任务
void vLedTask(void* pParam)
{
while(1){
open();
vTaskDelay(1000);
close();
vTaskDelay(1000);
}
}