1、 静态任务创建
1.1、 需要创建2个函数
static StaticTask_t Idle_Task_TCB;
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
StackType_t **ppxIdleTaskStackBuffer,
uint32_t *pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer=&Idle_Task_TCB;
*ppxIdleTaskStackBuffer=Idle_Task_Stack;
*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
static StaticTask_t Timer_Task_TCB;
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
StackType_t **ppxTimerTaskStackBuffer,
uint32_t *pulTimerTaskStackSize)
{
*ppxTimerTaskTCBBuffer=&Timer_Task_TCB;
*ppxTimerTaskStackBuffer=Timer_Task_Stack;
*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}
1.2、 创建静态任务
#define LED15_TASK_STACK_SIZE 128
static StackType_t led16_task_stack[LED15_TASK_STACK_SIZE];
static StaticTask_t LED_Task_TCB;
static void task_led16_function (void * pvParameter)
{
uint32_t led16_temp=0;
(void)(pvParameter);
while (true)
{
TOGGLE_LED16();
led16_temp++;
vPortEnterCritical();
LOG_BLE("led16 %d\n",led16_temp);
vPortExitCritical();
vTaskDelay(500);
}
}
xTaskCreateStatic((TaskFunction_t )task_led16_function,
(const char* )"LED16",
(uint32_t )LED15_TASK_STACK_SIZE,
(void* )NULL,
(UBaseType_t )4,
(StackType_t* )led16_task_stack,
(StaticTask_t* )&LED_Task_TCB);
2、创建动态任务
2.1、创建动态任务
static void task_led13_function (void * pvParameter)
{
uint32_t led13_temp=0;
(void)(pvParameter);
while (true)
{
TOGGLE_LED13();
led13_temp++;
vPortEnterCritical();
LOG_BLE("led13 %d\n",led13_temp);
vPortExitCritical();
vTaskDelay(1000);
}
}
xTaskCreate(task_led13_function, "LED13", configMINIMAL_STACK_SIZE + 200, NULL, 2, &tasl_led13_handle);
3、总结
3.1、 静态创建任务需要全局的堆栈和全局的任务控制块,而动态创建任务通过自己申请内存作为堆栈和任务控制块。
3.2、 静态创建任务和动态创建任务的核心都是下面的两个函数:
prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL );/*初始化任务控制块和堆栈*/
prvAddNewTaskToReadyList( pxNewTCB );/* 添加到就绪列表中*/
3.3、 创建任务优先级不能比configMAX_PRIORITIES大。
//可使用的最大优先级
#define configMAX_PRIORITIES ( 32 )