关于任务创建有3个函数
1.动态创建一个任务。可以自动分配任务堆栈和TCB。FreeRTOSConfig.h中,需要定义
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,//函数指针,入口地址
const char * const pcName,//函数名字,自己取
const uint16_t usStackDepth,//堆栈大小,最后实际大小要*4
void * const pvParameters,//参数
UBaseType_t uxPriority,//优先级,值越大,优先级越高
TaskHandle_t * const pxCreatedTask )// 任务句柄
返回值:任务创建成功pdPASS;errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY任务创建失败
2.静态创建一个任务。需要手动分配堆栈大小和任务控制块(TCB),像ucos一样。
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,//堆栈指针,如在前面定义StackType_t TaskSTK[256];
StaticTask_t * const pxTaskBuffer )//任务控制块指针,如定义StaticTask_t TaskTCB;
返回值:类型为TaskHandle_t,说明是任务句柄。
需要自己定义这2个任务的堆栈和TCB
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];//空闲任务任务堆栈
static StaticTask_t IdleTaskTCB;//空闲任务控制块
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];//定时器服务任务堆栈
static StaticTask_t TimerTaskTCB;//定时器服务任务控制块
同时还需要对两个函数进行定义:
//获取空闲任务的堆栈和TCB地址
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, //二级TCB指针
StackType_t **ppxIdleTaskStackBuffer, //二级堆栈指针
uint32_t *pulIdleTaskStackSize)//堆栈大小
{ *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
*ppxIdleTaskStackBuffer=IdleTaskStack;
*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;}
//获取定时器的堆栈和TCB地址
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, //同上
StackType_t **ppxTimerTaskStackBuffer, //同上
uint32_t *pulTimerTaskStackSize)//同上
{ *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
*ppxTimerTaskStackBuffer=TimerTaskStack;
*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;}
3.创建一个有MPU(内存保护单元)的任务。其他功能和xTaskCreate创建的任务一样
BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )
TaskParameters_t 类型如下:
typedef struct xTASK_PARAMETERS
{
TaskFunction_t pvTaskCode;
const char * const pcName; //名字
uint16_t usStackDepth;//堆栈大小
void *pvParameters;//参数
UBaseType_t uxPriority;//优先级
StackType_t *puxStackBuffer;//堆栈指针
MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ];
} TaskParameters_t;
typedef struct xMEMORY_REGION
{
void *pvBaseAddress;//基地址
uint32_t ulLengthInBytes;//大小
uint32_t ulParameters;//参数,这个是什么参数,溢出参数吗
} MemoryRegion_t;
TaskHandle_t 任务句柄类型。
删除一个任务:
void vTaskDelete( TaskHandle_t xTaskToDelete ),会释放掉堆栈和控制块,该任务就相当于不存在了。
真正删除任务是在空闲任务中,所以会有些延迟。